/ Hex Artifact Content
Login

Artifact daf07d8defce3311f9e69f1280a874d78bc1d16c305f6aa689640f7afa02842f:


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 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 73 2f 25 64 2f 25 70 3a 20 22 2c 28 53 29  "%s/%d/%p: ",(S)
02c0: 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28 50 29 2d 3e  ->zSelName,(P)->
02d0: 69 53 65 6c 65 63 74 49 64 2c 28 53 29 29 2c 5c  iSelectId,(S)),\
02e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
02f0: 67 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a  gPrintf X.#else.
0300: 23 20 64 65 66 69 6e 65 20 53 45 4c 45 43 54 54  # define SELECTT
0310: 52 41 43 45 28 4b 2c 50 2c 53 2c 58 29 0a 23 65  RACE(K,P,S,X).#e
0320: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  ndif.../*.** An 
0330: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
0340: 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74  following object
0350: 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f   is used to reco
0360: 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  rd information a
0370: 62 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70  bout.** how to p
0380: 72 6f 63 65 73 73 20 74 68 65 20 44 49 53 54 49  rocess the DISTI
0390: 4e 43 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20  NCT keyword, to 
03a0: 73 69 6d 70 6c 69 66 79 20 70 61 73 73 69 6e 67  simplify passing
03b0: 20 74 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f   that informatio
03c0: 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65  n.** into the se
03d0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20  lectInnerLoop() 
03e0: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65  routine..*/.type
03f0: 64 65 66 20 73 74 72 75 63 74 20 44 69 73 74 69  def struct Disti
0400: 6e 63 74 43 74 78 20 44 69 73 74 69 6e 63 74 43  nctCtx DistinctC
0410: 74 78 3b 0a 73 74 72 75 63 74 20 44 69 73 74 69  tx;.struct Disti
0420: 6e 63 74 43 74 78 20 7b 0a 20 20 75 38 20 69 73  nctCtx {.  u8 is
0430: 54 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  Tnct;      /* Tr
0440: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
0450: 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  CT keyword is pr
0460: 65 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54  esent */.  u8 eT
0470: 6e 63 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e  nctType;   /* On
0480: 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44  e of the WHERE_D
0490: 49 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74  ISTINCT_* operat
04a0: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62  ors */.  int tab
04b0: 54 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70 68 65  Tnct;    /* Ephe
04c0: 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64  meral table used
04d0: 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72   for DISTINCT pr
04e0: 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e  ocessing */.  in
04f0: 74 20 61 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a  t addrTnct;   /*
0500: 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
0510: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70 63  penEphemeral opc
0520: 6f 64 65 20 66 6f 72 20 74 61 62 54 6e 63 74 20  ode for tabTnct 
0530: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
0540: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
0550: 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74  following object
0560: 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f   is used to reco
0570: 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  rd information a
0580: 62 6f 75 74 0a 2a 2a 20 74 68 65 20 4f 52 44 45  bout.** the ORDE
0590: 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42  R BY (or GROUP B
05a0: 59 29 20 63 6c 61 75 73 65 20 6f 66 20 71 75 65  Y) clause of que
05b0: 72 79 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65  ry is being code
05c0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 44 65  d..**.** The aDe
05d0: 66 65 72 5b 5d 20 61 72 72 61 79 20 69 73 20 75  fer[] array is u
05e0: 73 65 64 20 62 79 20 74 68 65 20 73 6f 72 74 65  sed by the sorte
05f0: 72 2d 72 65 66 65 72 65 6e 63 65 73 20 6f 70 74  r-references opt
0600: 69 6d 69 7a 61 74 69 6f 6e 2e 20 46 6f 72 0a 2a  imization. For.*
0610: 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  * example, assum
0620: 69 6e 67 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ing there is no 
0630: 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e 20 62  index that can b
0640: 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 4f  e used for the O
0650: 52 44 45 52 20 42 59 2c 0a 2a 2a 20 66 6f 72 20  RDER BY,.** for 
0660: 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  the query:.**.**
0670: 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62       SELECT a, b
0680: 69 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31 20 4f  igblob FROM t1 O
0690: 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20  RDER BY a LIMIT 
06a0: 31 30 3b 0a 2a 2a 0a 2a 2a 20 69 74 20 6d 61 79  10;.**.** it may
06b0: 20 62 65 20 6d 6f 72 65 20 65 66 66 69 63 69 65   be more efficie
06c0: 6e 74 20 74 6f 20 61 64 64 20 6a 75 73 74 20 74  nt to add just t
06d0: 68 65 20 22 61 22 20 76 61 6c 75 65 73 20 74 6f  he "a" values to
06e0: 20 74 68 65 20 73 6f 72 74 65 72 2c 20 61 6e 64   the sorter, and
06f0: 0a 2a 2a 20 72 65 74 72 69 65 76 65 20 74 68 65  .** retrieve the
0700: 20 61 73 73 6f 63 69 61 74 65 64 20 22 62 69 67   associated "big
0710: 62 6c 6f 62 22 20 76 61 6c 75 65 73 20 64 69 72  blob" values dir
0720: 65 63 74 6c 79 20 66 72 6f 6d 20 74 61 62 6c 65  ectly from table
0730: 20 74 31 20 61 73 20 74 68 65 0a 2a 2a 20 31 30   t1 as the.** 10
0740: 20 73 6d 61 6c 6c 65 73 74 20 22 61 22 20 76 61   smallest "a" va
0750: 6c 75 65 73 20 61 72 65 20 65 78 74 72 61 63 74  lues are extract
0760: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74  ed from the sort
0770: 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  er..**.** When t
0780: 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65  he sorter-refere
0790: 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  nce optimization
07a0: 20 69 73 20 75 73 65 64 2c 20 74 68 65 72 65 20   is used, there 
07b0: 69 73 20 6f 6e 65 20 65 6e 74 72 79 20 69 6e 20  is one entry in 
07c0: 74 68 65 0a 2a 2a 20 61 44 65 66 65 72 5b 5d 20  the.** aDefer[] 
07d0: 61 72 72 61 79 20 66 6f 72 20 65 61 63 68 20 64  array for each d
07e0: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 74 68  atabase table th
07f0: 61 74 20 6d 61 79 20 62 65 20 72 65 61 64 20 61  at may be read a
0800: 73 20 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20  s values are.** 
0810: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
0820: 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74 79  he sorter..*/.ty
0830: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 6f 72  pedef struct Sor
0840: 74 43 74 78 20 53 6f 72 74 43 74 78 3b 0a 73 74  tCtx SortCtx;.st
0850: 72 75 63 74 20 53 6f 72 74 43 74 78 20 7b 0a 20  ruct SortCtx {. 
0860: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
0870: 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52  rBy;   /* The OR
0880: 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50  DER BY (or GROUP
0890: 20 42 59 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20   BY clause) */. 
08a0: 20 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20 20 20   int nOBSat;    
08b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
08c0: 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72   of ORDER BY ter
08d0: 6d 73 20 73 61 74 69 73 66 69 65 64 20 62 79 20  ms satisfied by 
08e0: 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74  indices */.  int
08f0: 20 69 45 43 75 72 73 6f 72 3b 20 20 20 20 20 20   iECursor;      
0900: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
0910: 62 65 72 20 66 6f 72 20 74 68 65 20 73 6f 72 74  ber for the sort
0920: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  er */.  int regR
0930: 65 74 75 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a  eturn;        /*
0940: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
0950: 67 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72  g block-output r
0960: 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 2a 2f  eturn address */
0970: 0a 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75  .  int labelBkOu
0980: 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72  t;       /* Star
0990: 74 20 6c 61 62 65 6c 20 66 6f 72 20 74 68 65 20  t label for the 
09a0: 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73 75 62  block-output sub
09b0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
09c0: 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20   addrSortIndex; 
09d0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
09e0: 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70   the OP_SorterOp
09f0: 65 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68  en or OP_OpenEph
0a00: 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  emeral */.  int 
0a10: 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20  labelDone;      
0a20: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77    /* Jump here w
0a30: 68 65 6e 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49  hen done, ex: LI
0a40: 4d 49 54 20 72 65 61 63 68 65 64 20 2a 2f 0a 20  MIT reached */. 
0a50: 20 75 38 20 73 6f 72 74 46 6c 61 67 73 3b 20 20   u8 sortFlags;  
0a60: 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f         /* Zero o
0a70: 72 20 6d 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f  r more SORTFLAG_
0a80: 2a 20 62 69 74 73 20 2a 2f 0a 20 20 75 38 20 62  * bits */.  u8 b
0a90: 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70  OrderedInnerLoop
0aa0: 3b 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 63 6f  ; /* ORDER BY co
0ab0: 72 72 65 63 74 6c 79 20 73 6f 72 74 73 20 74 68  rrectly sorts th
0ac0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  e inner loop */.
0ad0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
0ae0: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
0af0: 52 45 4e 43 45 53 0a 20 20 75 38 20 6e 44 65 66  RENCES.  u8 nDef
0b00: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  er;            /
0b10: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  * Number of vali
0b20: 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61 44 65  d entries in aDe
0b30: 66 65 72 5b 5d 20 2a 2f 0a 20 20 73 74 72 75 63  fer[] */.  struc
0b40: 74 20 44 65 66 65 72 72 65 64 43 73 72 20 7b 0a  t DeferredCsr {.
0b50: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
0b60: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
0b70: 20 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f 0a 20   definition */. 
0b80: 20 20 20 69 6e 74 20 69 43 73 72 3b 20 20 20 20     int iCsr;    
0b90: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
0ba0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c   number for tabl
0bb0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65  e */.    int nKe
0bc0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
0bd0: 4e 75 6d 62 65 72 20 6f 66 20 50 4b 20 63 6f 6c  Number of PK col
0be0: 75 6d 6e 73 20 66 6f 72 20 74 61 62 6c 65 20 70  umns for table p
0bf0: 54 61 62 20 28 3e 3d 31 29 20 2a 2f 0a 20 20 7d  Tab (>=1) */.  }
0c00: 20 61 44 65 66 65 72 5b 34 5d 3b 0a 23 65 6e 64   aDefer[4];.#end
0c10: 69 66 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 53 4f  if.};.#define SO
0c20: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
0c30: 20 20 30 78 30 31 20 20 20 2f 2a 20 55 73 65 20    0x01   /* Use 
0c40: 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 65  SorterOpen inste
0c50: 61 64 20 6f 66 20 4f 70 65 6e 45 70 68 65 6d 65  ad of OpenEpheme
0c60: 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65  ral */../*.** De
0c70: 6c 65 74 65 20 61 6c 6c 20 74 68 65 20 63 6f 6e  lete all the con
0c80: 74 65 6e 74 20 6f 66 20 61 20 53 65 6c 65 63 74  tent of a Select
0c90: 20 73 74 72 75 63 74 75 72 65 2e 20 20 44 65 61   structure.  Dea
0ca0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 74 72 75  llocate the stru
0cb0: 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20  cture.** itself 
0cc0: 6f 6e 6c 79 20 69 66 20 62 46 72 65 65 20 69 73  only if bFree is
0cd0: 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
0ce0: 20 76 6f 69 64 20 63 6c 65 61 72 53 65 6c 65 63   void clearSelec
0cf0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  t(sqlite3 *db, S
0d00: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 62 46  elect *p, int bF
0d10: 72 65 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  ree){.  while( p
0d20: 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   ){.    Select *
0d30: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
0d40: 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  or;.    sqlite3E
0d50: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
0d60: 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
0d70: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
0d80: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53  Delete(db, p->pS
0d90: 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rc);.    sqlite3
0da0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
0db0: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73  ->pWhere);.    s
0dc0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
0dd0: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47 72 6f  lete(db, p->pGro
0de0: 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  upBy);.    sqlit
0df0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0e00: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0e10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0e20: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
0e30: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71  OrderBy);.    sq
0e40: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0e50: 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
0e60: 20 20 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c      if( OK_IF_AL
0e70: 57 41 59 53 5f 54 52 55 45 28 70 2d 3e 70 57 69  WAYS_TRUE(p->pWi
0e80: 74 68 29 20 29 20 73 71 6c 69 74 65 33 57 69 74  th) ) sqlite3Wit
0e90: 68 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  hDelete(db, p->p
0ea0: 57 69 74 68 29 3b 0a 20 20 20 20 69 66 28 20 62  With);.    if( b
0eb0: 46 72 65 65 20 29 20 73 71 6c 69 74 65 33 44 62  Free ) sqlite3Db
0ec0: 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20  FreeNN(db, p);. 
0ed0: 20 20 20 70 20 3d 20 70 50 72 69 6f 72 3b 0a 20     p = pPrior;. 
0ee0: 20 20 20 62 46 72 65 65 20 3d 20 31 3b 0a 20 20     bFree = 1;.  
0ef0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  }.}../*.** Initi
0f00: 61 6c 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65  alize a SelectDe
0f10: 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  st structure..*/
0f20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
0f30: 65 63 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65  ectDestInit(Sele
0f40: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69  ctDest *pDest, i
0f50: 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50  nt eDest, int iP
0f60: 61 72 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65  arm){.  pDest->e
0f70: 44 65 73 74 20 3d 20 28 75 38 29 65 44 65 73 74  Dest = (u8)eDest
0f80: 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ;.  pDest->iSDPa
0f90: 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20 70 44  rm = iParm;.  pD
0fa0: 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 20 3d 20  est->zAffSdst = 
0fb0: 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73  0;.  pDest->iSds
0fc0: 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e  t = 0;.  pDest->
0fd0: 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f  nSdst = 0;.}.../
0fe0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
0ff0: 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75 63  new Select struc
1000: 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20  ture and return 
1010: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61  a pointer to tha
1020: 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a  t.** structure..
1030: 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  */.Select *sqlit
1040: 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 50  e3SelectNew(.  P
1050: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1060: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1070: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
1080: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
1090: 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75     /* which colu
10a0: 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69  mns to include i
10b0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  n the result */.
10c0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
10d0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46          /* the F
10e0: 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68  ROM clause -- wh
10f0: 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63  ich tables to sc
1100: 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  an */.  Expr *pW
1110: 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  here,         /*
1120: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1130: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
1140: 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20  *pGroupBy,   /* 
1150: 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  the GROUP BY cla
1160: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  use */.  Expr *p
1170: 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f  Having,        /
1180: 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61  * the HAVING cla
1190: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
11a0: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
11b0: 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
11c0: 6c 61 75 73 65 20 2a 2f 0a 20 20 75 33 32 20 73  lause */.  u32 s
11d0: 65 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  elFlags,        
11e0: 20 2f 2a 20 46 6c 61 67 20 70 61 72 61 6d 65 74   /* Flag paramet
11f0: 65 72 73 2c 20 73 75 63 68 20 61 73 20 53 46 5f  ers, such as SF_
1200: 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45 78  Distinct */.  Ex
1210: 70 72 20 2a 70 4c 69 6d 69 74 20 20 20 20 20 20  pr *pLimit      
1220: 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c      /* LIMIT val
1230: 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20  ue.  NULL means 
1240: 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20  not used */.){. 
1250: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
1260: 20 53 65 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b   Select standin;
1270: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
1280: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70  3DbMallocRawNN(p
1290: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
12a0: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
12b0: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
12c0: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
12d0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
12e0: 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  d );.    pNew = 
12f0: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20  &standin;.  }.  
1300: 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b  if( pEList==0 ){
1310: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71  .    pEList = sq
1320: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
1330: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 0a 20  end(pParse, 0,. 
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1360: 20 20 73 71 6c 69 74 65 33 45 78 70 72 28 70 50    sqlite3Expr(pP
1370: 61 72 73 65 2d 3e 64 62 2c 54 4b 5f 41 53 54 45  arse->db,TK_ASTE
1380: 52 49 53 4b 2c 30 29 29 3b 0a 20 20 7d 0a 20 20  RISK,0));.  }.  
1390: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70  pNew->pEList = p
13a0: 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f  EList;.  pNew->o
13b0: 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
13c0: 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20   pNew->selFlags 
13d0: 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e  = selFlags;.  pN
13e0: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->iLimit = 0;.
13f0: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
1400: 3d 20 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  = 0;.#if SELECTT
1410: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70  RACE_ENABLED.  p
1420: 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 5b 30 5d  New->zSelName[0]
1430: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70   = 0;.#endif.  p
1440: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
1450: 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[0] = -1;.  pNe
1460: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
1470: 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  1] = -1;.  pNew-
1480: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b  >nSelectRow = 0;
1490: 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29  .  if( pSrc==0 )
14a0: 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 44   pSrc = sqlite3D
14b0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
14c0: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
14d0: 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  pSrc));.  pNew->
14e0: 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70  pSrc = pSrc;.  p
14f0: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  New->pWhere = pW
1500: 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  here;.  pNew->pG
1510: 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
1520: 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  y;.  pNew->pHavi
1530: 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20  ng = pHaving;.  
1540: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
1550: 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65   pOrderBy;.  pNe
1560: 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  w->pPrior = 0;. 
1570: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30   pNew->pNext = 0
1580: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
1590: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65   = pLimit;.  pNe
15a0: 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20  w->pWith = 0;.  
15b0: 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
15c0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b  mallocFailed ) {
15d0: 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74  .    clearSelect
15e0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65  (pParse->db, pNe
15f0: 77 2c 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69  w, pNew!=&standi
1600: 6e 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  n);.    pNew = 0
1610: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1620: 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72  ssert( pNew->pSr
1630: 63 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  c!=0 || pParse->
1640: 6e 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20  nErr>0 );.  }.  
1650: 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73  assert( pNew!=&s
1660: 74 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75  tandin );.  retu
1670: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20  rn pNew;.}..#if 
1680: 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
1690: 4c 45 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  LED./*.** Set th
16a0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 53 65 6c 65  e name of a Sele
16b0: 63 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69  ct object.*/.voi
16c0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53  d sqlite3SelectS
16d0: 65 74 4e 61 6d 65 28 53 65 6c 65 63 74 20 2a 70  etName(Select *p
16e0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
16f0: 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 20 26 26  ame){.  if( p &&
1700: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71   zName ){.    sq
1710: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
1720: 69 7a 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d  izeof(p->zSelNam
1730: 65 29 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c  e), p->zSelName,
1740: 20 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20   "%s", zName);. 
1750: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
1760: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67  .** Delete the g
1770: 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75  iven Select stru
1780: 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66  cture and all of
1790: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
17a0: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
17b0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
17c0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c  sqlite3 *db, Sel
17d0: 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 4f  ect *p){.  if( O
17e0: 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45  K_IF_ALWAYS_TRUE
17f0: 28 70 29 20 29 20 63 6c 65 61 72 53 65 6c 65 63  (p) ) clearSelec
1800: 74 28 64 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a 0a  t(db, p, 1);.}..
1810: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
1820: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69  ointer to the ri
1830: 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  ght-most SELECT 
1840: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 61 20 63  statement in a c
1850: 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  ompound..*/.stat
1860: 69 63 20 53 65 6c 65 63 74 20 2a 66 69 6e 64 52  ic Select *findR
1870: 69 67 68 74 6d 6f 73 74 28 53 65 6c 65 63 74 20  ightmost(Select 
1880: 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d  *p){.  while( p-
1890: 3e 70 4e 65 78 74 20 29 20 70 20 3d 20 70 2d 3e  >pNext ) p = p->
18a0: 70 4e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20  pNext;.  return 
18b0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  p;.}../*.** Give
18c0: 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66  n 1 to 3 identif
18d0: 69 65 72 73 20 70 72 65 63 65 64 69 6e 67 20 74  iers preceding t
18e0: 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c  he JOIN keyword,
18f0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a   determine the.*
1900: 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20  * type of join. 
1910: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
1920: 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  er constant that
1930: 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20   expresses that 
1940: 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73  type.** in terms
1950: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1960: 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a  g bit values:.**
1970: 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52  .**     JT_INNER
1980: 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53  .**     JT_CROSS
1990: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52  .**     JT_OUTER
19a0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52  .**     JT_NATUR
19b0: 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46  AL.**     JT_LEF
19c0: 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48  T.**     JT_RIGH
19d0: 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f  T.**.** A full o
19e0: 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65  uter join is the
19f0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
1a00: 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52  JT_LEFT and JT_R
1a10: 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  IGHT..**.** If a
1a20: 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73  n illegal or uns
1a30: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
1a40: 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e  pe is seen, then
1a50: 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a   still return.**
1a60: 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75   a join type, bu
1a70: 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69  t put an error i
1a80: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
1a90: 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
1aa0: 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50  qlite3JoinType(P
1ab0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
1ac0: 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a  ken *pA, Token *
1ad0: 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a  pB, Token *pC){.
1ae0: 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d    int jointype =
1af0: 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41   0;.  Token *apA
1b00: 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a  ll[3];.  Token *
1b10: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p;.             
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b30: 2f 2a 20 20 20 30 31 32 33 34 35 36 37 38 39 20  /*   0123456789 
1b40: 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36  123456789 123456
1b50: 37 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61  789 123 */.  sta
1b60: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
1b70: 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74  KeyText[] = "nat
1b80: 75 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74  uraleftouteright
1b90: 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b  fullinnercross";
1ba0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1bb0: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20  struct {.    u8 
1bc0: 69 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67  i;        /* Beg
1bd0: 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72  inning of keywor
1be0: 64 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65  d text in zKeyTe
1bf0: 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e  xt[] */.    u8 n
1c00: 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67  Char;    /* Leng
1c10: 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72  th of the keywor
1c20: 64 20 69 6e 20 63 68 61 72 61 63 74 65 72 73 20  d in characters 
1c30: 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20  */.    u8 code; 
1c40: 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65      /* Join type
1c50: 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65   mask */.  } aKe
1c60: 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  yword[] = {.    
1c70: 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20  /* natural */ { 
1c80: 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41  0,  7, JT_NATURA
1c90: 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L               
1ca0: 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20   },.    /* left 
1cb0: 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a     */ { 6,  4, J
1cc0: 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20  T_LEFT|JT_OUTER 
1cd0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1ce0: 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20  /* outer   */ { 
1cf0: 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20  10, 5, JT_OUTER 
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74   },.    /* right
1d20: 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a     */ { 14, 5, J
1d30: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
1d40: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1d50: 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20  /* full    */ { 
1d60: 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a  19, 4, JT_LEFT|J
1d70: 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52  T_RIGHT|JT_OUTER
1d80: 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72   },.    /* inner
1d90: 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a     */ { 23, 5, J
1da0: 54 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20  T_INNER         
1db0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1dc0: 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20  /* cross   */ { 
1dd0: 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c  28, 5, JT_INNER|
1de0: 4a 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20  JT_CROSS        
1df0: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
1e00: 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20  , j;.  apAll[0] 
1e10: 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d  = pA;.  apAll[1]
1e20: 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32   = pB;.  apAll[2
1e30: 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d  ] = pC;.  for(i=
1e40: 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b  0; i<3 && apAll[
1e50: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  i]; i++){.    p 
1e60: 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20  = apAll[i];.    
1e70: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79  for(j=0; j<Array
1e80: 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20  Size(aKeyword); 
1e90: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
1ea0: 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a  p->n==aKeyword[j
1eb0: 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20  ].nChar .       
1ec0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
1ed0: 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e  NICmp((char*)p->
1ee0: 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65  z, &zKeyText[aKe
1ef0: 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e  yword[j].i], p->
1f00: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  n)==0 ){.       
1f10: 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65   jointype |= aKe
1f20: 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20  yword[j].code;. 
1f30: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1f40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1f50: 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c  testcase( j==0 |
1f60: 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c  | j==1 || j==2 |
1f70: 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c  | j==3 || j==4 |
1f80: 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29  | j==5 || j==6 )
1f90: 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72  ;.    if( j>=Arr
1fa0: 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29  aySize(aKeyword)
1fb0: 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   ){.      jointy
1fc0: 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a  pe |= JT_ERROR;.
1fd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fe0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20   }.  }.  if(.   
1ff0: 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a    (jointype & (J
2000: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52  T_INNER|JT_OUTER
2010: 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  ))==(JT_INNER|JT
2020: 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20  _OUTER) ||.     
2030: 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45  (jointype & JT_E
2040: 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20  RROR)!=0.  ){.  
2050: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
2060: 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73  p = " ";.    ass
2070: 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20  ert( pB!=0 );.  
2080: 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a    if( pC==0 ){ z
2090: 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69  Sp++; }.    sqli
20a0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
20b0: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20  se, "unknown or 
20c0: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
20d0: 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20   type: ".       
20e0: 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c  "%T %T%s%T", pA,
20f0: 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20   pB, zSp, pC);. 
2100: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
2110: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20  _INNER;.  }else 
2120: 69 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20  if( (jointype & 
2130: 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20  JT_OUTER)!=0 .  
2140: 20 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74         && (joint
2150: 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  ype & (JT_LEFT|J
2160: 54 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45  T_RIGHT))!=JT_LE
2170: 46 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  FT ){.    sqlite
2180: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2190: 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54 20  , .      "RIGHT 
21a0: 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a  and FULL OUTER J
21b0: 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72  OINs are not cur
21c0: 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64  rently supported
21d0: 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65  ");.    jointype
21e0: 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d   = JT_INNER;.  }
21f0: 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79  .  return jointy
2200: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  pe;.}../*.** Ret
2210: 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
2220: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74   a column in a t
2230: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31  able.  Return -1
2240: 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a   if the column.*
2250: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  * is not contain
2260: 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ed in the table.
2270: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2280: 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65  olumnIndex(Table
2290: 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68   *pTab, const ch
22a0: 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74  ar *zCol){.  int
22b0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
22c0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
22d0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
22e0: 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e  e3StrICmp(pTab->
22f0: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  aCol[i].zName, z
2300: 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Col)==0 ) return
2310: 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
2320: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   -1;.}../*.** Se
2330: 61 72 63 68 20 74 68 65 20 66 69 72 73 74 20 4e  arch the first N
2340: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c   tables in pSrc,
2350: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
2360: 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ght, looking for
2370: 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74   a.** table that
2380: 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61   has a column na
2390: 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a  med zCol.  .**.*
23a0: 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65  * When found, se
23b0: 74 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69  t *piTab and *pi
23c0: 43 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65  Col to the table
23d0: 20 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d   index and colum
23e0: 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68  n index.** of th
23f0: 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  e matching colum
2400: 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55  n and return TRU
2410: 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20  E..**.** If not 
2420: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41  found, return FA
2430: 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LSE..*/.static i
2440: 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  nt tableAndColum
2450: 6e 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73  nIndex(.  SrcLis
2460: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f  t *pSrc,       /
2470: 2a 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65  * Array of table
2480: 73 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  s to search */. 
2490: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
24a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
24b0: 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72  of tables in pSr
24c0: 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68  c->a[] to search
24d0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
24e0: 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61   *zCol,    /* Na
24f0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
2500: 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20   we are looking 
2510: 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  for */.  int *pi
2520: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Tab,          /*
2530: 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20   Write index of 
2540: 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a  pSrc->a[] here *
2550: 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20  /.  int *piCol  
2560: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2570: 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d  e index of pSrc-
2580: 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d  >a[*piTab].pTab-
2590: 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a  >aCol[] here */.
25a0: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
25b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
25c0: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
25d0: 62 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a  bles in pSrc */.
25e0: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
25f0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2600: 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69  of column matchi
2610: 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73  ng zCol */..  as
2620: 73 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29  sert( (piTab==0)
2630: 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20  ==(piCol==0) ); 
2640: 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74   /* Both or neit
2650: 68 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a  her are NULL */.
2660: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20    for(i=0; i<N; 
2670: 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  i++){.    iCol =
2680: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72   columnIndex(pSr
2690: 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43  c->a[i].pTab, zC
26a0: 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  ol);.    if( iCo
26b0: 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  l>=0 ){.      if
26c0: 28 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20  ( piTab ){.     
26d0: 20 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20     *piTab = i;. 
26e0: 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20         *piCol = 
26f0: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iCol;.      }.  
2700: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2710: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2720: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
2730: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
2740: 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20  ed to add terms 
2750: 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20  implied by JOIN 
2760: 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a  syntax to the.**
2770: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78   WHERE clause ex
2780: 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45  pression of a SE
2790: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
27a0: 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68  The new term, wh
27b0: 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20  ich.** is ANDed 
27c0: 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69 6e  with the existin
27d0: 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  g WHERE clause, 
27e0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
27f0: 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63  **.**    (tab1.c
2800: 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29  ol1 = tab2.col2)
2810: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62  .**.** where tab
2820: 31 20 69 73 20 74 68 65 20 69 53 72 63 27 74 68  1 is the iSrc'th
2830: 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73   table in SrcLis
2840: 74 20 70 53 72 63 20 61 6e 64 20 74 61 62 32 20  t pSrc and tab2 
2850: 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63  is the .** (iSrc
2860: 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63  +1)'th. Column c
2870: 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43  ol1 is column iC
2880: 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20  olLeft of tab1, 
2890: 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63  and col2 is.** c
28a0: 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20  olumn iColRight 
28b0: 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74  of tab2..*/.stat
28c0: 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72 65  ic void addWhere
28d0: 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
28e0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
28f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
2900: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
2910: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
2940: 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65  s in FROM clause
2950: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c   */.  int iLeft,
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2970: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2980: 66 20 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f  f first table to
2990: 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f   join in pSrc */
29a0: 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c  .  int iColLeft,
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
29d0: 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74  olumn in first t
29e0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
29f0: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
2a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2a10: 65 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62  ex of second tab
2a20: 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  le in pSrc */.  
2a30: 69 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20  int iColRight,  
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a50: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
2a60: 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62  mn in second tab
2a70: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75  le */.  int isOu
2a80: 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20  terJoin,        
2a90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2aa0: 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55  if this is an OU
2ab0: 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78  TER join */.  Ex
2ac0: 70 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20  pr **ppWhere    
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ae0: 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45   IN/OUT: The WHE
2af0: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64  RE clause to add
2b00: 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69   to */.){.  sqli
2b10: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
2b20: 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  ->db;.  Expr *pE
2b30: 31 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a  1;.  Expr *pE2;.
2b40: 20 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20    Expr *pEq;..  
2b50: 61 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52  assert( iLeft<iR
2b60: 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74  ight );.  assert
2b70: 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69  ( pSrc->nSrc>iRi
2b80: 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ght );.  assert(
2b90: 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e   pSrc->a[iLeft].
2ba0: 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74  pTab );.  assert
2bb0: 28 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74  ( pSrc->a[iRight
2bc0: 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31  ].pTab );..  pE1
2bd0: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
2be0: 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70  ColumnExpr(db, p
2bf0: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c  Src, iLeft, iCol
2c00: 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73  Left);.  pE2 = s
2c10: 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75  qlite3CreateColu
2c20: 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c  mnExpr(db, pSrc,
2c30: 20 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67   iRight, iColRig
2c40: 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71  ht);..  pEq = sq
2c50: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
2c60: 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70  e, TK_EQ, pE1, p
2c70: 45 32 29 3b 0a 20 20 69 66 28 20 70 45 71 20 26  E2);.  if( pEq &
2c80: 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b  & isOuterJoin ){
2c90: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
2ca0: 65 72 74 79 28 70 45 71 2c 20 45 50 5f 46 72 6f  erty(pEq, EP_Fro
2cb0: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65  mJoin);.    asse
2cc0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2cd0: 65 72 74 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b  erty(pEq, EP_Tok
2ce0: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
2cf0: 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65  d) );.    ExprSe
2d00: 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 71  tVVAProperty(pEq
2d10: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2d20: 20 20 20 20 70 45 71 2d 3e 69 52 69 67 68 74 4a      pEq->iRightJ
2d30: 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29  oinTable = (i16)
2d40: 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d  pE2->iTable;.  }
2d50: 0a 20 20 2a 70 70 57 68 65 72 65 20 3d 20 73 71  .  *ppWhere = sq
2d60: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
2d70: 20 2a 70 70 57 68 65 72 65 2c 20 70 45 71 29 3b   *ppWhere, pEq);
2d80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
2d90: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
2da0: 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65  operty on all te
2db0: 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e  rms of the given
2dc0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
2dd0: 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70 72  And set the Expr
2de0: 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
2df0: 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65   to iTable for e
2e00: 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65  very term in the
2e10: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  .** expression..
2e20: 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f  **.** The EP_Fro
2e30: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69  mJoin property i
2e40: 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20  s used on terms 
2e50: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
2e60: 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20   to tell.** the 
2e70: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
2e80: 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63  processing logic
2e90: 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20   that this term 
2ea0: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a  is part of the.*
2eb0: 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69  * join restricti
2ec0: 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  on specified in 
2ed0: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
2ee0: 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61  clause and not a
2ef0: 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
2f00: 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45  more general WHE
2f10: 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73  RE clause.  Thes
2f20: 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65  e terms are move
2f30: 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a  d over to the.**
2f40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75   WHERE clause du
2f50: 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73  ring join proces
2f60: 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64  sing but we need
2f70: 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
2f80: 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e  t they.** origin
2f90: 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ated in the ON o
2fa0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a  r USING clause..
2fb0: 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69  **.** The Expr.i
2fc0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74  RightJoinTable t
2fd0: 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20 63  ells the WHERE c
2fe0: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
2ff0: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70   that the.** exp
3000: 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20  ression depends 
3010: 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a  on table iRightJ
3020: 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66  oinTable even if
3030: 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e   that table is n
3040: 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79  ot.** explicitly
3050: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
3060: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  e expression.  T
3070: 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  hat information 
3080: 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72  is needed.** for
3090: 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73   cases like this
30a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
30b0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
30c0: 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
30d0: 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35  =t2.b AND t1.x=5
30e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65  .**.** The where
30f0: 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f   clause needs to
3100: 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c   defer the handl
3110: 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d  ing of the t1.x=
3120: 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20  5.** term until 
3130: 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f  after the t2 loo
3140: 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  p of the join.  
3150: 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a  In that way, a.*
3160: 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69  * NULL t2 row wi
3170: 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 77  ll be inserted w
3180: 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e  henever t1.x!=5.
3190: 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a    If we do not.*
31a0: 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  * defer the hand
31b0: 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20  ling of t1.x=5, 
31c0: 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65  it will be proce
31d0: 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ssed immediately
31e0: 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74 31  .** after the t1
31f0: 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77   loop and rows w
3200: 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c  ith t1.x!=5 will
3210: 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69 6e   never appear in
3220: 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20  .** the output, 
3230: 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65  which is incorre
3240: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
3250: 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45  id setJoinExpr(E
3260: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  xpr *p, int iTab
3270: 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20  le){.  while( p 
3280: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
3290: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
32a0: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65  mJoin);.    asse
32b0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
32c0: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
32d0: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
32e0: 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56   );.    ExprSetV
32f0: 56 41 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  VAProperty(p, EP
3300: 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
3310: 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  p->iRightJoinTab
3320: 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65  le = (i16)iTable
3330: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ;.    if( p->op=
3340: 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20  =TK_FUNCTION && 
3350: 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  p->x.pList ){.  
3360: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
3370: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 78   for(i=0; i<p->x
3380: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  .pList->nExpr; i
3390: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74  ++){.        set
33a0: 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c  JoinExpr(p->x.pL
33b0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
33c0: 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20   iTable);.      
33d0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 4a  }.    }.    setJ
33e0: 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  oinExpr(p->pLeft
33f0: 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  , iTable);.    p
3400: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
3410: 7d 20 0a 7d 0a 0a 2f 2a 20 55 6e 64 6f 20 74 68  } .}../* Undo th
3420: 65 20 77 6f 72 6b 20 6f 66 20 73 65 74 4a 6f 69  e work of setJoi
3430: 6e 45 78 70 72 28 29 2e 20 20 49 6e 20 74 68 65  nExpr().  In the
3440: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
3450: 20 70 2c 20 63 6f 6e 76 65 72 74 20 65 76 65 72   p, convert ever
3460: 79 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69  y.** term that i
3470: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 45 50  s marked with EP
3480: 5f 46 72 6f 6d 4a 6f 69 6e 20 61 6e 64 20 69 52  _FromJoin and iR
3490: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69  ightJoinTable==i
34a0: 54 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e  Table into.** an
34b0: 20 6f 72 64 69 6e 61 72 79 20 74 65 72 6d 20 74   ordinary term t
34c0: 68 61 74 20 6f 6d 69 74 73 20 74 68 65 20 45 50  hat omits the EP
34d0: 5f 46 72 6f 6d 4a 6f 69 6e 20 6d 61 72 6b 2e 0a  _FromJoin mark..
34e0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 68 61 70 70 65  **.** This happe
34f0: 6e 73 20 77 68 65 6e 20 61 20 4c 45 46 54 20 4a  ns when a LEFT J
3500: 4f 49 4e 20 69 73 20 73 69 6d 70 6c 69 66 69 65  OIN is simplifie
3510: 64 20 69 6e 74 6f 20 61 6e 20 6f 72 64 69 6e 61  d into an ordina
3520: 72 79 20 4a 4f 49 4e 2e 0a 2a 2f 0a 73 74 61 74  ry JOIN..*/.stat
3530: 69 63 20 76 6f 69 64 20 75 6e 73 65 74 4a 6f 69  ic void unsetJoi
3540: 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69  nExpr(Expr *p, i
3550: 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68  nt iTable){.  wh
3560: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
3570: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
3580: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
3590: 29 0a 20 20 20 20 20 26 26 20 28 69 54 61 62 6c  ).     && (iTabl
35a0: 65 3c 30 20 7c 7c 20 70 2d 3e 69 52 69 67 68 74  e<0 || p->iRight
35b0: 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61 62 6c  JoinTable==iTabl
35c0: 65 29 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  e) ){.      Expr
35d0: 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c  ClearProperty(p,
35e0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
35f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
3600: 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
3610: 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  && p->x.pList ){
3620: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
3630: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
3640: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
3650: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
3660: 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d  unsetJoinExpr(p-
3670: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
3680: 45 78 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20  Expr, iTable);. 
3690: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
36a0: 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 70   unsetJoinExpr(p
36b0: 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 29  ->pLeft, iTable)
36c0: 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69  ;.    p = p->pRi
36d0: 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a  ght;.  } .}../*.
36e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
36f0: 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 6a 6f  processes the jo
3700: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  in information f
3710: 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  or a SELECT stat
3720: 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64  ement..** ON and
3730: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61   USING clauses a
3740: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  re converted int
3750: 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 66  o extra terms of
3760: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3770: 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a 6f  e..** NATURAL jo
3780: 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74 65 20  ins also create 
3790: 65 78 74 72 61 20 57 48 45 52 45 20 63 6c 61 75  extra WHERE clau
37a0: 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20  se terms..**.** 
37b0: 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61 20 46  The terms of a F
37c0: 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65 20 63  ROM clause are c
37d0: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
37e0: 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74 72 75  Select.pSrc stru
37f0: 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c 65  cture..** The le
3800: 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20 69 73  ft most table is
3810: 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
3820: 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72 63 2e   in Select.pSrc.
3830: 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    The right-most
3840: 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74 68 65  .** table is the
3850: 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20 54 68   last entry.  Th
3860: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
3870: 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 65  is held in the e
3880: 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6c  ntry to.** the l
3890: 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74 72 79  eft.  Thus entry
38a0: 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20   0 contains the 
38b0: 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 66 6f  join operator fo
38c0: 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74 77 65  r the join betwe
38d0: 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30 20  en.** entries 0 
38e0: 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20 6f  and 1.  Any ON o
38f0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
3900: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
3910: 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20  the join are.** 
3920: 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20 74 6f  also attached to
3930: 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72 79 2e   the left entry.
3940: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
3950: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
3960: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
3970: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f   encountered..*/
3980: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
3990: 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61  teProcessJoin(Pa
39a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
39b0: 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69  ect *p){.  SrcLi
39c0: 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 20  st *pSrc;       
39d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
39e0: 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  l tables in the 
39f0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
3a00: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a20: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
3a30: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
3a40: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66  cList_item *pLef
3a50: 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 74  t;     /* Left t
3a60: 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65  able being joine
3a70: 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  d */.  struct Sr
3a80: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52 69 67  cList_item *pRig
3a90: 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68 74 20  ht;    /* Right 
3aa0: 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e  table being join
3ab0: 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d 20  ed */..  pSrc = 
3ac0: 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66 74  p->pSrc;.  pLeft
3ad0: 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a   = &pSrc->a[0];.
3ae0: 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c 65 66    pRight = &pLef
3af0: 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  t[1];.  for(i=0;
3b00: 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b   i<pSrc->nSrc-1;
3b10: 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c 20   i++, pRight++, 
3b20: 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54 61  pLeft++){.    Ta
3b30: 62 6c 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d  ble *pRightTab =
3b40: 20 70 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20   pRight->pTab;. 
3b50: 20 20 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a     int isOuter;.
3b60: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70  .    if( NEVER(p
3b70: 4c 65 66 74 2d 3e 70 54 61 62 3d 3d 30 20 7c 7c  Left->pTab==0 ||
3b80: 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29 20 29   pRightTab==0) )
3b90: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
3ba0: 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67 68 74  sOuter = (pRight
3bb0: 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
3bc0: 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20  JT_OUTER)!=0;.. 
3bd0: 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e     /* When the N
3be0: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69  ATURAL keyword i
3bf0: 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57  s present, add W
3c00: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
3c10: 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65  s for.    ** eve
3c20: 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74  ry column that t
3c30: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61  he two tables ha
3c40: 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20  ve in common..  
3c50: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
3c60: 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  ght->fg.jointype
3c70: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b   & JT_NATURAL ){
3c80: 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68  .      if( pRigh
3c90: 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74  t->pOn || pRight
3ca0: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
3cb0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3cc0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e  Msg(pParse, "a N
3cd0: 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20  ATURAL join may 
3ce0: 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20 20  not have ".     
3cf0: 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20        "an ON or 
3d00: 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30  USING clause", 0
3d10: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
3d20: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
3d30: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52     for(j=0; j<pR
3d40: 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a  ightTab->nCol; j
3d50: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
3d60: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e  r *zName;   /* N
3d70: 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  ame of column in
3d80: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
3d90: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3da0: 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d 61  iLeft;     /* Ma
3db0: 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61 62 6c  tching left tabl
3dc0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
3dd0: 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d   iLeftCol;  /* M
3de0: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 69  atching column i
3df0: 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  n the left table
3e00: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61   */..        zNa
3e10: 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62 2d 3e  me = pRightTab->
3e20: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  aCol[j].zName;. 
3e30: 20 20 20 20 20 20 20 69 66 28 20 74 61 62 6c 65         if( table
3e40: 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
3e50: 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c  Src, i+1, zName,
3e60: 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43   &iLeft, &iLeftC
3e70: 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ol) ){.         
3e80: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50   addWhereTerm(pP
3e90: 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66  arse, pSrc, iLef
3ea0: 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31  t, iLeftCol, i+1
3eb0: 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , j,.           
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 75              isOu
3ed0: 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29  ter, &p->pWhere)
3ee0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3ef0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
3f00: 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20  * Disallow both 
3f10: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
3f20: 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65  uses in the same
3f30: 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20   join.    */.   
3f40: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e   if( pRight->pOn
3f50: 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69   && pRight->pUsi
3f60: 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
3f70: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3f80: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65  se, "cannot have
3f90: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
3fa0: 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c  NG ".        "cl
3fb0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
3fc0: 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20  e join");.      
3fd0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
3fe0: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
3ff0: 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  ON clause to the
4000: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
4010: 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63  E clause, connec
4020: 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e  ted by.    ** an
4030: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
4040: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
4050: 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20  ight->pOn ){.   
4060: 20 20 20 69 66 28 20 69 73 4f 75 74 65 72 20 29     if( isOuter )
4070: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69   setJoinExpr(pRi
4080: 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74  ght->pOn, pRight
4090: 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
40a0: 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71    p->pWhere = sq
40b0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
40c0: 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65  rse->db, p->pWhe
40d0: 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29  re, pRight->pOn)
40e0: 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e  ;.      pRight->
40f0: 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  pOn = 0;.    }..
4100: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78      /* Create ex
4110: 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65  tra terms on the
4120: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f   WHERE clause fo
4130: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61  r each column na
4140: 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  med.    ** in th
4150: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20  e USING clause. 
4160: 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65   Example: If the
4170: 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62   two tables to b
4180: 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20  e joined are .  
4190: 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64    ** A and B and
41a0: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
41b0: 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e  e names X, Y, an
41c0: 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68  d Z, then add th
41d0: 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  is.    ** to the
41e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20   WHERE clause:  
41f0: 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e    A.X=B.X AND A.
4200: 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e  Y=B.Y AND A.Z=B.
4210: 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20  Z.    ** Report 
4220: 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20  an error if any 
4230: 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64  column mentioned
4240: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
4250: 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e  ause is.    ** n
4260: 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
4270: 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62  both tables to b
4280: 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f  e joined..    */
4290: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
42a0: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
42b0: 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d   IdList *pList =
42c0: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b   pRight->pUsing;
42d0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
42e0: 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b  j<pList->nId; j+
42f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
4300: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20   *zName;     /* 
4310: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 72 6d  Name of the term
4320: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
4330: 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ause */.        
4340: 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 20  int iLeft;      
4350: 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68 65   /* Table on the
4360: 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74 63 68   left with match
4370: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ing column name 
4380: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
4390: 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20 43  LeftCol;    /* C
43a0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
43b0: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
43c0: 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20  on the left */. 
43d0: 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67 68         int iRigh
43e0: 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d  tCol;   /* Colum
43f0: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  n number of matc
4400: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74  hing column on t
4410: 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20 20  he right */..   
4420: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c 69       zName = pLi
4430: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[j].zName;.
4440: 20 20 20 20 20 20 20 20 69 52 69 67 68 74 43 6f          iRightCo
4450: 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  l = columnIndex(
4460: 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65  pRightTab, zName
4470: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
4480: 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20 20  RightCol<0.     
4490: 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e 64      || !tableAnd
44a0: 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63  ColumnIndex(pSrc
44b0: 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69  , i+1, zName, &i
44c0: 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29  Left, &iLeftCol)
44d0: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
44e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
44f0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
4500: 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67  annot join using
4510: 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c   column %s - col
4520: 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20  umn ".          
4530: 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69    "not present i
4540: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20  n both tables", 
4550: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
4560: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
4570: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64      }.        ad
4580: 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73  dWhereTerm(pPars
4590: 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20  e, pSrc, iLeft, 
45a0: 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 69  iLeftCol, i+1, i
45b0: 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20 20  RightCol,.      
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
45d0: 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65  sOuter, &p->pWhe
45e0: 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  re);.      }.   
45f0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4600: 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  0;.}../* Forward
4610: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
4620: 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65  atic KeyInfo *ke
4630: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
4640: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
4650: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
4660: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
4670: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
4680: 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74  t,     /* Form t
4690: 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63  he KeyInfo objec
46a0: 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72  t from this Expr
46b0: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53  List */.  int iS
46c0: 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f  tart,          /
46d0: 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74 68 69  * Begin with thi
46e0: 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73  s column of pLis
46f0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  t */.  int nExtr
4700: 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  a           /* A
4710: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74  dd this many ext
4720: 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  ra columns to th
4730: 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a  e end */.);../*.
4740: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
4750: 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20   that will push 
4760: 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20 72 65  the record in re
4770: 67 69 73 74 65 72 73 20 72 65 67 44 61 74 61 0a  gisters regData.
4780: 2a 2a 20 74 68 72 6f 75 67 68 20 72 65 67 44 61  ** through regDa
4790: 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e 74 6f 20  ta+nData-1 onto 
47a0: 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73  the sorter..*/.s
47b0: 74 61 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f  tatic void pushO
47c0: 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50 61 72  ntoSorter(.  Par
47d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
47e0: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
47f0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72 74 43  ntext */.  SortC
4800: 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20  tx *pSort,      
4810: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
4820: 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44 45 52   about the ORDER
4830: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
4840: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
4850: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68         /* The wh
4860: 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ole SELECT state
4870: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ment */.  int re
4880: 67 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  gData,          
4890: 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73 74   /* First regist
48a0: 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20  er holding data 
48b0: 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a  to be sorted */.
48c0: 20 20 69 6e 74 20 72 65 67 4f 72 69 67 44 61 74    int regOrigDat
48d0: 61 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  a,       /* Firs
48e0: 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  t register holdi
48f0: 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65 20 70  ng data before p
4900: 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  acking */.  int 
4910: 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  nData,          
4920: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4930: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
4940: 64 61 74 61 20 61 72 72 61 79 20 2a 2f 0a 20 20  data array */.  
4950: 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 20  int nPrefixReg  
4960: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66         /* No. of
4970: 20 72 65 67 20 70 72 69 6f 72 20 74 6f 20 72 65   reg prior to re
4980: 67 44 61 74 61 20 61 76 61 69 6c 61 62 6c 65 20  gData available 
4990: 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20  for use */.){.  
49a0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
49b0: 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20  ->pVdbe;        
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49d0: 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65 72 20 63   /* Stmt under c
49e0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
49f0: 20 69 6e 74 20 62 53 65 71 20 3d 20 28 28 70 53   int bSeq = ((pS
4a00: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
4a10: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
4a20: 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69 6e 74 20  ter)==0);.  int 
4a30: 6e 45 78 70 72 20 3d 20 70 53 6f 72 74 2d 3e 70  nExpr = pSort->p
4a40: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4a60: 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20 42 59 20  No. of ORDER BY 
4a70: 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  terms */.  int n
4a80: 42 61 73 65 20 3d 20 6e 45 78 70 72 20 2b 20 62  Base = nExpr + b
4a90: 53 65 71 20 2b 20 6e 44 61 74 61 3b 20 20 20 20  Seq + nData;    
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4ab0: 69 65 6c 64 73 20 69 6e 20 73 6f 72 74 65 72 20  ields in sorter 
4ac0: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
4ad0: 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b00: 52 65 67 73 20 66 6f 72 20 73 6f 72 74 65 72 20  Regs for sorter 
4b10: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
4b20: 72 65 67 52 65 63 6f 72 64 20 3d 20 2b 2b 70 50  regRecord = ++pP
4b30: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20  arse->nMem;     
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b50: 41 73 73 65 6d 62 6c 65 64 20 73 6f 72 74 65 72  Assembled sorter
4b60: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
4b70: 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72 74 2d   nOBSat = pSort-
4b80: 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20 20  >nOBSat;        
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4ba0: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
4bb0: 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 69 6e 74  to skip */.  int
4bc0: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4be0: 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61 64 64  /* Opcode to add
4bf0: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 74   sorter record t
4c00: 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e  o sorter */.  in
4c10: 74 20 69 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  t iLimit;       
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c30: 20 2f 2a 20 4c 49 4d 49 54 20 63 6f 75 6e 74 65   /* LIMIT counte
4c40: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
4c50: 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53 65 71 3d  bSeq==0 || bSeq=
4c60: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
4c70: 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 72 65 67 44  nData==1 || regD
4c80: 61 74 61 3d 3d 72 65 67 4f 72 69 67 44 61 74 61  ata==regOrigData
4c90: 20 7c 7c 20 72 65 67 4f 72 69 67 44 61 74 61 3d   || regOrigData=
4ca0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 50 72 65  =0 );.  if( nPre
4cb0: 66 69 78 52 65 67 20 29 7b 0a 20 20 20 20 61 73  fixReg ){.    as
4cc0: 73 65 72 74 28 20 6e 50 72 65 66 69 78 52 65 67  sert( nPrefixReg
4cd0: 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20 29 3b 0a  ==nExpr+bSeq );.
4ce0: 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 65      regBase = re
4cf0: 67 44 61 74 61 20 2d 20 6e 45 78 70 72 20 2d 20  gData - nExpr - 
4d00: 62 53 65 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  bSeq;.  }else{. 
4d10: 20 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61     regBase = pPa
4d20: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
4d30: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
4d40: 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a 20 20  += nBase;.  }.  
4d50: 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 2d  assert( pSelect-
4d60: 3e 69 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70  >iOffset==0 || p
4d70: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 21 3d  Select->iLimit!=
4d80: 30 20 29 3b 0a 20 20 69 4c 69 6d 69 74 20 3d 20  0 );.  iLimit = 
4d90: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
4da0: 20 3f 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   ? pSelect->iOff
4db0: 73 65 74 2b 31 20 3a 20 70 53 65 6c 65 63 74 2d  set+1 : pSelect-
4dc0: 3e 69 4c 69 6d 69 74 3b 0a 20 20 70 53 6f 72 74  >iLimit;.  pSort
4dd0: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d 20 73 71  ->labelDone = sq
4de0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
4df0: 65 6c 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  el(v);.  sqlite3
4e00: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
4e10: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e  (pParse, pSort->
4e20: 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61 73  pOrderBy, regBas
4e30: 65 2c 20 72 65 67 4f 72 69 67 44 61 74 61 2c 0a  e, regOrigData,.
4e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e50: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
4e60: 5f 45 43 45 4c 5f 44 55 50 20 7c 20 28 72 65 67  _ECEL_DUP | (reg
4e70: 4f 72 69 67 44 61 74 61 3f 20 53 51 4c 49 54 45  OrigData? SQLITE
4e80: 5f 45 43 45 4c 5f 52 45 46 20 3a 20 30 29 29 3b  _ECEL_REF : 0));
4e90: 0a 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a 20  .  if( bSeq ){. 
4ea0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4eb0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp2(v, OP_Seque
4ec0: 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  nce, pSort->iECu
4ed0: 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e 45  rsor, regBase+nE
4ee0: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  xpr);.  }.  if( 
4ef0: 6e 50 72 65 66 69 78 52 65 67 3d 3d 30 20 26 26  nPrefixReg==0 &&
4f00: 20 6e 44 61 74 61 3e 30 20 29 7b 0a 20 20 20 20   nData>0 ){.    
4f10: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
4f20: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 44  ove(pParse, regD
4f30: 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78  ata, regBase+nEx
4f40: 70 72 2b 62 53 65 71 2c 20 6e 44 61 74 61 29 3b  pr+bSeq, nData);
4f50: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 42 53 61  .  }.  if( nOBSa
4f60: 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  t>0 ){.    int r
4f70: 65 67 50 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20  egPrevKey;   /* 
4f80: 54 68 65 20 66 69 72 73 74 20 6e 4f 42 53 61 74  The first nOBSat
4f90: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
4fa0: 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a  previous row */.
4fb0: 20 20 20 20 69 6e 74 20 61 64 64 72 46 69 72 73      int addrFirs
4fc0: 74 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  t;    /* Address
4fd0: 20 6f 66 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74   of the OP_IfNot
4fe0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69   opcode */.    i
4ff0: 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20 20 20 20  nt addrJmp;     
5000: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
5010: 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64  he OP_Jump opcod
5020: 65 20 2a 2f 0a 20 20 20 20 56 64 62 65 4f 70 20  e */.    VdbeOp 
5030: 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70  *pOp;      /* Op
5040: 63 6f 64 65 20 74 68 61 74 20 6f 70 65 6e 73 20  code that opens 
5050: 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20  the sorter */.  
5060: 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20    int nKey;     
5070: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5080: 20 73 6f 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c   sorting key col
5090: 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20  umns, including 
50a0: 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20  OP_Sequence */. 
50b0: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b     KeyInfo *pKI;
50c0: 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
50d0: 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20   KeyInfo on the 
50e0: 73 6f 72 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  sorter table */.
50f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5100: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
5110: 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65  eRecord, regBase
5120: 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e  +nOBSat, nBase-n
5130: 4f 42 53 61 74 2c 72 65 67 52 65 63 6f 72 64 29  OBSat,regRecord)
5140: 3b 0a 20 20 20 20 72 65 67 50 72 65 76 4b 65 79  ;.    regPrevKey
5150: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
5160: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
5170: 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e 4f  Mem += pSort->nO
5180: 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79 20 3d  BSat;.    nKey =
5190: 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e   nExpr - pSort->
51a0: 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b 0a 20  nOBSat + bSeq;. 
51b0: 20 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a 20     if( bSeq ){. 
51c0: 20 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d       addrFirst =
51d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
51e0: 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
51f0: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 20  regBase+nExpr); 
5200: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5210: 20 20 61 64 64 72 46 69 72 73 74 20 3d 20 73 71    addrFirst = sq
5220: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
5230: 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 54 65  v, OP_SequenceTe
5240: 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  st, pSort->iECur
5250: 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  sor);.    }.    
5260: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5270: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5280: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp3(v, OP_Com
5290: 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b 65 79  pare, regPrevKey
52a0: 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f 72 74  , regBase, pSort
52b0: 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 70  ->nOBSat);.    p
52c0: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
52d0: 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e  GetOp(v, pSort->
52e0: 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
52f0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
5300: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5310: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
5320: 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20 2b 20  Op->p2 = nKey + 
5330: 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49 20 3d  nData;.    pKI =
5340: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
5350: 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4b  o;.    memset(pK
5360: 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 30  I->aSortOrder, 0
5370: 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64  , pKI->nKeyField
5380: 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a  ); /* Makes OP_J
5390: 75 6d 70 20 74 65 73 74 61 62 6c 65 20 2a 2f 0a  ump testable */.
53a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
53b0: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
53c0: 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b 45  char*)pKI, P4_KE
53d0: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65 73 74  YINFO);.    test
53e0: 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41 6c 6c 46  case( pKI->nAllF
53f0: 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e 4b 65 79  ield > pKI->nKey
5400: 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20 20 20 70  Field+2 );.    p
5410: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20  Op->p4.pKeyInfo 
5420: 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
5430: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
5440: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 6e  ort->pOrderBy, n
5450: 4f 42 53 61 74 2c 0a 20 20 20 20 20 20 20 20 20  OBSat,.         
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5480: 20 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64    pKI->nAllField
5490: 2d 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64 2d  -pKI->nKeyField-
54a0: 31 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d 70 20  1);.    addrJmp 
54b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
54c0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
54d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
54e0: 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
54f0: 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61 64 64  ddrJmp+1, 0, add
5500: 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43 6f 76  rJmp+1); VdbeCov
5510: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 70 53  erage(v);.    pS
5520: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20  ort->labelBkOut 
5530: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
5540: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 70  eLabel(v);.    p
5550: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20  Sort->regReturn 
5560: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
5570: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5580: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
5590: 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  sub, pSort->regR
55a0: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61  eturn, pSort->la
55b0: 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73  belBkOut);.    s
55c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
55d0: 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
55e0: 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  er, pSort->iECur
55f0: 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 69 4c  sor);.    if( iL
5600: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71  imit ){.      sq
5610: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5620: 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69  v, OP_IfNot, iLi
5630: 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65  mit, pSort->labe
5640: 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64  lDone);.      Vd
5650: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
5660: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
5670: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
5680: 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
5690: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
56a0: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  ove(pParse, regB
56b0: 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c  ase, regPrevKey,
56c0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b   pSort->nOBSat);
56d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
56e0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
56f0: 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Jmp);.  }.  if( 
5700: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a  iLimit ){.    /*
5710: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
5720: 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  he values for th
5730: 65 20 6e 65 77 20 73 6f 72 74 65 72 20 65 6e 74  e new sorter ent
5740: 72 79 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20  ry are stored.  
5750: 20 20 2a 2a 20 69 6e 20 61 6e 20 61 72 72 61 79    ** in an array
5760: 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 54   of registers. T
5770: 68 65 79 20 6e 65 65 64 20 74 6f 20 62 65 20 63  hey need to be c
5780: 6f 6d 70 6f 73 65 64 20 69 6e 74 6f 20 61 20 72  omposed into a r
5790: 65 63 6f 72 64 0a 20 20 20 20 2a 2a 20 61 6e 64  ecord.    ** and
57a0: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
57b0: 68 65 20 73 6f 72 74 65 72 20 69 66 20 65 69 74  he sorter if eit
57c0: 68 65 72 20 28 61 29 20 74 68 65 72 65 20 61 72  her (a) there ar
57d0: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20  e currently.    
57e0: 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 4c 49 4d  ** less than LIM
57f0: 49 54 2b 4f 46 46 53 45 54 20 69 74 65 6d 73 20  IT+OFFSET items 
5800: 6f 72 20 28 62 29 20 74 68 65 20 6e 65 77 20 72  or (b) the new r
5810: 65 63 6f 72 64 20 69 73 20 73 6d 61 6c 6c 65 72  ecord is smaller
5820: 20 74 68 61 6e 20 0a 20 20 20 20 2a 2a 20 74 68   than .    ** th
5830: 65 20 6c 61 72 67 65 73 74 20 72 65 63 6f 72 64  e largest record
5840: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
5850: 65 20 73 6f 72 74 65 72 2e 20 49 66 20 28 62 29  e sorter. If (b)
5860: 20 69 73 20 74 72 75 65 20 61 6e 64 20 74 68 65   is true and the
5870: 72 65 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c  re.    ** are al
5880: 72 65 61 64 79 20 4c 49 4d 49 54 2b 4f 46 46 53  ready LIMIT+OFFS
5890: 45 54 20 69 74 65 6d 73 20 69 6e 20 74 68 65 20  ET items in the 
58a0: 73 6f 72 74 65 72 2c 20 64 65 6c 65 74 65 20 74  sorter, delete t
58b0: 68 65 20 6c 61 72 67 65 73 74 0a 20 20 20 20 2a  he largest.    *
58c0: 2a 20 65 6e 74 72 79 20 62 65 66 6f 72 65 20 69  * entry before i
58d0: 6e 73 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77  nserting the new
58e0: 20 6f 6e 65 2e 20 54 68 69 73 20 77 61 79 20 74   one. This way t
58f0: 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 6d  here are never m
5900: 6f 72 65 20 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ore .    ** than
5910: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 69 74   LIMIT+OFFSET it
5920: 65 6d 73 20 69 6e 20 74 68 65 20 73 6f 72 74 65  ems in the sorte
5930: 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
5940: 20 49 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   If the new reco
5950: 72 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  rd does not need
5960: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20   to be inserted 
5970: 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c  into the sorter,
5980: 0a 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20  .    ** jump to 
5990: 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
59a0: 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  on of the loop. 
59b0: 4f 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a  Or, if the.    *
59c0: 2a 20 70 53 6f 72 74 2d 3e 62 4f 72 64 65 72 65  * pSort->bOrdere
59d0: 64 49 6e 6e 65 72 4c 6f 6f 70 20 66 6c 61 67 20  dInnerLoop flag 
59e0: 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61  is set to indica
59f0: 74 65 20 74 68 61 74 20 74 68 65 20 69 6e 6e 65  te that the inne
5a00: 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 20 64 65  r.    ** loop de
5a10: 6c 69 76 65 72 73 20 69 74 65 6d 73 20 69 6e 20  livers items in 
5a20: 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20 6a 75  sorted order, ju
5a30: 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  mp to the next i
5a40: 74 65 72 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  teration.    ** 
5a50: 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
5a60: 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  p..    */.    in
5a70: 74 20 69 43 73 72 20 3d 20 70 53 6f 72 74 2d 3e  t iCsr = pSort->
5a80: 69 45 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 6e  iECursor;.    in
5a90: 74 20 69 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33  t iJmp = sqlite3
5aa0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
5ab0: 76 29 2b 35 2b 28 6e 4f 42 53 61 74 3c 3d 30 29  v)+5+(nOBSat<=0)
5ac0: 2b 70 53 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64  +pSort->bOrdered
5ad0: 49 6e 6e 65 72 4c 6f 6f 70 3b 0a 20 20 20 20 61  InnerLoop;.    a
5ae0: 73 73 65 72 74 28 20 70 53 6f 72 74 2d 3e 62 4f  ssert( pSort->bO
5af0: 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3d  rderedInnerLoop=
5b00: 3d 30 20 7c 7c 20 70 53 6f 72 74 2d 3e 62 4f 72  =0 || pSort->bOr
5b10: 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3d 3d  deredInnerLoop==
5b20: 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 );.    sqlite3
5b30: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5b40: 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d  _IfNotZero, iLim
5b50: 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  it, sqlite3VdbeC
5b60: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 34 29  urrentAddr(v)+4)
5b70: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
5b80: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
5b90: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5ba0: 4f 50 5f 4c 61 73 74 2c 20 69 43 73 72 2c 20 30  OP_Last, iCsr, 0
5bb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5bc0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
5bd0: 50 5f 49 64 78 4c 45 2c 20 69 43 73 72 2c 20 69  P_IdxLE, iCsr, i
5be0: 4a 6d 70 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42  Jmp, regBase+nOB
5bf0: 53 61 74 2c 20 6e 45 78 70 72 2d 6e 4f 42 53 61  Sat, nExpr-nOBSa
5c00: 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  t);.    VdbeCove
5c10: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
5c20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
5c30: 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 43 73  , OP_Delete, iCs
5c40: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f  r);.  }.  if( nO
5c50: 42 53 61 74 3c 3d 30 20 29 7b 0a 20 20 20 20 73  BSat<=0 ){.    s
5c60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5c70: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
5c80: 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61  d, regBase+nOBSa
5c90: 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74 2c  t, nBase-nOBSat,
5ca0: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 7d 0a  regRecord);.  }.
5cb0: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72    if( pSort->sor
5cc0: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
5cd0: 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  G_UseSorter ){. 
5ce0: 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65     op = OP_Sorte
5cf0: 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65  rInsert;.  }else
5d00: 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64  {.    op = OP_Id
5d10: 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73  xInsert;.  }.  s
5d20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
5d30: 49 6e 74 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74  Int(v, op, pSort
5d40: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52  ->iECursor, regR
5d50: 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20  ecord,.         
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
5d70: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
5d80: 61 73 65 2d 6e 4f 42 53 61 74 29 3b 0a 7d 0a 0a  ase-nOBSat);.}..
5d90: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
5da0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
5db0: 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63  OFFSET.*/.static
5dc0: 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74   void codeOffset
5dd0: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
5de0: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
5df0: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
5e00: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66   VM */.  int iOf
5e10: 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65  fset,      /* Re
5e20: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
5e30: 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65  he offset counte
5e40: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  r */.  int iCont
5e50: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
5e60: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
5e70: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
5e80: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66   */.){.  if( iOf
5e90: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71  fset>0 ){.    sq
5ea0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5eb0: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66  v, OP_IfPos, iOf
5ec0: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  fset, iContinue,
5ed0: 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   1); VdbeCoverag
5ee0: 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  e(v);.    VdbeCo
5ef0: 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45  mment((v, "OFFSE
5f00: 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  T"));.  }.}../*.
5f10: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74  ** Add code that
5f20: 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d   will check to m
5f30: 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72  ake sure the N r
5f40: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
5f50: 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72  g at iMem.** for
5f60: 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74  m a distinct ent
5f70: 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73  ry.  iTab is a s
5f80: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
5f90: 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73  t holds previous
5fa0: 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69  ly.** seen combi
5fb0: 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e  nations of the N
5fc0: 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20   values.  A new 
5fd0: 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e  entry is made in
5fe0: 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20   iTab.** if the 
5ff0: 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73  current N values
6000: 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20   are new..**.** 
6010: 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65  A jump to addrRe
6020: 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64  peat is made and
6030: 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20   the N+1 values 
6040: 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20  are popped from 
6050: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20  the.** stack if 
6060: 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e  the top N elemen
6070: 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69  ts are not disti
6080: 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nct..*/.static v
6090: 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74  oid codeDistinct
60a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
60b0: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
60c0: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
60d0: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
60e0: 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20  .  int iTab,    
60f0: 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69        /* A sorti
6100: 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  ng index used to
6110: 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e   test for distin
6120: 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  ctness */.  int 
6130: 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f  addrRepeat,    /
6140: 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69  * Jump to here i
6150: 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a  f not distinct *
6160: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
6170: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6180: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a   of elements */.
6190: 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20    int iMem      
61a0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c       /* First el
61b0: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  ement */.){.  Vd
61c0: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b  be *v;.  int r1;
61d0: 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ..  v = pParse->
61e0: 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71  pVdbe;.  r1 = sq
61f0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
6200: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
6210: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
6220: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61  v, OP_Found, iTa
6230: 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69  b, addrRepeat, i
6240: 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76  Mem, N); VdbeCov
6250: 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
6260: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6270: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
6280: 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20  iMem, N, r1);.  
6290: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
62a0: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
62b0: 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 2c 20  sert, iTab, r1, 
62c0: 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69  iMem, N);.  sqli
62d0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
62e0: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
62f0: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
6300: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
6310: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
6320: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
6330: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
6340: 46 45 52 45 4e 43 45 53 0a 2f 2a 0a 2a 2a 20 54  FERENCES./*.** T
6350: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
6360: 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f  called as part o
6370: 66 20 69 6e 6e 65 72 2d 6c 6f 6f 70 20 67 65 6e  f inner-loop gen
6380: 65 72 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45  eration for a SE
6390: 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  LECT.** statemen
63a0: 74 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  t with an ORDER 
63b0: 42 59 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6f  BY that is not o
63c0: 70 74 69 6d 69 7a 65 64 20 62 79 20 61 6e 20 69  ptimized by an i
63d0: 6e 64 65 78 2e 20 49 74 20 0a 2a 2a 20 64 65 74  ndex. It .** det
63e0: 65 72 6d 69 6e 65 73 20 74 68 65 20 65 78 70 72  ermines the expr
63f0: 65 73 73 69 6f 6e 73 2c 20 69 66 20 61 6e 79 2c  essions, if any,
6400: 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 65 72   that the sorter
6410: 2d 72 65 66 65 72 65 6e 63 65 20 0a 2a 2a 20 6f  -reference .** o
6420: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75  ptimization shou
6430: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 2e 20  ld be used for. 
6440: 54 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72  The sorter-refer
6450: 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ence optimizatio
6460: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20 66 6f 72  n.** is used for
6470: 20 53 45 4c 45 43 54 20 71 75 65 72 69 65 73 20   SELECT queries 
6480: 6c 69 6b 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  like:.**.**   SE
6490: 4c 45 43 54 20 61 2c 20 62 69 67 62 6c 6f 62 20  LECT a, bigblob 
64a0: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
64b0: 20 61 20 4c 49 4d 49 54 20 31 30 0a 2a 2a 0a 2a   a LIMIT 10.**.*
64c0: 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
64d0: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
64e0: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 22 62 69  r expression "bi
64f0: 67 62 6c 6f 62 22 2c 20 74 68 65 6e 20 69 6e 73  gblob", then ins
6500: 74 65 61 64 20 6f 66 0a 2a 2a 20 73 74 6f 72 69  tead of.** stori
6510: 6e 67 20 76 61 6c 75 65 73 20 72 65 61 64 20 66  ng values read f
6520: 72 6f 6d 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  rom that column 
6530: 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20 72 65  in the sorter re
6540: 63 6f 72 64 73 2c 20 74 68 65 20 50 4b 20 6f 66  cords, the PK of
6550: 0a 2a 2a 20 74 68 65 20 72 6f 77 20 66 72 6f 6d  .** the row from
6560: 20 74 61 62 6c 65 20 74 31 20 69 73 20 73 74 6f   table t1 is sto
6570: 72 65 64 20 69 6e 73 74 65 61 64 2e 20 54 68 65  red instead. The
6580: 6e 2c 20 61 73 20 72 65 63 6f 72 64 73 20 61 72  n, as records ar
6590: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
65a0: 0a 2a 2a 20 74 68 65 20 73 6f 72 74 65 72 20 74  .** the sorter t
65b0: 6f 20 72 65 74 75 72 6e 20 74 6f 20 74 68 65 20  o return to the 
65c0: 75 73 65 72 2c 20 74 68 65 20 72 65 71 75 69 72  user, the requir
65d0: 65 64 20 76 61 6c 75 65 20 6f 66 20 62 69 67 62  ed value of bigb
65e0: 6c 6f 62 20 69 73 0a 2a 2a 20 72 65 74 72 69 65  lob is.** retrie
65f0: 76 65 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f  ved directly fro
6600: 6d 20 74 61 62 6c 65 20 74 31 2e 20 49 66 20 74  m table t1. If t
6610: 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 76 65  he values are ve
6620: 72 79 20 6c 61 72 67 65 2c 20 74 68 69 73 20 0a  ry large, this .
6630: 2a 2a 20 63 61 6e 20 62 65 20 6d 6f 72 65 20 65  ** can be more e
6640: 66 66 69 63 69 65 6e 74 20 74 68 61 6e 20 73 74  fficient than st
6650: 6f 72 69 6e 67 20 74 68 65 6d 20 64 69 72 65 63  oring them direc
6660: 74 6c 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65  tly in the sorte
6670: 72 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a  r records..**.**
6680: 20 54 68 65 20 45 78 70 72 4c 69 73 74 5f 69 74   The ExprList_it
6690: 65 6d 2e 62 53 6f 72 74 65 72 52 65 66 20 66 6c  em.bSorterRef fl
66a0: 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 65 61  ag is set for ea
66b0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
66c0: 20 70 45 4c 69 73 74 20 0a 2a 2a 20 66 6f 72 20   pEList .** for 
66d0: 77 68 69 63 68 20 74 68 65 20 73 6f 72 74 65 72  which the sorter
66e0: 2d 72 65 66 65 72 65 6e 63 65 20 6f 70 74 69 6d  -reference optim
66f0: 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  ization should b
6700: 65 20 65 6e 61 62 6c 65 64 2e 20 0a 2a 2a 20 41  e enabled. .** A
6710: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65  dditionally, the
6720: 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 5d   pSort->aDefer[]
6730: 20 61 72 72 61 79 20 69 73 20 70 6f 70 75 6c 61   array is popula
6740: 74 65 64 20 77 69 74 68 20 65 6e 74 72 69 65 73  ted with entries
6750: 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 63 75 72 73  .** for all curs
6760: 6f 72 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  ors required to 
6770: 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 73 65 6c  evaluate all sel
6780: 65 63 74 65 64 20 65 78 70 72 65 73 73 69 6f 6e  ected expression
6790: 73 2e 20 46 69 6e 61 6c 6c 79 2e 0a 2a 2a 20 6f  s. Finally..** o
67a0: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 28  utput variable (
67b0: 2a 70 70 45 78 74 72 61 29 20 69 73 20 73 65 74  *ppExtra) is set
67c0: 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f   to an expressio
67d0: 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  n list containin
67e0: 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  g.** expressions
67f0: 20 66 6f 72 20 61 6c 6c 20 65 78 74 72 61 20 50   for all extra P
6800: 4b 20 76 61 6c 75 65 73 20 74 68 61 74 20 73 68  K values that sh
6810: 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69  ould be stored i
6820: 6e 20 74 68 65 0a 2a 2a 20 73 6f 72 74 65 72 20  n the.** sorter 
6830: 72 65 63 6f 72 64 73 2e 0a 2a 2f 0a 73 74 61 74  records..*/.stat
6840: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 45 78  ic void selectEx
6850: 70 72 44 65 66 65 72 28 0a 20 20 50 61 72 73 65  prDefer(.  Parse
6860: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
6870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
6880: 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 68 65  ave any error he
6890: 72 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20  re */.  SortCtx 
68a0: 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20  *pSort,         
68b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65          /* Sorte
68c0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  r context */.  E
68d0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
68e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
68f0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
6900: 73 74 69 6e 65 64 20 66 6f 72 20 73 6f 72 74 65  stined for sorte
6910: 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  r */.  ExprList 
6920: 2a 2a 70 70 45 78 74 72 61 20 20 20 20 20 20 20  **ppExtra       
6930: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
6940: 73 69 6f 6e 73 20 74 6f 20 61 70 70 65 6e 64 20  sions to append 
6950: 74 6f 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  to sorter record
6960: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
6970: 20 20 69 6e 74 20 6e 44 65 66 65 72 20 3d 20 30    int nDefer = 0
6980: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
6990: 78 74 72 61 20 3d 20 30 3b 0a 20 20 66 6f 72 28  xtra = 0;.  for(
69a0: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
69b0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
69c0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
69d0: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
69e0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20  EList->a[i];.   
69f0: 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e   if( pItem->u.x.
6a00: 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29  iOrderByCol==0 )
6a10: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
6a20: 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  xpr = pItem->pEx
6a30: 70 72 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  pr;.      Table 
6a40: 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70  *pTab = pExpr->p
6a50: 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Tab;.      if( p
6a60: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
6a70: 55 4d 4e 20 26 26 20 70 54 61 62 20 26 26 20 21  UMN && pTab && !
6a80: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 0a  IsVirtual(pTab).
6a90: 20 20 20 20 20 20 20 26 26 20 28 70 54 61 62 2d         && (pTab-
6aa0: 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
6ab0: 6c 75 6d 6e 5d 2e 63 6f 6c 46 6c 61 67 73 20 26  lumn].colFlags &
6ac0: 20 43 4f 4c 46 4c 41 47 5f 53 4f 52 54 45 52 52   COLFLAG_SORTERR
6ad0: 45 46 29 0a 23 69 66 20 30 0a 20 20 20 20 20 20  EF).#if 0.      
6ae0: 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70 53 63      && pTab->pSc
6af0: 68 65 6d 61 20 26 26 20 70 54 61 62 2d 3e 70 53  hema && pTab->pS
6b00: 65 6c 65 63 74 3d 3d 30 20 26 26 20 21 49 73 56  elect==0 && !IsV
6b10: 69 72 74 75 61 6c 28 70 54 61 62 29 0a 23 65 6e  irtual(pTab).#en
6b20: 64 69 66 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  dif.      ){.   
6b30: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
6b40: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
6b50: 44 65 66 65 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Defer; j++){.   
6b60: 20 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74         if( pSort
6b70: 2d 3e 61 44 65 66 65 72 5b 6a 5d 2e 69 43 73 72  ->aDefer[j].iCsr
6b80: 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
6b90: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
6ba0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
6bb0: 3d 3d 6e 44 65 66 65 72 20 29 7b 0a 20 20 20 20  ==nDefer ){.    
6bc0: 20 20 20 20 20 20 69 66 28 20 6e 44 65 66 65 72        if( nDefer
6bd0: 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 53 6f 72  ==ArraySize(pSor
6be0: 74 2d 3e 61 44 65 66 65 72 29 20 29 7b 0a 20 20  t->aDefer) ){.  
6bf0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
6c00: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ue;.          }e
6c10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
6c20: 20 69 6e 74 20 6e 4b 65 79 20 3d 20 31 3b 0a 20   int nKey = 1;. 
6c30: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
6c40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e  ;.            In
6c50: 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 0a 20 20  dex *pPk = 0;.  
6c60: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 48            if( !H
6c70: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
6c80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
6c90: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
6ca0: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
6cb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
6cc0: 20 6e 4b 65 79 20 3d 20 70 50 6b 2d 3e 6e 4b 65   nKey = pPk->nKe
6cd0: 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  yCol;.          
6ce0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
6cf0: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65 79 3b  for(k=0; k<nKey;
6d00: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   k++){.         
6d10: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
6d20: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
6d30: 50 61 72 73 65 2c 20 54 4b 5f 43 4f 4c 55 4d 4e  Parse, TK_COLUMN
6d40: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
6d50: 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
6d60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
6d70: 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 20     pNew->iTable 
6d80: 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
6d90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6da0: 20 70 4e 65 77 2d 3e 70 54 61 62 20 3d 20 70 45   pNew->pTab = pE
6db0: 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
6dc0: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
6dd0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 50 6b 20 3f  >iColumn = pPk ?
6de0: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b   pPk->aiColumn[k
6df0: 5d 20 3a 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  ] : -1;.        
6e00: 20 20 20 20 20 20 20 20 70 45 78 74 72 61 20 3d          pExtra =
6e10: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
6e20: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
6e30: 45 78 74 72 61 2c 20 70 4e 65 77 29 3b 0a 20 20  Extra, pNew);.  
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
6e50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6e60: 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61          pSort->a
6e70: 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e 70 54  Defer[nDefer].pT
6e80: 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62  ab = pExpr->pTab
6e90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  ;.            pS
6ea0: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44 65 66  ort->aDefer[nDef
6eb0: 65 72 5d 2e 69 43 73 72 20 3d 20 70 45 78 70 72  er].iCsr = pExpr
6ec0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
6ed0: 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61 44 65        pSort->aDe
6ee0: 66 65 72 5b 6e 44 65 66 65 72 5d 2e 6e 4b 65 79  fer[nDefer].nKey
6ef0: 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20   = nKey;.       
6f00: 20 20 20 20 20 6e 44 65 66 65 72 2b 2b 3b 0a 20       nDefer++;. 
6f10: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6f20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 49 74     }.        pIt
6f30: 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 20 3d  em->bSorterRef =
6f40: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
6f50: 7d 0a 20 20 7d 0a 20 20 70 53 6f 72 74 2d 3e 6e  }.  }.  pSort->n
6f60: 44 65 66 65 72 20 3d 20 28 75 38 29 6e 44 65 66  Defer = (u8)nDef
6f70: 65 72 3b 0a 20 20 2a 70 70 45 78 74 72 61 20 3d  er;.  *ppExtra =
6f80: 20 70 45 78 74 72 61 3b 0a 7d 0a 23 65 6e 64 69   pExtra;.}.#endi
6f90: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
6fa0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
6fb0: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  the code for the
6fc0: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69   inside of the i
6fd0: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
6fe0: 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  a SELECT..**.** 
6ff0: 49 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67  If srcTab is neg
7000: 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20  ative, then the 
7010: 70 2d 3e 70 45 4c 69 73 74 20 65 78 70 72 65 73  p->pEList expres
7020: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
7030: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
7040: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
7050: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
7060: 66 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a  f srcTab is.** z
7070: 65 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65  ero or more, the
7080: 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64  n data is pulled
7090: 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64   from srcTab and
70a0: 20 70 2d 3e 70 45 4c 69 73 74 20 69 73 20 75 73   p->pEList is us
70b0: 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67  ed only .** to g
70c0: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
70d0: 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65   columns and the
70e0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
70f0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
7100: 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  umn..*/.static v
7110: 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  oid selectInnerL
7120: 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  oop(.  Parse *pP
7130: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
7140: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
7150: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
7160: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
7170: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
7180: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
7190: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
71a0: 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20  /.  int srcTab, 
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
71c0: 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ull data from th
71d0: 69 73 20 74 61 62 6c 65 20 69 66 20 6e 6f 6e 2d  is table if non-
71e0: 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 53 6f  negative */.  So
71f0: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
7200: 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20        /* If not 
7210: 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f  NULL, info on ho
7220: 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44  w to process ORD
7230: 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69  ER BY */.  Disti
7240: 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63  nctCtx *pDistinc
7250: 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c  t, /* If not NUL
7260: 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  L, info on how t
7270: 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e  o process DISTIN
7280: 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  CT */.  SelectDe
7290: 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20  st *pDest,      
72a0: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
72b0: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73  e of the results
72c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
72d0: 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  nue,          /*
72e0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
72f0: 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
7300: 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42   row */.  int iB
7310: 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20  reak            
7320: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
7330: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
7340: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  he inner loop */
7350: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
7360: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
7370: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61   int i;.  int ha
7380: 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  sDistinct;      
7390: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
73a0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
73b0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
73c0: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20   */.  int eDest 
73d0: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20  = pDest->eDest; 
73e0: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
73f0: 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a  ose of results *
7400: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  /.  int iParm = 
7410: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20  pDest->iSDParm; 
7420: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
7430: 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65  t to disposal me
7440: 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  thod */.  int nR
7450: 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20  esultCol;       
7460: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7470: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
7480: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66  s */.  int nPref
7490: 69 78 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  ixReg = 0;      
74a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
74b0: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
74c0: 62 65 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74  before regResult
74d0: 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c   */..  /* Usuall
74e0: 79 2c 20 72 65 67 52 65 73 75 6c 74 20 69 73 20  y, regResult is 
74f0: 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 69  the first cell i
7500: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6d 65  n an array of me
7510: 6d 6f 72 79 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  mory cells.  ** 
7520: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
7530: 75 72 72 65 6e 74 20 72 65 73 75 6c 74 20 72 6f  urrent result ro
7540: 77 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  w. In this case 
7550: 72 65 67 4f 72 69 67 20 69 73 20 73 65 74 20 74  regOrig is set t
7560: 6f 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20  o the.  ** same 
7570: 76 61 6c 75 65 2e 20 48 6f 77 65 76 65 72 2c 20  value. However, 
7580: 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  if the results a
7590: 72 65 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f  re being sent to
75a0: 20 74 68 65 20 73 6f 72 74 65 72 2c 20 74 68 65   the sorter, the
75b0: 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 66 6f 72  .  ** values for
75c0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 73   any expressions
75d0: 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 70   that are also p
75e0: 61 72 74 20 6f 66 20 74 68 65 20 73 6f 72 74 2d  art of the sort-
75f0: 6b 65 79 20 61 72 65 20 6f 6d 69 74 74 65 64 0a  key are omitted.
7600: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20 61    ** from this a
7610: 72 72 61 79 2e 20 49 6e 20 74 68 69 73 20 63 61  rray. In this ca
7620: 73 65 20 72 65 67 4f 72 69 67 20 69 73 20 73 65  se regOrig is se
7630: 74 20 74 6f 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20  t to zero.  */. 
7640: 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20   int regResult; 
7650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7660: 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20  Start of memory 
7670: 68 6f 6c 64 69 6e 67 20 63 75 72 72 65 6e 74 20  holding current 
7680: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
7690: 20 72 65 67 4f 72 69 67 3b 20 20 20 20 20 20 20   regOrig;       
76a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
76b0: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64  t of memory hold
76c0: 69 6e 67 20 66 75 6c 6c 20 72 65 73 75 6c 74 20  ing full result 
76d0: 28 6f 72 20 30 29 20 2a 2f 0a 0a 20 20 61 73 73  (or 0) */..  ass
76e0: 65 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65  ert( v );.  asse
76f0: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30  rt( p->pEList!=0
7700: 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63   );.  hasDistinc
7710: 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20  t = pDistinct ? 
7720: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
7730: 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53  Type : WHERE_DIS
7740: 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66  TINCT_NOOP;.  if
7750: 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f 72 74  ( pSort && pSort
7760: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ->pOrderBy==0 ) 
7770: 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66 28  pSort = 0;.  if(
7780: 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21 68 61   pSort==0 && !ha
7790: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
77a0: 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74 69 6e   assert( iContin
77b0: 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64  ue!=0 );.    cod
77c0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
77d0: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
77e0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c  );.  }..  /* Pul
77f0: 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  l the requested 
7800: 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20  columns..  */.  
7810: 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e  nResultCol = p->
7820: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a  pEList->nExpr;..
7830: 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64    if( pDest->iSd
7840: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  st==0 ){.    if(
7850: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
7860: 6e 50 72 65 66 69 78 52 65 67 20 3d 20 70 53 6f  nPrefixReg = pSo
7870: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  rt->pOrderBy->nE
7880: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 21  xpr;.      if( !
7890: 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67  (pSort->sortFlag
78a0: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
78b0: 53 6f 72 74 65 72 29 20 29 20 6e 50 72 65 66 69  Sorter) ) nPrefi
78c0: 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50  xReg++;.      pP
78d0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50  arse->nMem += nP
78e0: 72 65 66 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a  refixReg;.    }.
78f0: 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74      pDest->iSdst
7900: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
7910: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
7920: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
7930: 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  l;.  }else if( p
7940: 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73  Dest->iSdst+nRes
7950: 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d  ultCol > pParse-
7960: 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  >nMem ){.    /* 
7970: 54 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  This is an error
7980: 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61 74 20   condition that 
7990: 63 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f 72 20  can result, for 
79a0: 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20  example, when a 
79b0: 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e  SELECT.    ** on
79c0: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
79d0: 73 69 64 65 20 6f 66 20 61 6e 20 49 4e 53 45 52  side of an INSER
79e0: 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20  T contains more 
79f0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74  result columns t
7a00: 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65  han.    ** there
7a10: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   are columns in 
7a20: 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
7a30: 20 6c 65 66 74 2e 20 20 54 68 65 20 65 72 72 6f   left.  The erro
7a40: 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67 68 74  r will be caught
7a50: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f  .    ** and repo
7a60: 72 74 65 64 20 6c 61 74 65 72 2e 20 20 42 75 74  rted later.  But
7a70: 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65   we need to make
7a80: 20 73 75 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d   sure enough mem
7a90: 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ory is allocated
7aa0: 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64  .    ** to avoid
7ab0: 20 6f 74 68 65 72 20 73 70 75 72 69 6f 75 73 20   other spurious 
7ac0: 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20 6d 65  errors in the me
7ad0: 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70  antime. */.    p
7ae0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
7af0: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20  ResultCol;.  }. 
7b00: 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20   pDest->nSdst = 
7b10: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65  nResultCol;.  re
7b20: 67 4f 72 69 67 20 3d 20 72 65 67 52 65 73 75 6c  gOrig = regResul
7b30: 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74  t = pDest->iSdst
7b40: 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d  ;.  if( srcTab>=
7b50: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
7b60: 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  ; i<nResultCol; 
7b70: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
7b80: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7b90: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54   OP_Column, srcT
7ba0: 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74  ab, i, regResult
7bb0: 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +i);.      VdbeC
7bc0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
7bd0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   p->pEList->a[i]
7be0: 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  .zName));.    }.
7bf0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
7c00: 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b  t!=SRT_Exists ){
7c10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7c20: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
7c30: 45 52 45 4e 43 45 53 0a 20 20 20 20 45 78 70 72  ERENCES.    Expr
7c40: 4c 69 73 74 20 2a 70 45 78 74 72 61 20 3d 20 30  List *pExtra = 0
7c50: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20  ;.#endif.    /* 
7c60: 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
7c70: 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53 28  on is an EXISTS(
7c80: 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c  ...) expression,
7c90: 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20   the actual.    
7ca0: 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e  ** values return
7cb0: 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
7cc0: 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65   are not require
7cd0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 38  d..    */.    u8
7ce0: 20 65 63 65 6c 46 6c 61 67 73 3b 0a 20 20 20 20   ecelFlags;.    
7cf0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d  if( eDest==SRT_M
7d00: 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
7d10: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
7d20: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
7d30: 29 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61  ){.      ecelFla
7d40: 67 73 20 3d 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs = SQLITE_ECEL
7d50: 5f 44 55 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  _DUP;.    }else{
7d60: 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73  .      ecelFlags
7d70: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
7d80: 69 66 28 20 70 53 6f 72 74 20 26 26 20 68 61 73  if( pSort && has
7d90: 44 69 73 74 69 6e 63 74 3d 3d 30 20 26 26 20 65  Distinct==0 && e
7da0: 44 65 73 74 21 3d 53 52 54 5f 45 70 68 65 6d 54  Dest!=SRT_EphemT
7db0: 61 62 20 26 26 20 65 44 65 73 74 21 3d 53 52 54  ab && eDest!=SRT
7dc0: 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  _Table ){.      
7dd0: 2f 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  /* For each expr
7de0: 65 73 73 69 6f 6e 20 69 6e 20 70 2d 3e 70 45 4c  ession in p->pEL
7df0: 69 73 74 20 74 68 61 74 20 69 73 20 61 20 63 6f  ist that is a co
7e00: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
7e10: 69 6f 6e 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ion in.      ** 
7e20: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
7e30: 75 73 65 20 28 70 53 6f 72 74 2d 3e 70 4f 72 64  use (pSort->pOrd
7e40: 65 72 42 79 29 2c 20 73 65 74 20 74 68 65 20 61  erBy), set the a
7e50: 73 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20 20  ssociated .     
7e60: 20 2a 2a 20 69 4f 72 64 65 72 42 79 43 6f 6c 20   ** iOrderByCol 
7e70: 76 61 6c 75 65 20 74 6f 20 6f 6e 65 20 6d 6f 72  value to one mor
7e80: 65 20 74 68 61 6e 20 74 68 65 20 69 6e 64 65 78  e than the index
7e90: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
7ea0: 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65   .      ** expre
7eb0: 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74 68 65  ssion within the
7ec0: 20 73 6f 72 74 2d 6b 65 79 20 74 68 61 74 20 70   sort-key that p
7ed0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20  ushOntoSorter() 
7ee0: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20  will generate.. 
7ef0: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 61 6c 6c       ** This all
7f00: 6f 77 73 20 74 68 65 20 70 2d 3e 70 45 4c 69 73  ows the p->pELis
7f10: 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 6f 6d  t field to be om
7f20: 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  itted from the s
7f30: 6f 72 74 65 64 20 72 65 63 6f 72 64 2c 0a 20 20  orted record,.  
7f40: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 73 70      ** saving sp
7f50: 61 63 65 20 61 6e 64 20 43 50 55 20 63 79 63 6c  ace and CPU cycl
7f60: 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65 63  es.  */.      ec
7f70: 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49  elFlags |= (SQLI
7f80: 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 7c  TE_ECEL_OMITREF|
7f90: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29  SQLITE_ECEL_REF)
7fa0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53  ;.      for(i=pS
7fb0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69 3c 70  ort->nOBSat; i<p
7fc0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
7fd0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
7fe0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
7ff0: 20 20 20 20 69 66 28 20 28 6a 20 3d 20 70 53 6f      if( (j = pSo
8000: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b  rt->pOrderBy->a[
8010: 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
8020: 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ol)>0 ){.       
8030: 20 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b     p->pEList->a[
8040: 6a 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  j-1].u.x.iOrderB
8050: 79 43 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f 72 74  yCol = i+1-pSort
8060: 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 20 20  ->nOBSat;.      
8070: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64    }.      }.#ifd
8080: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
8090: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
80a0: 45 53 0a 20 20 20 20 20 20 73 65 6c 65 63 74 45  ES.      selectE
80b0: 78 70 72 44 65 66 65 72 28 70 50 61 72 73 65 2c  xprDefer(pParse,
80c0: 20 70 53 6f 72 74 2c 20 70 2d 3e 70 45 4c 69 73   pSort, p->pELis
80d0: 74 2c 20 26 70 45 78 74 72 61 29 3b 0a 20 20 20  t, &pExtra);.   
80e0: 20 20 20 69 66 28 20 70 45 78 74 72 61 20 26 26     if( pExtra &&
80f0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
8100: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a  locFailed==0 ){.
8110: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
8120: 65 72 65 20 61 72 65 20 61 6e 79 20 65 78 74 72  ere are any extr
8130: 61 20 50 4b 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  a PK columns to 
8140: 61 64 64 20 74 6f 20 74 68 65 20 73 6f 72 74 65  add to the sorte
8150: 72 20 72 65 63 6f 72 64 73 2c 0a 20 20 20 20 20  r records,.     
8160: 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 65     ** allocate e
8170: 78 74 72 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  xtra memory cell
8180: 73 20 61 6e 64 20 61 64 6a 75 73 74 20 74 68 65  s and adjust the
8190: 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a   OpenEphemeral .
81a0: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72          ** instr
81b0: 75 63 74 69 6f 6e 20 74 6f 20 61 63 63 6f 75 6e  uction to accoun
81c0: 74 20 66 6f 72 20 74 68 65 20 6c 61 72 67 65 72  t for the larger
81d0: 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20 69   records. This i
81e0: 73 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20 20 2a  s only.        *
81f0: 2a 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  * required if th
8200: 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
8210: 6f 72 65 20 57 49 54 48 4f 55 54 20 52 4f 57 49  ore WITHOUT ROWI
8220: 44 20 74 61 62 6c 65 73 20 77 69 74 68 0a 20 20  D tables with.  
8230: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6f 73 69        ** composi
8240: 74 65 20 70 72 69 6d 61 72 79 20 6b 65 79 73 20  te primary keys 
8250: 69 6e 20 74 68 65 20 53 6f 72 74 43 74 78 2e 61  in the SortCtx.a
8260: 44 65 66 65 72 5b 5d 20 61 72 72 61 79 2e 20 20  Defer[] array.  
8270: 2a 2f 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f  */.        VdbeO
8280: 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65 33  p *pOp = sqlite3
8290: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f  VdbeGetOp(v, pSo
82a0: 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65  rt->addrSortInde
82b0: 78 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  x);.        pOp-
82c0: 3e 70 32 20 2b 3d 20 28 70 45 78 74 72 61 2d 3e  >p2 += (pExtra->
82d0: 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e  nExpr - pSort->n
82e0: 44 65 66 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Defer);.        
82f0: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
8300: 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 2b 3d 20 28  ->nAllField += (
8310: 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 20 2d 20  pExtra->nExpr - 
8320: 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 29 3b 0a  pSort->nDefer);.
8330: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
8340: 6e 4d 65 6d 20 2b 3d 20 70 45 78 74 72 61 2d 3e  nMem += pExtra->
8350: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 23  nExpr;.      }.#
8360: 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 67 4f  endif.      regO
8370: 72 69 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  rig = 0;.      a
8380: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
8390: 54 5f 53 65 74 20 7c 7c 20 65 44 65 73 74 3d 3d  T_Set || eDest==
83a0: 53 52 54 5f 4d 65 6d 20 0a 20 20 20 20 20 20 20  SRT_Mem .       
83b0: 20 20 20 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52      || eDest==SR
83c0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65  T_Coroutine || e
83d0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
83e0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 52   );.    }.    nR
83f0: 65 73 75 6c 74 43 6f 6c 20 3d 20 73 71 6c 69 74  esultCol = sqlit
8400: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
8410: 73 74 28 70 50 61 72 73 65 2c 70 2d 3e 70 45 4c  st(pParse,p->pEL
8420: 69 73 74 2c 72 65 67 52 65 73 75 6c 74 2c 0a 20  ist,regResult,. 
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8450: 20 20 20 20 20 20 20 20 30 2c 65 63 65 6c 46 6c          0,ecelFl
8460: 61 67 73 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  ags);.#ifdef SQL
8470: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45  ITE_ENABLE_SORTE
8480: 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20  R_REFERENCES.   
8490: 20 69 66 28 20 70 45 78 74 72 61 20 29 7b 0a 20   if( pExtra ){. 
84a0: 20 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20       nResultCol 
84b0: 2b 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  += sqlite3ExprCo
84c0: 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 20 20  deExprList(.    
84d0: 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 45        pParse, pE
84e0: 78 74 72 61 2c 20 72 65 67 52 65 73 75 6c 74 20  xtra, regResult 
84f0: 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 30 2c  + nResultCol, 0,
8500: 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
8510: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
8520: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
8530: 64 62 2c 20 70 45 78 74 72 61 29 3b 0a 20 20 20  db, pExtra);.   
8540: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
8550: 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54 49   /* If the DISTI
8560: 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20  NCT keyword was 
8570: 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53  present on the S
8580: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
8590: 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f    ** and this ro
85a0: 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20  w has been seen 
85b0: 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20  before, then do 
85c0: 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f  not make this ro
85d0: 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74  w.  ** part of t
85e0: 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a  he result..  */.
85f0: 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e 63    if( hasDistinc
8600: 74 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  t ){.    switch(
8610: 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63   pDistinct->eTnc
8620: 74 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  tType ){.      c
8630: 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
8640: 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  CT_ORDERED: {.  
8650: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
8660: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
8670: 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69   No longer requi
8680: 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65 72 61  red OpenEphemera
8690: 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20 20 20  l instr. */.    
86a0: 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b 20 20      int iJump;  
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
86c0: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
86d0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
86e0: 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  egPrev;         
86f0: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
8700: 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  ow content */.. 
8710: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
8720: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
8730: 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f   previous row */
8740: 0a 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76  .        regPrev
8750: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
8760: 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  1;.        pPars
8770: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
8780: 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20  ltCol;..        
8790: 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4f 50  /* Change the OP
87a0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 63  _OpenEphemeral c
87b0: 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74 6f 20  oded earlier to 
87c0: 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20  an OP_Null.     
87d0: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 4d     ** sets the M
87e0: 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74 20 6f  EM_Cleared bit o
87f0: 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  n the first regi
8800: 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20  ster of the.    
8810: 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
8820: 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77 69 6c  value.  This wil
8830: 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50 5f 4e  l cause the OP_N
8840: 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79  e below to alway
8850: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 69  s.        ** fai
8860: 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69  l on the first i
8870: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
8880: 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74 68 65  loop even if the
8890: 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a   first.        *
88a0: 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c  * row is all NUL
88b0: 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  Ls..        */. 
88c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
88d0: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
88e0: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
88f0: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
8900: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
8910: 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73 74 69  eGetOp(v, pDisti
8920: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
8930: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
8940: 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20  ode = OP_Null;. 
8950: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
8960: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   1;.        pOp-
8970: 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a  >p2 = regPrev;..
8980: 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20 3d 20          iJump = 
8990: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
89a0: 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 52 65 73  ntAddr(v) + nRes
89b0: 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ultCol;.        
89c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75  for(i=0; i<nResu
89d0: 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ltCol; i++){.   
89e0: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
89f0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
8a00: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
8a10: 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
8a20: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
8a30: 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73 75       if( i<nResu
8a40: 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  ltCol-1 ){.     
8a50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8a60: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
8a70: 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  e, regResult+i, 
8a80: 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b 69  iJump, regPrev+i
8a90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
8aa0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
8ab0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
8ac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
8ad0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8ae0: 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75  , OP_Eq, regResu
8af0: 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  lt+i, iContinue,
8b00: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
8b10: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
8b20: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
8b30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8b40: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8b50: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
8b60: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
8b70: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
8b80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8b90: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
8ba0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
8bb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8bc0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8bd0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
8be0: 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70 50 61  v)==iJump || pPa
8bf0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
8c00: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
8c10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8c20: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
8c30: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
8c40: 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29  v, nResultCol-1)
8c50: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
8c60: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
8c70: 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
8c80: 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20  NCT_UNIQUE: {.  
8c90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8ca0: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
8cb0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
8cc0: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Tnct);.        b
8cd0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
8ce0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
8cf0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8d00: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
8d10: 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
8d20: 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
8d30: 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44 69  ;.        codeDi
8d40: 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
8d50: 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63  Distinct->tabTnc
8d60: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52  t, iContinue, nR
8d70: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
8d90: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
8da0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8db0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
8dc0: 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pSort==0 ){.    
8dd0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
8de0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
8df0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
8e00: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
8e10: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
8e20: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
8e30: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
8e40: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
8e50: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
8e60: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
8e70: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
8e80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
8e90: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
8ea0: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
8eb0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
8ec0: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
8ed0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
8ee0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
8ef0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8f00: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
8f10: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
8f20: 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20  sultCol, r1);.  
8f30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8f40: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
8f50: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
8f60: 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74 2c 20   r1, regResult, 
8f70: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
8f80: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
8f90: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
8fa0: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
8fb0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
8fc0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
8fd0: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
8fe0: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
8ff0: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
9000: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
9010: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
9020: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
9030: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
9040: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
9050: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
9060: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
9070: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
9080: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9090: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
90a0: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
90b0: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
90c0: 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ol);.      break
90d0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
90e0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
90f0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
9100: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
9110: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
9120: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
9130: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
9140: 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a   case SRT_Fifo:.
9150: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
9160: 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20  tFifo:.    case 
9170: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
9180: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
9190: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
91a0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
91b0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
91c0: 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20  PrefixReg+1);.  
91d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
91e0: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
91f0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9200: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
9210: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74  emTab );.      t
9220: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
9230: 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20  SRT_Fifo );.    
9240: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
9250: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
9260: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9270: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
9280: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
9290: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
92a0: 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65  ol, r1+nPrefixRe
92b0: 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
92c0: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
92d0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
92e0: 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20  _DistFifo ){.   
92f0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
9300: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
9310: 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72  stFifo, then cur
9320: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
9330: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
9340: 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c   on an ephemeral
9350: 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63   index. If the c
9360: 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c  urrent row is al
9370: 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20  ready present.  
9380: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
9390: 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72  index, do not wr
93a0: 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75  ite it to the ou
93b0: 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64  tput. If not, ad
93c0: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
93d0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20   current row to 
93e0: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72  the index and pr
93f0: 6f 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69  oceed with writi
9400: 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20  ng it to the.   
9410: 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74       ** output t
9420: 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a  able as well.  *
9430: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
9440: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
9450: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
9460: 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   4;.        sqli
9470: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
9480: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
9490: 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c  arm+1, addr, r1,
94a0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   0);.        Vdb
94b0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
94c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
94d0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
94e0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
94f0: 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73 75 6c  m+1, r1,regResul
9500: 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  t,nResultCol);. 
9510: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9520: 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sort==0 );.     
9530: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
9540: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
9550: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
9560: 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ter(pParse, pSor
9570: 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78  t, p, r1+nPrefix
9580: 52 65 67 2c 72 65 67 52 65 73 75 6c 74 2c 31 2c  Reg,regResult,1,
9590: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
95a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
95b0: 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
95c0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
95d0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
95e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
95f0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
9600: 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  iParm, r2);.    
9610: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9620: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
9630: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
9640: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
9650: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
9660: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
9670: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
9680: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
9690: 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
96a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
96b0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
96c0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
96d0: 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20  nPrefixReg+1);. 
96e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
96f0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
9700: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
9710: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
9720: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
9730: 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
9740: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
9750: 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
9760: 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
9770: 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
9780: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
9790: 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
97a0: 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
97b0: 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
97c0: 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
97d0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
97e0: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  _Set: {.      if
97f0: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
9800: 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67     /* At first g
9810: 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20  lance you would 
9820: 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f  think we could o
9830: 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a  ptimize out the.
9840: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
9850: 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65   BY in this case
9860: 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72   since the order
9870: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
9880: 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a  he set.        *
9890: 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  * does not matte
98a0: 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69  r.  But there mi
98b0: 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63  ght be a LIMIT c
98c0: 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a  lause, in which.
98d0: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
98e0: 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d  the order does m
98f0: 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  atter */.       
9900: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
9910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
9920: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
9930: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69  egResult, regOri
9940: 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e  g, nResultCol, n
9950: 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20  PrefixReg);.    
9960: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9970: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
9980: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
9990: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  se);.        ass
99a0: 65 72 74 28 20 73 71 6c 69 74 65 33 53 74 72 6c  ert( sqlite3Strl
99b0: 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66  en30(pDest->zAff
99c0: 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74 43 6f  Sdst)==nResultCo
99d0: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  l );.        sql
99e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
99f0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
9a00: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
9a10: 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20 20 20  ultCol, .       
9a20: 20 20 20 20 20 72 31 2c 20 70 44 65 73 74 2d 3e       r1, pDest->
9a30: 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73 75 6c  zAffSdst, nResul
9a40: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
9a50: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
9a60: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
9a70: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
9a80: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
9a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9aa0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
9ab0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
9ac0: 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74  m, r1, regResult
9ad0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
9ae0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
9af0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
9b00: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
9b10: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
9b20: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
9b30: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
9b40: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
9b50: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
9b60: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
9b70: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
9b80: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
9b90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9ba0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
9bb0: 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 1, iParm);.   
9bc0: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
9bd0: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
9be0: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
9bf0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
9c00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
9c10: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
9c20: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
9c30: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
9c40: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
9c50: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
9c60: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
9c70: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
9c80: 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20 61 72  emory cell or ar
9c90: 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a 20 6d  ray of .    ** m
9ca0: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20  emory cells and 
9cb0: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
9cc0: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
9cd0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
9ce0: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  Mem: {.      if(
9cf0: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
9d00: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
9d10: 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e 53 64  tCol<=pDest->nSd
9d20: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75  st );.        pu
9d30: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
9d40: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
9d50: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
9d60: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
9d70: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65  nResultCol, nPre
9d80: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
9d90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
9da0: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
9db0: 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29  ==pDest->nSdst )
9dc0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
9dd0: 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61  ( regResult==iPa
9de0: 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rm );.        /*
9df0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
9e00: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
9e10: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
9e20: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
9e30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9e40: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
9e50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
9e60: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
9e70: 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
9e80: 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e  ne:       /* Sen
9e90: 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72  d data to a co-r
9ea0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61  outine */.    ca
9eb0: 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b  se SRT_Output: {
9ec0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
9ed0: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  n the results */
9ee0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9ef0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
9f00: 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74  utine );.      t
9f10: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
9f20: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
9f30: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
9f40: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
9f50: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
9f60: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
9f70: 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52  ult, regOrig, nR
9f80: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fa0: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
9fb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44      }else if( eD
9fc0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
9fd0: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ne ){.        sq
9fe0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
9ff0: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
a000: 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
a010: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a020: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a030: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
a040: 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c  tRow, regResult,
a050: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
a060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
a070: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
a080: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
a090: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
a0a0: 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ol);.      }.   
a0b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a0c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a0d0: 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20  OMIT_CTE.    /* 
a0e0: 57 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  Write the result
a0f0: 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74  s into a priorit
a100: 79 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20  y queue that is 
a110: 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20  order according 
a120: 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d  to.    ** pDest-
a130: 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53  >pOrderBy (in pS
a140: 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50  O).  pDest->iSDP
a150: 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69  arm (in iParm) i
a160: 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72  s the cursor for
a170: 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78   an.    ** index
a180: 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72   with pSO->nExpr
a190: 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69  +2 columns.  Bui
a1a0: 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70  ld a key using p
a1b0: 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  SO for the first
a1c0: 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78  .    ** pSO->nEx
a1d0: 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  pr columns, then
a1e0: 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b   make sure all k
a1f0: 65 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62  eys are unique b
a200: 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a  y adding a.    *
a210: 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65  * final OP_Seque
a220: 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  nce column.  The
a230: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20   last column is 
a240: 74 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20  the record as a 
a250: 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  blob..    */.   
a260: 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75   case SRT_DistQu
a270: 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  eue:.    case SR
a280: 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20  T_Queue: {.     
a290: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20   int nKey;.     
a2a0: 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b   int r1, r2, r3;
a2b0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
a2c0: 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45  est = 0;.      E
a2d0: 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20  xprList *pSO;.  
a2e0: 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d      pSO = pDest-
a2f0: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
a300: 20 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a   assert( pSO );.
a310: 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f        nKey = pSO
a320: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
a330: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
a340: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
a350: 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
a360: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
a370: 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  arse, nKey+2);. 
a380: 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65       r3 = r2+nKe
a390: 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65  y+1;.      if( e
a3a0: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75  Dest==SRT_DistQu
a3b0: 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  eue ){.        /
a3c0: 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61  * If the destina
a3d0: 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75  tion is DistQueu
a3e0: 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28  e, then cursor (
a3f0: 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e  iParm+1) is open
a400: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61  .        ** on a
a410: 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61   second ephemera
a420: 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  l index that hol
a430: 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76  ds all values ev
a440: 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20  ery previously. 
a450: 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20         ** added 
a460: 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f  to the queue. */
a470: 0a 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73  .        addrTes
a480: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
a490: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
a4a0: 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30  ound, iParm+1, 0
a4b0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4d0: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65             regRe
a4e0: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
a4f0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
a500: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
a510: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
a520: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
a530: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
a540: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
a550: 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  Col, r3);.      
a560: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
a570: 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20  istQueue ){.    
a580: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a590: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
a5a0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20  nsert, iParm+1, 
a5b0: 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r3);.        sql
a5c0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
a5d0: 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
a5e0: 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20  EKRESULT);.     
a5f0: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
a600: 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a  ; i<nKey; i++){.
a610: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a620: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a630: 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20  SCopy,.         
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f   regResult + pSO
a660: 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  ->a[i].u.x.iOrde
a670: 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20  rByCol - 1,.    
a680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a690: 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20        r2+i);.   
a6a0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
a6b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a6c0: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61  OP_Sequence, iPa
a6d0: 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20  rm, r2+nKey);.  
a6e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a6f0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
a700: 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79  Record, r2, nKey
a710: 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  +2, r1);.      s
a720: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
a730: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
a740: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
a750: 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20  r2, nKey+2);.   
a760: 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20     if( addrTest 
a770: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
a780: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73  pHere(v, addrTes
a790: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
a7a0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
a7b0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
a7c0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
a7d0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
a7e0: 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a  e, r2, nKey+2);.
a7f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a800: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
a810: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
a820: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
a830: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
a840: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
a850: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
a860: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
a870: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
a880: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
a890: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
a8a0: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
a8b0: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
a8c0: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
a8d0: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
a8e0: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
a8f0: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
a900: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
a910: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
a920: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
a930: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
a940: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
a950: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
a960: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
a970: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
a980: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a990: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
a9a0: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
a9b0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
a9c0: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
a9d0: 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70   reached.  Excep
a9e0: 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65  t, if.  ** there
a9f0: 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e   is a sorter, in
aa00: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
aa10: 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61  sorter has alrea
aa20: 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20  dy limited.  ** 
aa30: 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75  the output for u
aa40: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
aa50: 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69  ort==0 && p->iLi
aa60: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
aa70: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
aa80: 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
aa90: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
aaa0: 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
aab0: 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(v);.  }.}../*.
aac0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65  ** Allocate a Ke
aad0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66  yInfo object suf
aae0: 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69  ficient for an i
aaf0: 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f  ndex of N key co
ab00: 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65  lumns and.** X e
ab10: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  xtra columns..*/
ab20: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
ab30: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71  3KeyInfoAlloc(sq
ab40: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
ab50: 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20  , int X){.  int 
ab60: 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28  nExtra = (N+X)*(
ab70: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
ab80: 2b 31 29 20 2d 20 73 69 7a 65 6f 66 28 43 6f 6c  +1) - sizeof(Col
ab90: 6c 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49 6e 66  lSeq*);.  KeyInf
aba0: 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62  o *p = sqlite3Db
abb0: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
abc0: 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
abd0: 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  + nExtra);.  if(
abe0: 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f   p ){.    p->aSo
abf0: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
ac00: 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20  p->aColl[N+X];. 
ac10: 20 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c 64 20     p->nKeyField 
ac20: 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d  = (u16)N;.    p-
ac30: 3e 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28 75 31  >nAllField = (u1
ac40: 36 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70 2d 3e  6)(N+X);.    p->
ac50: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
ac60: 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20     p->db = db;. 
ac70: 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a     p->nRef = 1;.
ac80: 20 20 20 20 6d 65 6d 73 65 74 28 26 70 5b 31 5d      memset(&p[1]
ac90: 2c 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20  , 0, nExtra);.  
aca0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
acb0: 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
acc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
acd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
ace0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62  ate a KeyInfo ob
acf0: 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ject.*/.void sql
ad00: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
ad10: 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20  (KeyInfo *p){.  
ad20: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  if( p ){.    ass
ad30: 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29  ert( p->nRef>0 )
ad40: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b  ;.    p->nRef--;
ad50: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66  .    if( p->nRef
ad60: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44 62 46  ==0 ) sqlite3DbF
ad70: 72 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70 29 3b  reeNN(p->db, p);
ad80: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
ad90: 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  ke a new pointer
ada0: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62   to a KeyInfo ob
adb0: 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  ject.*/.KeyInfo 
adc0: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  *sqlite3KeyInfoR
add0: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
ade0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
adf0: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
ae00: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b   );.    p->nRef+
ae10: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
ae20: 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  p;.}..#ifdef SQL
ae30: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
ae40: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
ae50: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
ae60: 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20  can be change.  
ae70: 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  The KeyInfo obje
ae80: 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62  ct.** can only b
ae90: 65 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 69  e changed if thi
aea0: 73 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67  s is just a sing
aeb0: 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  le reference to 
aec0: 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  the object..**.*
aed0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
aee0: 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69  s used only insi
aef0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
af00: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
af10: 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  t sqlite3KeyInfo
af20: 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49  IsWriteable(KeyI
af30: 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20  nfo *p){ return 
af40: 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65  p->nRef==1; }.#e
af50: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
af60: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  EBUG */../*.** G
af70: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
af80: 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74  on list, generat
af90: 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  e a KeyInfo stru
afa0: 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72  cture that recor
afb0: 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74  ds.** the collat
afc0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
afd0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
afe0: 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73   in that express
aff0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
b000: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
b010: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  is an ORDER BY o
b020: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
b030: 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  e then the resul
b040: 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20  ting.** KeyInfo 
b050: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
b060: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
b070: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
b080: 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20  ual index to.** 
b090: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63  implement that c
b0a0: 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45  lause.  If the E
b0b0: 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72  xprList is the r
b0c0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
b0d0: 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68  ELECT.** then th
b0e0: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
b0f0: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
b100: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
b110: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a  ing a virtual.**
b120: 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d   index to implem
b130: 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74  ent a DISTINCT t
b140: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  est..**.** Space
b150: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79   to hold the Key
b160: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
b170: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
b180: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
b190: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
b1a0: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
b1b0: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
b1c0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
b1d0: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
b1e0: 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  freed..*/.static
b1f0: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
b200: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  oFromExprList(. 
b210: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
b220: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
b230: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
b240: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
b250: 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b     /* Form the K
b260: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72  eyInfo object fr
b270: 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74  om this ExprList
b280: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
b290: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
b2a0: 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f  gin with this co
b2b0: 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f  lumn of pList */
b2c0: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20  .  int nExtra   
b2d0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
b2e0: 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63  his many extra c
b2f0: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e  olumns to the en
b300: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  d */.){.  int nE
b310: 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  xpr;.  KeyInfo *
b320: 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  pInfo;.  struct 
b330: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
b340: 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
b350: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
b360: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45  ;.  int i;..  nE
b370: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  xpr = pList->nEx
b380: 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71  pr;.  pInfo = sq
b390: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
b3a0: 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53 74 61  c(db, nExpr-iSta
b3b0: 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20  rt, nExtra+1);. 
b3c0: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
b3d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b3e0: 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
b3f0: 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20  ble(pInfo) );.  
b400: 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20    for(i=iStart, 
b410: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69  pItem=pList->a+i
b420: 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20  Start; i<nExpr; 
b430: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
b440: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c       pInfo->aCol
b450: 6c 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 73 71  l[i-iStart] = sq
b460: 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
b470: 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
b480: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
b490: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
b4a0: 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 49  r[i-iStart] = pI
b4b0: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  tem->sortOrder;.
b4c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
b4d0: 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a  rn pInfo;.}../*.
b4e0: 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  ** Name of the c
b4f0: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74  onnection operat
b500: 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72  or, used for err
b510: 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a  or messages..*/.
b520: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
b530: 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  r *selectOpName(
b540: 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20  int id){.  char 
b550: 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64  *z;.  switch( id
b560: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
b570: 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22  ALL:       z = "
b580: 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72  UNION ALL";   br
b590: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
b5a0: 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20  _INTERSECT: z = 
b5b0: 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62  "INTERSECT";   b
b5c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
b5d0: 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d  K_EXCEPT:    z =
b5e0: 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20   "EXCEPT";      
b5f0: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
b600: 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20  lt:           z 
b610: 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20  = "UNION";      
b620: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
b630: 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64  turn z;.}..#ifnd
b640: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
b650: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c  XPLAIN./*.** Unl
b660: 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20  ess an "EXPLAIN 
b670: 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d  QUERY PLAN" comm
b680: 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f  and is being pro
b690: 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e  cessed, this fun
b6a0: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f  ction.** is a no
b6b0: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
b6c0: 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65  it adds a single
b6d0: 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74   row of output t
b6e0: 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74  o the EQP result
b6f0: 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63  ,.** where the c
b700: 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  aption is of the
b710: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22   form:.**.**   "
b720: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
b730: 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77  FOR xxx".**.** w
b740: 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20  here xxx is one 
b750: 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22  of "DISTINCT", "
b760: 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52  ORDER BY" or "GR
b770: 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79  OUP BY". Exactly
b780: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74   which.** is det
b790: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a  ermined by the z
b7a0: 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a  Usage argument..
b7b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
b7c0: 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
b7d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
b7e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67  onst char *zUsag
b7f0: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  e){.  if( pParse
b800: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
b810: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
b820: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
b830: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
b840: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
b850: 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20 54 45  rse->db, "USE TE
b860: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73  MP B-TREE FOR %s
b870: 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20 20 20  ", zUsage);.    
b880: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b890: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
b8a0: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
b8b0: 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
b8c0: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
b8d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
b8e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f   expression b to
b8f0: 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63   lvalue a. A sec
b900: 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73  ond, no-op, vers
b910: 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72  ion of this macr
b920: 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64  o.** is provided
b930: 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49   when SQLITE_OMI
b940: 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66  T_EXPLAIN is def
b950: 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77  ined. This allow
b960: 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e  s the code.** in
b970: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
b980: 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65   to assign value
b990: 73 20 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d  s to structure m
b9a0: 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20  ember variables 
b9b0: 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69  that.** only exi
b9c0: 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  st if SQLITE_OMI
b9d0: 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74  T_EXPLAIN is not
b9e0: 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74   defined without
b9f0: 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a   polluting the.*
ba00: 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e  * code with #ifn
ba10: 64 65 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a  def directives..
ba20: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
ba30: 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c  ainSetInteger(a,
ba40: 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65   b) a = b..#else
ba50: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
ba60: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
ba70: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
ba80: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
ba90: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
baa0: 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23  TempTable(y,z).#
bab0: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
bac0: 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23  etInteger(y,z).#
bad0: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
bae0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
baf0: 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64 65 66  EXPLAIN) && !def
bb00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
bb10: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
bb20: 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61  )./*.** Unless a
bb30: 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59  n "EXPLAIN QUERY
bb40: 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69   PLAN" command i
bb50: 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  s being processe
bb60: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
bb70: 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  .** is a no-op. 
bb80: 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64  Otherwise, it ad
bb90: 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ds a single row 
bba0: 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65  of output to the
bbb0: 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20   EQP result,.** 
bbc0: 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f  where the captio
bbd0: 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74  n is of one of t
bbe0: 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a  he two forms:.**
bbf0: 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45  .**   "COMPOSITE
bc00: 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62   SUBQUERIES iSub
bc10: 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f 70 29  1 and iSub2 (op)
bc20: 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54  ".**   "COMPOSIT
bc30: 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75  E SUBQUERIES iSu
bc40: 62 31 20 61 6e 64 20 69 53 75 62 32 20 55 53 49  b1 and iSub2 USI
bc50: 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28  NG TEMP B-TREE (
bc60: 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  op)".**.** where
bc70: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
bc80: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
bc90: 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
bca0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
bcb0: 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
bcc0: 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69 73 20  ters, and op is 
bcd0: 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65  the text represe
bce0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ntation of the p
bcf0: 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74  arameter.** of t
bd00: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68  he same name. Th
bd10: 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f 70 22  e parameter "op"
bd20: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
bd30: 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
bd40: 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52  EPT,.** TK_INTER
bd50: 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20  SECT or TK_ALL. 
bd60: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69  The first form i
bd70: 73 20 75 73 65 64 20 69 66 20 61 72 67 75 6d 65  s used if argume
bd80: 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20 0a 2a  nt bUseTmp is .*
bd90: 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68 65 20  * false, or the 
bda0: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69  second form if i
bdb0: 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  t is true..*/.st
bdc0: 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
bdd0: 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50 61  nComposite(.  Pa
bde0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
be00: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
be10: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
be40: 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
be50: 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20  T etc. */.  int 
be60: 69 53 75 62 31 2c 20 20 20 20 20 20 20 20 20 20  iSub1,          
be70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
be80: 75 62 71 75 65 72 79 20 69 64 20 31 20 2a 2f 0a  ubquery id 1 */.
be90: 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20 20 20    int iSub2,    
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
beb0: 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64    /* Subquery id
bec0: 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65   2 */.  int bUse
bed0: 54 6d 70 20 20 20 20 20 20 20 20 20 20 20 20 20  Tmp             
bee0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
bef0: 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20  if a temp table 
bf00: 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20  was used */.){. 
bf10: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f   assert( op==TK_
bf20: 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  UNION || op==TK_
bf30: 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b  EXCEPT || op==TK
bf40: 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f 70  _INTERSECT || op
bf50: 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66  ==TK_ALL );.  if
bf60: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
bf70: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65  n==2 ){.    Vdbe
bf80: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
bf90: 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  dbe;.    char *z
bfa0: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
bfb0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70 50  intf(.        pP
bfc0: 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f  arse->db, "COMPO
bfd0: 55 4e 44 20 53 55 42 51 55 45 52 49 45 53 20 25  UND SUBQUERIES %
bfe0: 64 20 41 4e 44 20 25 64 20 25 73 28 25 73 29 22  d AND %d %s(%s)"
bff0: 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 0a  , iSub1, iSub2,.
c000: 20 20 20 20 20 20 20 20 62 55 73 65 54 6d 70 3f          bUseTmp?
c010: 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52  "USING TEMP B-TR
c020: 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f  EE ":"", selectO
c030: 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b  pName(op).    );
c040: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c050: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
c060: 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
c070: 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
c080: 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
c090: 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a  ;.  }.}.#else./*
c0a0: 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20   No-op versions 
c0b0: 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58  of the explainXX
c0c0: 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  X() functions an
c0d0: 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64  d macros. */.# d
c0e0: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d  efine explainCom
c0f0: 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a  posite(v,w,x,y,z
c100: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
c110: 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  If the inner loo
c120: 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  p was generated 
c130: 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c  using a non-null
c140: 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65   pOrderBy argume
c150: 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  nt,.** then the 
c160: 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61  results were pla
c170: 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e  ced in a sorter.
c180: 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70    After the loop
c190: 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a   is terminated.*
c1a0: 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e  * we need to run
c1b0: 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20   the sorter and 
c1c0: 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c  output the resul
c1d0: 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ts.  The followi
c1e0: 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  ng.** routine ge
c1f0: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
c200: 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68   needed to do th
c210: 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  at..*/.static vo
c220: 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54  id generateSortT
c230: 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ail(.  Parse *pP
c240: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
c250: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
c260: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
c270: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
c280: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
c290: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20  SortCtx *pSort, 
c2a0: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
c2b0: 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   on the ORDER BY
c2c0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
c2d0: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f   nColumn,      /
c2e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
c2f0: 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  mns of data */. 
c300: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
c310: 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  st /* Write the 
c320: 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68  sorted results h
c330: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ere */.){.  Vdbe
c340: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
c350: 64 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  dbe;            
c360: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c370: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
c380: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  nt */.  int addr
c390: 42 72 65 61 6b 20 3d 20 70 53 6f 72 74 2d 3e 6c  Break = pSort->l
c3a0: 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20  abelDone;       
c3b0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
c3c0: 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a  e to exit loop *
c3d0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
c3e0: 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
c3f0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
c400: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f   /* Jump here fo
c410: 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a  r next cycle */.
c420: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
c430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c440: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6f 75 74 70    /* Top of outp
c450: 75 74 20 6c 6f 6f 70 2e 20 4a 75 6d 70 20 66 6f  ut loop. Jump fo
c460: 72 20 4e 65 78 74 2e 20 2a 2f 0a 20 20 69 6e 74  r Next. */.  int
c470: 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20   addrOnce = 0;. 
c480: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 45 78 70   int iTab;.  Exp
c490: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
c4a0: 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  = pSort->pOrderB
c4b0: 79 3b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  y;.  int eDest =
c4c0: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20   pDest->eDest;. 
c4d0: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
c4e0: 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69  st->iSDParm;.  i
c4f0: 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74  nt regRow;.  int
c500: 20 72 65 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74   regRowid;.  int
c510: 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 4b 65   iCol;.  int nKe
c520: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
c530: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c540: 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e  er of key column
c550: 73 20 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f  s in sorter reco
c560: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72  rd */.  int iSor
c570: 74 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  tTab;           
c580: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65          /* Sorte
c590: 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64  r cursor to read
c5a0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
c5b0: 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20 20  ;.  int bSeq;   
c5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
c5e0: 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e 63  orter record inc
c5f0: 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20 2a  ludes seq. no. *
c600: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 4b 65 79 20  /.  int nRefKey 
c610: 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 45 78  = 0;.  struct Ex
c620: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75  prList_item *aOu
c630: 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  tEx = p->pEList-
c640: 3e 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  >a;..  assert( a
c650: 64 64 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20  ddrBreak<0 );.  
c660: 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  if( pSort->label
c670: 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c  BkOut ){.    sql
c680: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
c690: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
c6a0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
c6b0: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
c6c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c6d0: 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 42 72 65  eGoto(v, addrBre
c6e0: 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ak);.    sqlite3
c6f0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
c700: 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  (v, pSort->label
c710: 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  BkOut);.  }..#if
c720: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c730: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
c740: 43 45 53 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e  CES.  /* Open an
c750: 79 20 63 75 72 73 6f 72 73 20 6e 65 65 64 65 64  y cursors needed
c760: 20 66 6f 72 20 73 6f 72 74 65 72 2d 72 65 66 65   for sorter-refe
c770: 72 65 6e 63 65 20 65 78 70 72 65 73 73 69 6f 6e  rence expression
c780: 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  s */.  for(i=0; 
c790: 69 3c 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 3b  i<pSort->nDefer;
c7a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65   i++){.    Table
c7b0: 20 2a 70 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e   *pTab = pSort->
c7c0: 61 44 65 66 65 72 5b 69 5d 2e 70 54 61 62 3b 0a  aDefer[i].pTab;.
c7d0: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
c7e0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
c7f0: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
c800: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
c810: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
c820: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ble(pParse, pSor
c830: 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 69 43 73  t->aDefer[i].iCs
c840: 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  r, iDb, pTab, OP
c850: 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
c860: 6e 52 65 66 4b 65 79 20 3d 20 4d 41 58 28 6e 52  nRefKey = MAX(nR
c870: 65 66 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 61 44  efKey, pSort->aD
c880: 65 66 65 72 5b 69 5d 2e 6e 4b 65 79 29 3b 0a 20  efer[i].nKey);. 
c890: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 54 61   }.#endif..  iTa
c8a0: 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  b = pSort->iECur
c8b0: 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74  sor;.  if( eDest
c8c0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
c8d0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
c8e0: 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tine || eDest==S
c8f0: 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65  RT_Mem ){.    re
c900: 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20  gRowid = 0;.    
c910: 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e  regRow = pDest->
c920: 69 53 64 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iSdst;.  }else{.
c930: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73      regRowid = s
c940: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
c950: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 65  (pParse);.    re
c960: 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65  gRow = sqlite3Ge
c970: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
c980: 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 7d  e, nColumn);.  }
c990: 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72  .  nKey = pOrder
c9a0: 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72  By->nExpr - pSor
c9b0: 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28  t->nOBSat;.  if(
c9c0: 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67   pSort->sortFlag
c9d0: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
c9e0: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 69 6e  Sorter ){.    in
c9f0: 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b  t regSortOut = +
ca00: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
ca10: 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 70 50     iSortTab = pP
ca20: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
ca30: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62    if( pSort->lab
ca40: 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20  elBkOut ){.     
ca50: 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69   addrOnce = sqli
ca60: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
ca70: 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43   OP_Once); VdbeC
ca80: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
ca90: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
caa0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
cab0: 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f 72 74 54  enPseudo, iSortT
cac0: 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20  ab, regSortOut, 
cad0: 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 2b 31 2b  .        nKey+1+
cae0: 6e 43 6f 6c 75 6d 6e 2b 6e 52 65 66 4b 65 79 29  nColumn+nRefKey)
caf0: 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4f 6e  ;.    if( addrOn
cb00: 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ce ) sqlite3Vdbe
cb10: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
cb20: 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64 64 72 20  Once);.    addr 
cb30: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
cb40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
cb50: 72 74 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20  rterSort, iTab, 
cb60: 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20  addrBreak);.    
cb70: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
cb80: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
cb90: 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61  v, p->iOffset, a
cba0: 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  ddrContinue);.  
cbb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cbc0: 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op3(v, OP_Sorter
cbd0: 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67 53  Data, iTab, regS
cbe0: 6f 72 74 4f 75 74 2c 20 69 53 6f 72 74 54 61 62  ortOut, iSortTab
cbf0: 29 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 30 3b  );.    bSeq = 0;
cc00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64  .  }else{.    ad
cc10: 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  dr = 1 + sqlite3
cc20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
cc30: 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64  _Sort, iTab, add
cc40: 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  rBreak); VdbeCov
cc50: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f  erage(v);.    co
cc60: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
cc70: 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
cc80: 69 6e 75 65 29 3b 0a 20 20 20 20 69 53 6f 72 74  inue);.    iSort
cc90: 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Tab = iTab;.    
cca0: 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  bSeq = 1;.  }.  
ccb0: 66 6f 72 28 69 3d 30 2c 20 69 43 6f 6c 3d 6e 4b  for(i=0, iCol=nK
ccc0: 65 79 2b 62 53 65 71 2d 31 3b 20 69 3c 6e 43 6f  ey+bSeq-1; i<nCo
ccd0: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 23 69 66 64  lumn; i++){.#ifd
cce0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
ccf0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
cd00: 45 53 0a 20 20 20 20 69 66 28 20 61 4f 75 74 45  ES.    if( aOutE
cd10: 78 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65 66 20  x[i].bSorterRef 
cd20: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6e 64  ) continue;.#end
cd30: 69 66 0a 20 20 20 20 69 66 28 20 61 4f 75 74 45  if.    if( aOutE
cd40: 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  x[i].u.x.iOrderB
cd50: 79 43 6f 6c 3d 3d 30 20 29 20 69 43 6f 6c 2b 2b  yCol==0 ) iCol++
cd60: 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
cd70: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45  ITE_ENABLE_SORTE
cd80: 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 69  R_REFERENCES.  i
cd90: 66 28 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72  f( pSort->nDefer
cda0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4b 65 79   ){.    int iKey
cdb0: 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 69   = iCol+1;.    i
cdc0: 6e 74 20 72 65 67 4b 65 79 20 3d 20 73 71 6c 69  nt regKey = sqli
cdd0: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
cde0: 70 50 61 72 73 65 2c 20 6e 52 65 66 4b 65 79 29  pParse, nRefKey)
cdf0: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
ce00: 69 3c 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 3b  i<pSort->nDefer;
ce10: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
ce20: 20 69 43 73 72 20 3d 20 70 53 6f 72 74 2d 3e 61   iCsr = pSort->a
ce30: 44 65 66 65 72 5b 69 5d 2e 69 43 73 72 3b 0a 20  Defer[i].iCsr;. 
ce40: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
ce50: 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72   = pSort->aDefer
ce60: 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [i].pTab;.      
ce70: 69 6e 74 20 6e 4b 65 79 20 3d 20 70 53 6f 72 74  int nKey = pSort
ce80: 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e 4b 65 79  ->aDefer[i].nKey
ce90: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
cea0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
ceb0: 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 73 72 29 3b  _NullRow, iCsr);
cec0: 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f  .      if( HasRo
ced0: 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
cee0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cef0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
cf00: 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69  umn, iSortTab, i
cf10: 4b 65 79 2b 2b 2c 20 72 65 67 4b 65 79 29 3b 0a  Key++, regKey);.
cf20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
cf30: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
cf40: 53 65 65 6b 52 6f 77 69 64 2c 20 69 43 73 72 2c  SeekRowid, iCsr,
cf50: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71   .            sq
cf60: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
cf70: 41 64 64 72 28 76 29 2b 31 2c 20 72 65 67 4b 65  Addr(v)+1, regKe
cf80: 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  y);.      }else{
cf90: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  .        int k;.
cfa0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a 6d 70          int iJmp
cfb0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
cfc0: 28 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  ( sqlite3Primary
cfd0: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 2d 3e  KeyIndex(pTab)->
cfe0: 6e 4b 65 79 43 6f 6c 3d 3d 6e 4b 65 79 20 29 3b  nKeyCol==nKey );
cff0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  .        for(k=0
d000: 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b 29 7b 0a  ; k<nKey; k++){.
d010: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d020: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d030: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54  P_Column, iSortT
d040: 61 62 2c 20 69 4b 65 79 2b 2b 2c 20 72 65 67 4b  ab, iKey++, regK
d050: 65 79 2b 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d  ey+k);.        }
d060: 0a 20 20 20 20 20 20 20 20 69 4a 6d 70 20 3d 20  .        iJmp = 
d070: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
d080: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
d090: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d0a0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 65  dOp4Int(v, OP_Se
d0b0: 65 6b 47 45 2c 20 69 43 73 72 2c 20 69 4a 6d 70  ekGE, iCsr, iJmp
d0c0: 2b 32 2c 20 72 65 67 4b 65 79 2c 20 6e 4b 65 79  +2, regKey, nKey
d0d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d0e0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
d0f0: 76 2c 20 4f 50 5f 49 64 78 4c 45 2c 20 69 43 73  v, OP_IdxLE, iCs
d100: 72 2c 20 69 4a 6d 70 2b 33 2c 20 72 65 67 4b 65  r, iJmp+3, regKe
d110: 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, nKey);.      
d120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d130: 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
d140: 77 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  w, iCsr);.      
d150: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
d160: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
d170: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 4b  nge(pParse, regK
d180: 65 79 2c 20 6e 52 65 66 4b 65 79 29 3b 0a 20 20  ey, nRefKey);.  
d190: 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69  }.#endif.  for(i
d1a0: 3d 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 69 3e 3d 30  =nColumn-1; i>=0
d1b0: 3b 20 69 2d 2d 29 7b 0a 23 69 66 64 65 66 20 53  ; i--){.#ifdef S
d1c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
d1d0: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20  TER_REFERENCES. 
d1e0: 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69 5d     if( aOutEx[i]
d1f0: 2e 62 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20  .bSorterRef ){. 
d200: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d210: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4f 75  Code(pParse, aOu
d220: 74 45 78 5b 69 5d 2e 70 45 78 70 72 2c 20 72 65  tEx[i].pExpr, re
d230: 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 7d 65 6c  gRow+i);.    }el
d240: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
d250: 20 20 20 20 20 20 69 6e 74 20 69 52 65 61 64 3b        int iRead;
d260: 0a 20 20 20 20 20 20 69 66 28 20 61 4f 75 74 45  .      if( aOutE
d270: 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  x[i].u.x.iOrderB
d280: 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  yCol ){.        
d290: 69 52 65 61 64 20 3d 20 61 4f 75 74 45 78 5b 69  iRead = aOutEx[i
d2a0: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
d2b0: 6c 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  l-1;.      }else
d2c0: 7b 0a 20 20 20 20 20 20 20 20 69 52 65 61 64 20  {.        iRead 
d2d0: 3d 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 20 20  = iCol--;.      
d2e0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
d2f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d300: 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62  Column, iSortTab
d310: 2c 20 69 52 65 61 64 2c 20 72 65 67 52 6f 77 2b  , iRead, regRow+
d320: 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  i);.      VdbeCo
d330: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
d340: 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 3f  aOutEx[i].zName?
d350: 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20  aOutEx[i].zName 
d360: 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53 70 61  : aOutEx[i].zSpa
d370: 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n));.    }.  }. 
d380: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
d390: 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  {.    case SRT_T
d3a0: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
d3b0: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
d3c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d3d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
d3e0: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65  Rowid, iParm, re
d3f0: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
d400: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d410: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
d420: 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65  Parm, regRow, re
d430: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
d440: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
d450: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
d460: 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61  END);.      brea
d470: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
d480: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
d490: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53  QUERY.    case S
d4a0: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
d4b0: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
d4c0: 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
d4d0: 28 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74  (pDest->zAffSdst
d4e0: 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
d4f0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
d500: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
d510: 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  egRow, nColumn, 
d520: 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20 20 20  regRowid,.      
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d540: 20 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73    pDest->zAffSds
d550: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
d560: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
d570: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
d580: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  e(pParse, regRow
d590: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
d5a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d5b0: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
d5c0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
d5d0: 65 67 52 6f 77 69 64 2c 20 72 65 67 52 6f 77 2c  egRowid, regRow,
d5e0: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
d5f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
d600: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
d610: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  {.      /* The L
d620: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
d630: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
d640: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
d650: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d660: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
d670: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
d680: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
d690: 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d  Output || eDest=
d6a0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
d6b0: 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ; .      testcas
d6c0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  e( eDest==SRT_Ou
d6d0: 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65  tput );.      te
d6e0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
d6f0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a  RT_Coroutine );.
d700: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
d710: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
d720: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d730: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
d740: 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d  esultRow, pDest-
d750: 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29  >iSdst, nColumn)
d760: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d770: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
d780: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
d790: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e   pDest->iSdst, n
d7a0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
d7b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
d7c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
d7d0: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
d7e0: 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
d7f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
d800: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
d810: 66 28 20 72 65 67 52 6f 77 69 64 20 29 7b 0a 20  f( regRowid ){. 
d820: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
d830: 54 5f 53 65 74 20 29 7b 0a 20 20 20 20 20 20 73  T_Set ){.      s
d840: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
d850: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
d860: 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  egRow, nColumn);
d870: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d880: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
d890: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
d8a0: 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 7d 0a 20  regRow);.    }. 
d8b0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
d8c0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
d8d0: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a   regRowid);.  }.
d8e0: 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20    /* The bottom 
d8f0: 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f  of the loop.  */
d900: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
d910: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
d920: 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69  drContinue);.  i
d930: 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c  f( pSort->sortFl
d940: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
d950: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
d960: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d970: 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65  2(v, OP_SorterNe
d980: 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b  xt, iTab, addr);
d990: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
d9a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
d9b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d9c0: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
d9d0: 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f  b, addr); VdbeCo
d9e0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
d9f0: 20 69 66 28 20 70 53 6f 72 74 2d 3e 72 65 67 52   if( pSort->regR
da00: 65 74 75 72 6e 20 29 20 73 71 6c 69 74 65 33 56  eturn ) sqlite3V
da10: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
da20: 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72  Return, pSort->r
da30: 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c  egReturn);.  sql
da40: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
da50: 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61  abel(v, addrBrea
da60: 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  k);.}../*.** Ret
da70: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
da80: 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69   a string contai
da90: 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72  ning the 'declar
daa0: 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74  ation type' of t
dab0: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
dac0: 20 70 45 78 70 72 2e 20 54 68 65 20 73 74 72 69   pExpr. The stri
dad0: 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61 74 65  ng may be treate
dae0: 64 20 61 73 20 73 74 61 74 69 63 20 62 79 20 74  d as static by t
daf0: 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
db00: 20 41 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74   Also try to est
db10: 69 6d 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f  imate the size o
db20: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76  f the returned v
db30: 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20  alue and return 
db40: 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69  that.** result i
db50: 6e 20 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a  n *pEstWidth..**
db60: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
db70: 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20  ion type is the 
db80: 65 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64  exact datatype d
db90: 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63  efinition extrac
dba0: 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ted from the.** 
dbb0: 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20  original CREATE 
dbc0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
dbd0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
dbe0: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54  n is a column. T
dbf0: 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f  he.** declaratio
dc00: 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57  n type for a ROW
dc10: 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45  ID field is INTE
dc20: 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65  GER. Exactly whe
dc30: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  n an expression.
dc40: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
dc50: 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65   a column can be
dc60: 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20   complex in the 
dc70: 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71  presence of subq
dc80: 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72  ueries. The.** r
dc90: 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73  esult-set expres
dca0: 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74  sion in all of t
dcb0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c  he following SEL
dcc0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
dcd0: 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64  s .** considered
dce0: 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69   a column by thi
dcf0: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
dd00: 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46  *   SELECT col F
dd10: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
dd20: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
dd30: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
dd40: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
dd50: 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a  ol FROM tbl);.**
dd60: 20 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52     SELECT abc FR
dd70: 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41  OM (SELECT col A
dd80: 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b  S abc FROM tbl);
dd90: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c  .** .** The decl
dda0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
ddb0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
ddc0: 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c  other than a col
ddd0: 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  umn is NULL..**.
dde0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ddf0: 68 61 73 20 65 69 74 68 65 72 20 33 20 6f 72 20  has either 3 or 
de00: 36 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 70  6 parameters dep
de10: 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
de20: 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  r or not.** the 
de30: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
de40: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f  LUMN_METADATA co
de50: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
de60: 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69  n is used..*/.#i
de70: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
de80: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
de90: 54 41 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75  TA.# define colu
dea0: 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45  mnType(A,B,C,D,E
deb0: 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c  ) columnTypeImpl
dec0: 28 41 2c 42 2c 43 2c 44 2c 45 29 0a 23 65 6c 73  (A,B,C,D,E).#els
ded0: 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64  e /* if !defined
dee0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
def0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20  OLUMN_METADATA) 
df00: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75  */.# define colu
df10: 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45  mnType(A,B,C,D,E
df20: 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c  ) columnTypeImpl
df30: 28 41 2c 42 29 0a 23 65 6e 64 69 66 0a 73 74 61  (A,B).#endif.sta
df40: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
df50: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a  columnTypeImpl(.
df60: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
df70: 4e 43 2c 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  NC, .#ifndef SQL
df80: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
df90: 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 45 78 70  N_METADATA.  Exp
dfa0: 72 20 2a 70 45 78 70 72 0a 23 65 6c 73 65 0a 20  r *pExpr.#else. 
dfb0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20   Expr *pExpr,.  
dfc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
dfd0: 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63  rigDb,.  const c
dfe0: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c  har **pzOrigTab,
dff0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
e000: 70 7a 4f 72 69 67 43 6f 6c 0a 23 65 6e 64 69 66  pzOrigCol.#endif
e010: 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  .){.  char const
e020: 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69   *zType = 0;.  i
e030: 6e 74 20 6a 3b 0a 23 69 66 64 65 66 20 53 51 4c  nt j;.#ifdef SQL
e040: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
e050: 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63 68 61  N_METADATA.  cha
e060: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62  r const *zOrigDb
e070: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
e080: 73 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30  st *zOrigTab = 0
e090: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
e0a0: 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65  zOrigCol = 0;.#e
e0b0: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
e0c0: 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 61 73  pExpr!=0 );.  as
e0d0: 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c  sert( pNC->pSrcL
e0e0: 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ist!=0 );.  asse
e0f0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
e100: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20  K_AGG_COLUMN ); 
e110: 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
e120: 20 72 75 6e 65 73 20 62 65 66 6f 72 65 20 61 67   runes before ag
e130: 67 72 65 67 61 74 65 73 0a 20 20 20 20 20 20 20  gregates.       
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e160: 2a 2a 20 61 72 65 20 70 72 6f 63 65 73 73 65 64  ** are processed
e170: 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 45   */.  switch( pE
e180: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
e190: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
e1a0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  .      /* The ex
e1b0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
e1c0: 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65  lumn. Locate the
e1d0: 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d   table the colum
e1e0: 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20  n is being.     
e1f0: 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72   ** extracted fr
e200: 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78  om in NameContex
e210: 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73  t.pSrcList. This
e220: 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65   table may be re
e230: 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  al.      ** data
e240: 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20  base table or a 
e250: 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20  subquery..      
e260: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
e270: 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pTab = 0;       
e280: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74       /* Table st
e290: 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69  ructure column i
e2a0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
e2b0: 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
e2c0: 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20   *pS = 0;       
e2d0: 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20        /* Select 
e2e0: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78  the column is ex
e2f0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a  tracted from */.
e300: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
e310: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
e320: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
e330: 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a  lumn in pTab */.
e340: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43        while( pNC
e350: 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20   && !pTab ){.   
e360: 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54       SrcList *pT
e370: 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  abList = pNC->pS
e380: 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  rcList;.        
e390: 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69  for(j=0;j<pTabLi
e3a0: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
e3b0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
e3c0: 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  or!=pExpr->iTabl
e3d0: 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20  e;j++);.        
e3e0: 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  if( j<pTabList->
e3f0: 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  nSrc ){.        
e400: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
e410: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
e420: 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61          pS = pTa
e430: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c  bList->a[j].pSel
e440: 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ect;.        }el
e450: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
e460: 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a  C = pNC->pNext;.
e470: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e480: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  }..      if( pTa
e490: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
e4a0: 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20  /* At one time, 
e4b0: 63 6f 64 65 20 73 75 63 68 20 61 73 20 22 53 45  code such as "SE
e4c0: 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68  LECT new.x" with
e4d0: 69 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f 75  in a trigger wou
e4e0: 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ld.        ** ca
e4f0: 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69  use this conditi
e500: 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63  on to run.  Sinc
e510: 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20  e then, we have 
e520: 72 65 73 74 72 75 63 74 75 72 65 64 20 68 6f 77  restructured how
e530: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67  .        ** trig
e540: 67 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65  ger code is gene
e550: 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69  rated and so thi
e560: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e  s condition is n
e570: 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20  o longer .      
e580: 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48    ** possible. H
e590: 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73  owever, it can s
e5a0: 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72  till be true for
e5b0: 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65   statements like
e5c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
e5d0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20  following:.     
e5e0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
e5f0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
e600: 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b  t1(col INTEGER);
e610: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
e620: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e  LECT (SELECT t1.
e630: 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74  col) FROM FROM t
e640: 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  1;.        **.  
e650: 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f        ** when co
e660: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
e670: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
e680: 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20  ession "t1.col" 
e690: 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  in the .        
e6a0: 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49  ** sub-select. I
e6b0: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74  n this case, set
e6c0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
e6d0: 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20   to NULL, even. 
e6e0: 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68         ** though
e6f0: 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c   it should reall
e700: 79 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a  y be "INTEGER"..
e710: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
e720: 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
e730: 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20  t a problem, as 
e740: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
e750: 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e  of "t1.col" is n
e760: 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ever.        ** 
e770: 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d  used. When colum
e780: 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65  nType() is calle
e790: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
e7a0: 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ion .        ** 
e7b0: 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29  "(SELECT t1.col)
e7c0: 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 74  ", the correct t
e7d0: 79 70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ype is returned 
e7e0: 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45  (see the TK_SELE
e7f0: 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72  CT.        ** br
e800: 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a  anch below.  */.
e810: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e820: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
e830: 73 65 72 74 28 20 70 54 61 62 20 26 26 20 70 45  sert( pTab && pE
e840: 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20  xpr->pTab==pTab 
e850: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20  );.      if( pS 
e860: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
e870: 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74  e "table" is act
e880: 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65  ually a sub-sele
e890: 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20  ct or a view in 
e8a0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
e8b0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
e8c0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
e8d0: 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  nt. Return the d
e8e0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
e8f0: 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20  and origin.     
e900: 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74     ** data for t
e910: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f  he result-set co
e920: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d  lumn of the sub-
e930: 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20  select..        
e940: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
e950: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
e960: 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  S->pEList->nExpr
e970: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
e980: 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73   If iCol is less
e990: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
e9a0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
e9b0: 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20  requests the.   
e9c0: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20         ** rowid 
e9d0: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
e9e0: 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20  t or view. This 
e9f0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65  expression is le
ea00: 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20  gal (see .      
ea10: 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65      ** test case
ea20: 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74   misc2.2.2) - it
ea30: 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65   always evaluate
ea40: 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  s to NULL..     
ea50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
ea60: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
ea70: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  C;.          Exp
ea80: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
ea90: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
eaa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
eab0: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
eac0: 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Src;.          s
ead0: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
eae0: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50            sNC.pP
eaf0: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
eb00: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se;.          zT
eb10: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
eb20: 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44  (&sNC, p,&zOrigD
eb30: 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72  b,&zOrigTab,&zOr
eb40: 69 67 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20  igCol); .       
eb50: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
eb60: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61          /* A rea
eb70: 6c 20 74 61 62 6c 65 20 6f 72 20 61 20 43 54 45  l table or a CTE
eb80: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
eb90: 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b    assert( !pS );
eba0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
ebb0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
ebc0: 41 44 41 54 41 0a 20 20 20 20 20 20 20 20 69 66  ADATA.        if
ebd0: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
ebe0: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
ebf0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
ec00: 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c  Col==XN_ROWID ||
ec10: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
ec20: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
ec30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
ec40: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<0 ){.         
ec50: 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45   zType = "INTEGE
ec60: 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  R";.          zO
ec70: 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22  rigCol = "rowid"
ec80: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
ec90: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
eca0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
ecb0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
ecc0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
ecd0: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70  sqlite3ColumnTyp
ece0: 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e(&pTab->aCol[iC
ecf0: 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  ol],0);.        
ed00: 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 54  }.        zOrigT
ed10: 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ab = pTab->zName
ed20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
ed30: 43 2d 3e 70 50 61 72 73 65 20 26 26 20 70 54 61  C->pParse && pTa
ed40: 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  b->pSchema ){.  
ed50: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20          int iDb 
ed60: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
ed70: 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72  oIndex(pNC->pPar
ed80: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
ed90: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
eda0: 20 20 7a 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d    zOrigDb = pNC-
edb0: 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62  >pParse->db->aDb
edc0: 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
edd0: 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a          }.#else.
ede0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
edf0: 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c  iCol==XN_ROWID |
ee00: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
ee10: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
ee20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
ee30: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
ee40: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
ee50: 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ER";.        }el
ee60: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se{.          zT
ee70: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c  ype = sqlite3Col
ee80: 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d 3e 61  umnType(&pTab->a
ee90: 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20  Col[iCol],0);.  
eea0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
eeb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
eec0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
eed0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
eee0: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
eef0: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
ef00: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
ef10: 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65  sion is a sub-se
ef20: 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65  lect. Return the
ef30: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
ef40: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f  e and.      ** o
ef50: 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74  rigin info for t
ef60: 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e  he single column
ef70: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
ef80: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
ef90: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
efa0: 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
efb0: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
efc0: 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  sNC;.      Selec
efd0: 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78  t *pS = pExpr->x
efe0: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
eff0: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
f000: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
f010: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
f020: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
f030: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
f040: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e  ect) );.      sN
f050: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
f060: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43  >pSrc;.      sNC
f070: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
f080: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
f090: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
f0a0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
f0b0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
f0c0: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
f0d0: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b  Tab, &zOrigCol);
f0e0: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
f0f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
f100: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
f110: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
f120: 41 44 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a  ADATA  .  if( pz
f130: 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73  OrigDb ){.    as
f140: 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20  sert( pzOrigTab 
f150: 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a  && pzOrigCol );.
f160: 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20      *pzOrigDb = 
f170: 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a  zOrigDb;.    *pz
f180: 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54  OrigTab = zOrigT
f190: 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43  ab;.    *pzOrigC
f1a0: 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20  ol = zOrigCol;. 
f1b0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
f1c0: 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zType;.}../*.
f1d0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
f1e0: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
f1f0: 74 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63  the VDBE the dec
f200: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f  laration types o
f210: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
f220: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
f230: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
f240: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70  enerateColumnTyp
f250: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
f260: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
f270: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
f280: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
f290: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
f2a0: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
f2b0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
f2c0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
f2d0: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
f2e0: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66  lt set */.){.#if
f2f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f300: 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65  _DECLTYPE.  Vdbe
f310: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
f320: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
f330: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
f340: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
f350: 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e  = pTabList;.  sN
f360: 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
f370: 65 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d  e;.  sNC.pNext =
f380: 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
f390: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
f3a0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
f3b0: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
f3c0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73  .pExpr;.    cons
f3d0: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23  t char *zType;.#
f3e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f3f0: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
f400: 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ATA.    const ch
f410: 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b  ar *zOrigDb = 0;
f420: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f430: 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20  *zOrigTab = 0;. 
f440: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f450: 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  OrigCol = 0;.   
f460: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
f470: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f  ype(&sNC, p, &zO
f480: 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62  rigDb, &zOrigTab
f490: 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20  , &zOrigCol);.. 
f4a0: 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d     /* The vdbe m
f4b0: 75 73 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e  ust make its own
f4c0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c   copy of the col
f4d0: 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68  umn-type and oth
f4e0: 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  er .    ** colum
f4f0: 6e 20 73 70 65 63 69 66 69 63 20 73 74 72 69 6e  n specific strin
f500: 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  gs, in case the 
f510: 73 63 68 65 6d 61 20 69 73 20 72 65 73 65 74 20  schema is reset 
f520: 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20  before this.    
f530: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
f540: 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20  ne is deleted.. 
f550: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
f560: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
f570: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41  v, i, COLNAME_DA
f580: 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c  TABASE, zOrigDb,
f590: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
f5a0: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
f5b0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
f5c0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c   i, COLNAME_TABL
f5d0: 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c  E, zOrigTab, SQL
f5e0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
f5f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
f600: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
f610: 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20  COLNAME_COLUMN, 
f620: 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45  zOrigCol, SQLITE
f630: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c  _TRANSIENT);.#el
f640: 73 65 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63  se.    zType = c
f650: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
f660: 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e  p, 0, 0, 0);.#en
f670: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56  dif.    sqlite3V
f680: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
f690: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c   i, COLNAME_DECL
f6a0: 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c  TYPE, zType, SQL
f6b0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
f6c0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
f6d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f6e0: 49 54 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a  IT_DECLTYPE) */.
f6f0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  }.../*.** Comput
f700: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
f710: 65 73 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  es for a SELECT 
f720: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
f730: 20 54 68 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e   The only guaran
f740: 74 65 65 20 74 68 61 74 20 53 51 4c 69 74 65 20  tee that SQLite 
f750: 6d 61 6b 65 73 20 61 62 6f 75 74 20 63 6f 6c 75  makes about colu
f760: 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74 68 61 74  mn names is that
f770: 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   if the.** colum
f780: 6e 20 68 61 73 20 61 6e 20 41 53 20 63 6c 61 75  n has an AS clau
f790: 73 65 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20  se assigning it 
f7a0: 61 20 6e 61 6d 65 2c 20 74 68 61 74 20 77 69 6c  a name, that wil
f7b0: 6c 20 62 65 20 74 68 65 20 6e 61 6d 65 20 75 73  l be the name us
f7c0: 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69 73 20 74  ed..** That is t
f7d0: 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74  he only document
f7e0: 65 64 20 67 75 61 72 61 6e 74 65 65 2e 20 20 48  ed guarantee.  H
f7f0: 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73  owever, countles
f800: 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a  s applications.*
f810: 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f 76 65 72  * developed over
f820: 20 74 68 65 20 79 65 61 72 73 20 68 61 76 65 20   the years have 
f830: 6d 61 64 65 20 62 61 73 65 6c 65 73 73 20 61 73  made baseless as
f840: 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20  sumptions about 
f850: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20  column names.** 
f860: 61 6e 64 20 77 69 6c 6c 20 62 72 65 61 6b 20 69  and will break i
f870: 66 20 74 68 6f 73 65 20 61 73 73 75 6d 70 74 69  f those assumpti
f880: 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20 20 48 65  ons changes.  He
f890: 6e 63 65 2c 20 75 73 65 20 65 78 74 72 65 6d 65  nce, use extreme
f8a0: 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e   caution.** when
f8b0: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 69 73 20   modifying this 
f8c0: 72 6f 75 74 69 6e 65 20 74 6f 20 61 76 6f 69 64  routine to avoid
f8d0: 20 62 72 65 61 6b 69 6e 67 20 6c 65 67 61 63 79   breaking legacy
f8e0: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f  ..**.** See Also
f8f0: 3a 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73  : sqlite3Columns
f900: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 0a 2a  FromExprList().*
f910: 2a 0a 2a 2a 20 54 68 65 20 50 52 41 47 4d 41 20  *.** The PRAGMA 
f920: 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  short_column_nam
f930: 65 73 20 61 6e 64 20 50 52 41 47 4d 41 20 66 75  es and PRAGMA fu
f940: 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20  ll_column_names 
f950: 73 65 74 74 69 6e 67 73 20 61 72 65 0a 2a 2a 20  settings are.** 
f960: 64 65 70 72 65 63 61 74 65 64 2e 20 20 54 68 65  deprecated.  The
f970: 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67   default setting
f980: 20 69 73 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75   is short=ON, fu
f990: 6c 6c 3d 4f 46 46 2e 20 20 39 39 2e 39 25 20 6f  ll=OFF.  99.9% o
f9a0: 66 20 61 6c 6c 0a 2a 2a 20 61 70 70 6c 69 63 61  f all.** applica
f9b0: 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20 6f 70 65  tions should ope
f9c0: 72 61 74 65 20 74 68 69 73 20 77 61 79 2e 20 20  rate this way.  
f9d0: 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65  Nevertheless, we
f9e0: 20 6e 65 65 64 20 74 6f 20 73 75 70 70 6f 72 74   need to support
f9f0: 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6d 6f   the.** other mo
fa00: 64 65 73 20 66 6f 72 20 6c 65 67 61 63 79 3a 0a  des for legacy:.
fa10: 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f  **.**    short=O
fa20: 46 46 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20  FF, full=OFF:   
fa30: 20 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69     Column name i
fa40: 73 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  s the text of th
fa50: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  e expression has
fa60: 20 69 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   it.**          
fa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa80: 20 20 20 20 6f 72 69 67 69 6e 61 6c 6c 79 20 61      originally a
fa90: 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 53 45  ppears in the SE
faa0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
fab0: 20 49 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   In.**          
fac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fad0: 20 20 20 20 6f 74 68 65 72 20 77 6f 72 64 73 2c      other words,
fae0: 20 74 68 65 20 7a 53 70 61 6e 20 6f 66 20 74 68   the zSpan of th
faf0: 65 20 72 65 73 75 6c 74 20 65 78 70 72 65 73 73  e result express
fb00: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68  ion..**.**    sh
fb10: 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46  ort=ON, full=OFF
fb20: 3a 20 20 20 20 20 20 20 28 54 68 69 73 20 69 73  :       (This is
fb30: 20 74 68 65 20 64 65 66 61 75 6c 74 20 73 65 74   the default set
fb40: 74 69 6e 67 29 2e 20 20 49 66 20 74 68 65 20 72  ting).  If the r
fb50: 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20  esult.**        
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb70: 20 20 20 20 20 20 72 65 66 65 72 73 20 64 69 72        refers dir
fb80: 65 63 74 6c 79 20 74 6f 20 61 20 74 61 62 6c 65  ectly to a table
fb90: 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68   column, then th
fba0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
fbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbc0: 20 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20    result column 
fbd0: 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 74 68 65  name is just the
fbe0: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a   table column.**
fbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61                na
fc10: 6d 65 3a 20 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68  me: COLUMN.  Oth
fc20: 65 72 77 69 73 65 20 75 73 65 20 7a 53 70 61 6e  erwise use zSpan
fc30: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 66 75 6c 6c 3d  ..**.**    full=
fc40: 4f 4e 2c 20 73 68 6f 72 74 3d 41 4e 59 3a 20 20  ON, short=ANY:  
fc50: 20 20 20 20 20 49 66 20 74 68 65 20 72 65 73 75       If the resu
fc60: 6c 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74  lt refers direct
fc70: 6c 79 20 74 6f 20 61 20 74 61 62 6c 65 20 63 6f  ly to a table co
fc80: 6c 75 6d 6e 2c 0a 2a 2a 20 20 20 20 20 20 20 20  lumn,.**        
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fca0: 20 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 72        then the r
fcb0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  esult column nam
fcc0: 65 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  e with the table
fcd0: 20 6e 61 6d 65 0a 2a 2a 20 20 20 20 20 20 20 20   name.**        
fce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcf0: 20 20 20 20 20 20 70 72 65 66 69 78 2c 20 65 78        prefix, ex
fd00: 3a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 2e 20  : TABLE.COLUMN. 
fd10: 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 7a   Otherwise use z
fd20: 53 70 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Span..*/.static 
fd30: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
fd40: 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  umnNames(.  Pars
fd50: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
fd60: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
fd70: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
fd80: 53 65 6c 65 63 74 20 20 20 20 20 2f 2a 20 47 65  Select     /* Ge
fd90: 6e 65 72 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61  nerate column na
fda0: 6d 65 73 20 66 6f 72 20 74 68 69 73 20 53 45 4c  mes for this SEL
fdb0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
fdc0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
fdd0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
fde0: 20 69 6e 74 20 69 3b 0a 20 20 54 61 62 6c 65 20   int i;.  Table 
fdf0: 2a 70 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74  *pTab;.  SrcList
fe00: 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
fe10: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
fe20: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
fe30: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
fe40: 74 20 66 75 6c 6c 4e 61 6d 65 3b 20 20 20 20 2f  t fullName;    /
fe50: 2a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69  * TABLE.COLUMN i
fe60: 66 20 6e 6f 20 41 53 20 63 6c 61 75 73 65 20 61  f no AS clause a
fe70: 6e 64 20 69 73 20 61 20 64 69 72 65 63 74 20 74  nd is a direct t
fe80: 61 62 6c 65 20 72 65 66 20 2a 2f 0a 20 20 69 6e  able ref */.  in
fe90: 74 20 73 72 63 4e 61 6d 65 3b 20 20 20 20 20 2f  t srcName;     /
fea0: 2a 20 43 4f 4c 55 4d 4e 20 6f 72 20 54 41 42 4c  * COLUMN or TABL
feb0: 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41  E.COLUMN if no A
fec0: 53 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73 20  S clause and is 
fed0: 64 69 72 65 63 74 20 2a 2f 0a 0a 23 69 66 6e 64  direct */..#ifnd
fee0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
fef0: 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74  XPLAIN.  /* If t
ff00: 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49  his is an EXPLAI
ff10: 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65  N, skip this ste
ff20: 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73  p */.  if( pPars
ff30: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
ff40: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
ff50: 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61 72  ndif..  if( pPar
ff60: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
ff70: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
ff80: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
ff90: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  /* Column names 
ffa0: 61 72 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62  are determined b
ffb0: 79 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  y the left-most 
ffc0: 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75  term of a compou
ffd0: 6e 64 20 73 65 6c 65 63 74 20 2a 2f 0a 20 20 77  nd select */.  w
ffe0: 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
fff0: 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20  Prior ) pSelect 
10000 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
10010 72 3b 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  r;.  SELECTTRACE
10020 28 31 2c 70 50 61 72 73 65 2c 70 53 65 6c 65 63  (1,pParse,pSelec
10030 74 2c 28 22 67 65 6e 65 72 61 74 69 6e 67 20 63  t,("generating c
10040 6f 6c 75 6d 6e 20 6e 61 6d 65 73 5c 6e 22 29 29  olumn names\n"))
10050 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
10060 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
10070 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
10080 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65  ->pEList;.  asse
10090 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73  rt( v!=0 );.  as
100a0 73 65 72 74 28 20 70 54 61 62 4c 69 73 74 21 3d  sert( pTabList!=
100b0 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  0 );.  pParse->c
100c0 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a  olNamesSet = 1;.
100d0 20 20 66 75 6c 6c 4e 61 6d 65 20 3d 20 28 64 62    fullName = (db
100e0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
100f0 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
10100 30 3b 0a 20 20 73 72 63 4e 61 6d 65 20 3d 20 28  0;.  srcName = (
10110 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
10120 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
10130 29 21 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61 6d 65  )!=0 || fullName
10140 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  ;.  sqlite3VdbeS
10150 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c  etNumCols(v, pEL
10160 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66  ist->nExpr);.  f
10170 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
10180 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
10190 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
101a0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
101b0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 21  ..    assert( p!
101c0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
101d0 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  ( p->op!=TK_AGG_
101e0 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 41 67  COLUMN );  /* Ag
101f0 67 20 70 72 6f 63 65 73 73 69 6e 67 20 68 61 73  g processing has
10200 20 6e 6f 74 20 72 75 6e 20 79 65 74 20 2a 2f 0a   not run yet */.
10210 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
10220 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
10230 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 20 2f 2a  p->pTab!=0 ); /*
10240 20 43 6f 76 65 72 69 6e 67 20 69 64 78 20 6e 6f   Covering idx no
10250 74 20 79 65 74 20 63 6f 64 65 64 20 2a 2f 0a 20  t yet coded */. 
10260 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
10270 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
10280 20 20 20 2f 2a 20 41 6e 20 41 53 20 63 6c 61 75     /* An AS clau
10290 73 65 20 61 6c 77 61 79 73 20 74 61 6b 65 73 20  se always takes 
102a0 66 69 72 73 74 20 70 72 69 6f 72 69 74 79 20 2a  first priority *
102b0 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  /.      char *zN
102c0 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
102d0 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
102e0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
102f0 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
10300 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
10310 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
10320 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  T);.    }else if
10330 28 20 73 72 63 4e 61 6d 65 20 26 26 20 70 2d 3e  ( srcName && p->
10340 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
10350 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
10360 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  l;.      int iCo
10370 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  l = p->iColumn;.
10380 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e        pTab = p->
10390 70 54 61 62 3b 0a 20 20 20 20 20 20 61 73 73 65  pTab;.      asse
103a0 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
103b0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
103c0 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
103d0 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65  PKey;.      asse
103e0 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
103f0 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
10400 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
10410 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
10420 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c   ){.        zCol
10430 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   = "rowid";.    
10440 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10450 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43   zCol = pTab->aC
10460 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
10470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10480 28 20 66 75 6c 6c 4e 61 6d 65 20 29 7b 0a 20 20  ( fullName ){.  
10490 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
104a0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  e = 0;.        z
104b0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
104c0 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
104d0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
104e0 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  zCol);.        s
104f0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
10500 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
10510 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
10520 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
10530 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10540 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10550 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
10560 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
10570 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  zCol, SQLITE_TRA
10580 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d  NSIENT);.      }
10590 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
105a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
105b0 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
105c0 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20  Span;.      z = 
105d0 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50  z==0 ? sqlite3MP
105e0 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d  rintf(db, "colum
105f0 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c  n%d", i+1) : sql
10600 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
10610 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   z);.      sqlit
10620 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
10630 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
10640 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44  AME, z, SQLITE_D
10650 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20  YNAMIC);.    }. 
10660 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c   }.  generateCol
10670 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c  umnTypes(pParse,
10680 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
10690 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  t);.}../*.** Giv
106a0 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  en an expression
106b0 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20   list (which is 
106c0 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20  really the list 
106d0 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  of expressions.*
106e0 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  * that form the 
106f0 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
10700 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
10710 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70  ) compute approp
10720 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  riate.** column 
10730 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c  names for a tabl
10740 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c  e that would hol
10750 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
10760 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c   list..**.** All
10770 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69   column names wi
10780 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a  ll be unique..**
10790 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c  .** Only the col
107a0 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f  umn names are co
107b0 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e  mputed.  Column.
107c0 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43  zType, Column.zC
107d0 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65  oll,.** and othe
107e0 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75  r fields of Colu
107f0 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  mn are zeroed..*
10800 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
10810 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
10820 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
10830 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
10840 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65  occurs,.** store
10850 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20   NULL in *paCol 
10860 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20  and 0 in *pnCol 
10870 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
10880 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54  E_NOMEM..**.** T
10890 68 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65  he only guarante
108a0 65 20 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61  e that SQLite ma
108b0 6b 65 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e  kes about column
108c0 20 6e 61 6d 65 73 20 69 73 20 74 68 61 74 20 69   names is that i
108d0 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  f the.** column 
108e0 68 61 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65  has an AS clause
108f0 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20   assigning it a 
10900 6e 61 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20  name, that will 
10910 62 65 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64  be the name used
10920 2e 0a 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65  ..** That is the
10930 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64   only documented
10940 20 67 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77   guarantee.  How
10950 65 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20  ever, countless 
10960 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20  applications.** 
10970 64 65 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74  developed over t
10980 68 65 20 79 65 61 72 73 20 68 61 76 65 20 6d 61  he years have ma
10990 64 65 20 62 61 73 65 6c 65 73 73 20 61 73 73 75  de baseless assu
109a0 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f  mptions about co
109b0 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e  lumn names.** an
109c0 64 20 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20  d will break if 
109d0 74 68 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e  those assumption
109e0 73 20 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63  s changes.  Henc
109f0 65 2c 20 75 73 65 20 65 78 74 72 65 6d 65 20 63  e, use extreme c
10a00 61 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d  aution.** when m
10a10 6f 64 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f  odifying this ro
10a20 75 74 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62  utine to avoid b
10a30 72 65 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a  reaking legacy..
10a40 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20  **.** See Also: 
10a50 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
10a60 6d 65 73 28 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mes().*/.int sql
10a70 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
10a80 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
10a90 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
10aa0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
10ab0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
10ac0 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
10ad0 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20     /* Expr list 
10ae0 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65  from which to de
10af0 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  rive column name
10b00 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f  s */.  i16 *pnCo
10b10 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
10b20 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
10b30 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65  er of columns he
10b40 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a  re */.  Column *
10b50 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20  *paCol          
10b60 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77  /* Write the new
10b70 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72   column list her
10b80 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
10b90 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
10ba0 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73  db;   /* Databas
10bb0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
10bc0 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
10bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10be0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
10bf0 2f 0a 20 20 75 33 32 20 63 6e 74 3b 20 20 20 20  /.  u32 cnt;    
10c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c10 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20 74  /* Index added t
10c20 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20  o make the name 
10c30 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75  unique */.  Colu
10c40 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b  mn *aCol, *pCol;
10c50 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
10c60 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75  ooping over resu
10c70 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  lt columns */.  
10c80 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
10c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10ca0 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
10cb0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
10cc0 65 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  et */.  char *zN
10cd0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
10ce0 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
10cf0 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  me */.  int nNam
10d00 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10d10 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e      /* Size of n
10d20 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a  ame in zName[] *
10d30 2f 0a 20 20 48 61 73 68 20 68 74 3b 20 20 20 20  /.  Hash ht;    
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d50 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66  /* Hash table of
10d60 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
10d70 0a 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49  ..  sqlite3HashI
10d80 6e 69 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20  nit(&ht);.  if( 
10d90 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43  pEList ){.    nC
10da0 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ol = pEList->nEx
10db0 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73  pr;.    aCol = s
10dc0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
10dd0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43  ro(db, sizeof(aC
10de0 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20  ol[0])*nCol);.  
10df0 20 20 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c    testcase( aCol
10e00 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  ==0 );.    if( n
10e10 43 6f 6c 3e 33 32 37 36 37 20 29 20 6e 43 6f 6c  Col>32767 ) nCol
10e20 20 3d 20 33 32 37 36 37 3b 0a 20 20 7d 65 6c 73   = 32767;.  }els
10e30 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b  e{.    nCol = 0;
10e40 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20  .    aCol = 0;. 
10e50 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f   }.  assert( nCo
10e60 6c 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a  l==(i16)nCol );.
10e70 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b    *pnCol = nCol;
10e80 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c  .  *paCol = aCol
10e90 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  ;..  for(i=0, pC
10ea0 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20  ol=aCol; i<nCol 
10eb0 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
10ec0 69 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  iled; i++, pCol+
10ed0 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61  +){.    /* Get a
10ee0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61  n appropriate na
10ef0 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  me for the colum
10f00 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  n.    */.    if(
10f10 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   (zName = pEList
10f20 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ->a[i].zName)!=0
10f30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
10f40 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  the column conta
10f50 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65  ins an "AS <name
10f60 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c  >" phrase, use <
10f70 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d  name> as the nam
10f80 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e */.    }else{.
10f90 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c        Expr *pCol
10fa0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
10fb0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
10fc0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
10fd0 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
10fe0 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
10ff0 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20  _DOT ){.        
11000 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45  pColExpr = pColE
11010 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
11020 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
11030 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  lExpr!=0 );.    
11040 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
11050 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 21 3d  ( pColExpr->op!=
11060 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
11070 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45  .      if( pColE
11080 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
11090 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  MN ){.        /*
110a0 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65   For columns use
110b0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
110c0 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
110d0 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c   int iCol = pCol
110e0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
110f0 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
11100 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  ab = pColExpr->p
11110 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Tab;.        ass
11120 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
11130 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
11140 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
11150 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
11160 20 7a 4e 61 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30   zName = iCol>=0
11170 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   ? pTab->aCol[iC
11180 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77  ol].zName : "row
11190 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
111a0 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
111b0 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
111c0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
111d0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f  rHasProperty(pCo
111e0 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  lExpr, EP_IntVal
111f0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  ue) );.        z
11200 4e 61 6d 65 20 3d 20 70 43 6f 6c 45 78 70 72 2d  Name = pColExpr-
11210 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
11220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11230 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69  /* Use the origi
11240 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20  nal text of the 
11250 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
11260 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f  n as its name */
11270 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
11280 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
11290 70 61 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pan;.      }.   
112a0 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65   }.    if( zName
112b0 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   ){.      zName 
112c0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
112d0 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  p(db, zName);.  
112e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
112f0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
11300 72 69 6e 74 66 28 64 62 2c 22 63 6f 6c 75 6d 6e  rintf(db,"column
11310 25 64 22 2c 69 2b 31 29 3b 0a 20 20 20 20 7d 0a  %d",i+1);.    }.
11320 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
11330 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
11340 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66  e is unique.  If
11350 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74   the name is not
11360 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20   unique,.    ** 
11370 61 70 70 65 6e 64 20 61 6e 20 69 6e 74 65 67 65  append an intege
11380 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f  r to the name so
11390 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73   that it becomes
113a0 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a   unique..    */.
113b0 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20      cnt = 0;.   
113c0 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 20 26 26   while( zName &&
113d0 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
113e0 28 26 68 74 2c 20 7a 4e 61 6d 65 29 21 3d 30 20  (&ht, zName)!=0 
113f0 29 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d  ){.      nName =
11400 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
11410 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  (zName);.      i
11420 66 28 20 6e 4e 61 6d 65 3e 30 20 29 7b 0a 20 20  f( nName>0 ){.  
11430 20 20 20 20 20 20 66 6f 72 28 6a 3d 6e 4e 61 6d        for(j=nNam
11440 65 2d 31 3b 20 6a 3e 30 20 26 26 20 73 71 6c 69  e-1; j>0 && sqli
11450 74 65 33 49 73 64 69 67 69 74 28 7a 4e 61 6d 65  te3Isdigit(zName
11460 5b 6a 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20  [j]); j--){}.   
11470 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6a       if( zName[j
11480 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d  ]==':' ) nName =
11490 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   j;.      }.    
114a0 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
114b0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 2e  3MPrintf(db, "%.
114c0 2a 7a 3a 25 75 22 2c 20 6e 4e 61 6d 65 2c 20 7a  *z:%u", nName, z
114d0 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20  Name, ++cnt);.  
114e0 20 20 20 20 69 66 28 20 63 6e 74 3e 33 20 29 20      if( cnt>3 ) 
114f0 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
11500 73 73 28 73 69 7a 65 6f 66 28 63 6e 74 29 2c 20  ss(sizeof(cnt), 
11510 26 63 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &cnt);.    }.   
11520 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
11530 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Name;.    sqlite
11540 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65  3ColumnPropertie
11550 73 46 72 6f 6d 4e 61 6d 65 28 30 2c 20 70 43 6f  sFromName(0, pCo
11560 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  l);.    if( zNam
11570 65 20 26 26 20 73 71 6c 69 74 65 33 48 61 73 68  e && sqlite3Hash
11580 49 6e 73 65 72 74 28 26 68 74 2c 20 7a 4e 61 6d  Insert(&ht, zNam
11590 65 2c 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29  e, pCol)==pCol )
115a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
115b0 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
115c0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
115d0 48 61 73 68 43 6c 65 61 72 28 26 68 74 29 3b 0a  HashClear(&ht);.
115e0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
115f0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f  Failed ){.    fo
11600 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29  r(j=0; j<i; j++)
11610 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
11620 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a  bFree(db, aCol[j
11630 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ].zName);.    }.
11640 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
11650 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20  e(db, aCol);.   
11660 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20   *paCol = 0;.   
11670 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20   *pnCol = 0;.   
11680 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
11690 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
116a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
116b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  K;.}../*.** Add 
116c0 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
116d0 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  on information t
116e0 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  o a column list 
116f0 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45  based on.** a SE
11700 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
11710 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ** .** The colum
11720 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c  n list presumabl
11730 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65  y came from sele
11740 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f  ctColumnNamesFro
11750 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20  mExprList()..** 
11760 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  The column list 
11770 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20  has only names, 
11780 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c  not types or col
11790 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a  lations.  This.*
117a0 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  * routine goes t
117b0 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20  hrough and adds 
117c0 74 68 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f  the types and co
117d0 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  llations..**.** 
117e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71  This routine req
117f0 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69  uires that all i
11800 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68  dentifiers in th
11810 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74  e SELECT.** stat
11820 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65  ement be resolve
11830 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
11840 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d  e3SelectAddColum
11850 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
11860 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
11870 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
11880 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a  rsing contexts *
11890 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
118a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
118b0 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66   column type inf
118c0 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73  ormation to this
118d0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65   table */.  Sele
118e0 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
118f0 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64    /* SELECT used
11900 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79   to determine ty
11910 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
11920 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ns */.){.  sqlit
11930 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
11940 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  >db;.  NameConte
11950 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e  xt sNC;.  Column
11960 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65   *pCol;.  CollSe
11970 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
11980 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  i;.  Expr *p;.  
11990 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
119a0 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65  item *a;..  asse
119b0 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29  rt( pSelect!=0 )
119c0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65  ;.  assert( (pSe
119d0 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
119e0 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30   SF_Resolved)!=0
119f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
11a00 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63  ab->nCol==pSelec
11a10 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
11a20 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
11a30 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62  iled );.  if( db
11a40 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
11a50 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65   return;.  memse
11a60 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
11a70 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
11a80 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
11a90 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70  t->pSrc;.  a = p
11aa0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
11ab0 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  a;.  for(i=0, pC
11ac0 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
11ad0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
11ae0 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63  , pCol++){.    c
11af0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
11b00 3b 0a 20 20 20 20 69 6e 74 20 6e 2c 20 6d 3b 0a  ;.    int n, m;.
11b10 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78      p = a[i].pEx
11b20 70 72 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20  pr;.    zType = 
11b30 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
11b40 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   p, 0, 0, 0);.  
11b50 20 20 2f 2a 20 70 43 6f 6c 2d 3e 73 7a 45 73 74    /* pCol->szEst
11b60 20 3d 20 2e 2e 2e 20 2f 2f 20 43 6f 6c 75 6d 6e   = ... // Column
11b70 20 73 69 7a 65 20 65 73 74 20 66 6f 72 20 53 45   size est for SE
11b80 4c 45 43 54 20 74 61 62 6c 65 73 20 6e 65 76 65  LECT tables neve
11b90 72 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 70 43  r used */.    pC
11ba0 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
11bb0 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
11bc0 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a  ty(p);.    if( z
11bd0 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 6d 20  Type ){.      m 
11be0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
11bf0 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20  0(zType);.      
11c00 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
11c10 6e 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  n30(pCol->zName)
11c20 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e  ;.      pCol->zN
11c30 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 52  ame = sqlite3DbR
11c40 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c  eallocOrFree(db,
11c50 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b   pCol->zName, n+
11c60 6d 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+2);.      if( 
11c70 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  pCol->zName ){. 
11c80 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
11c90 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c  Col->zName[n+1],
11ca0 20 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20   zType, m+1);.  
11cb0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46        pCol->colF
11cc0 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
11cd0 48 41 53 54 59 50 45 3b 0a 20 20 20 20 20 20 7d  HASTYPE;.      }
11ce0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
11cf0 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30  Col->affinity==0
11d00 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74   ) pCol->affinit
11d10 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y = SQLITE_AFF_B
11d20 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  LOB;.    pColl =
11d30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
11d40 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
11d50 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26      if( pColl &&
11d60 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20   pCol->zColl==0 
11d70 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a  ){.      pCol->z
11d80 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62  Coll = sqlite3Db
11d90 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c  StrDup(db, pColl
11da0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
11db0 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61    }.  pTab->szTa
11dc0 62 52 6f 77 20 3d 20 31 3b 20 2f 2a 20 41 6e 79  bRow = 1; /* Any
11dd0 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
11de0 77 6f 72 6b 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  works */.}../*.*
11df0 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54  * Given a SELECT
11e00 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65   statement, gene
11e10 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72  rate a Table str
11e20 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
11e30 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73  ribes.** the res
11e40 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20  ult set of that 
11e50 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65  SELECT..*/.Table
11e60 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53   *sqlite3ResultS
11e70 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65  etOfSelect(Parse
11e80 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
11e90 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61   *pSelect){.  Ta
11ea0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c  ble *pTab;.  sql
11eb0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
11ec0 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76  e->db;.  int sav
11ed0 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65  edFlags;..  save
11ee0 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61  dFlags = db->fla
11ef0 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  gs;.  db->flags 
11f00 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43  &= ~SQLITE_FullC
11f10 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66  olNames;.  db->f
11f20 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
11f30 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  hortColNames;.  
11f40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
11f50 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  p(pParse, pSelec
11f60 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61  t, 0);.  if( pPa
11f70 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
11f80 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70  rn 0;.  while( p
11f90 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
11fa0 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
11fb0 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62  ct->pPrior;.  db
11fc0 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46  ->flags = savedF
11fd0 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73  lags;.  pTab = s
11fe0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
11ff0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
12000 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
12010 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ab==0 ){.    ret
12020 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20  urn 0;.  }.  /* 
12030 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c  The sqlite3Resul
12040 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69  tSetOfSelect() i
12050 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f  s only used n co
12060 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f  ntexts where loo
12070 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64  kaside.  ** is d
12080 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73  isabled */.  ass
12090 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
120a0 64 65 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20  de.bDisable );. 
120b0 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d   pTab->nTabRef =
120c0 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d   1;.  pTab->zNam
120d0 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e  e = 0;.  pTab->n
120e0 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
120f0 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
12100 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
12110 35 37 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  576) );.  sqlite
12120 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
12130 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
12140 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70  lect->pEList, &p
12150 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
12160 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  ->aCol);.  sqlit
12170 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d  e3SelectAddColum
12180 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
12190 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
121a0 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62  pSelect);.  pTab
121b0 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
121c0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
121d0 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
121e0 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
121f0 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65  b, pTab);.    re
12200 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
12210 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
12220 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
12230 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
12240 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
12250 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
12260 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
12270 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
12280 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
12290 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
122a0 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
122b0 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47  /.Vdbe *sqlite3G
122c0 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
122d0 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61  arse){.  if( pPa
122e0 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20  rse->pVdbe ){.  
122f0 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
12300 3e 70 56 64 62 65 3b 0a 20 20 7d 0a 20 20 69 66  >pVdbe;.  }.  if
12310 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65  ( pParse->pTople
12320 76 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74  vel==0.   && Opt
12330 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
12340 28 70 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49  (pParse->db,SQLI
12350 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73  TE_FactorOutCons
12360 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 72  t).  ){.    pPar
12370 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
12380 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  r = 1;.  }.  ret
12390 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43  urn sqlite3VdbeC
123a0 72 65 61 74 65 28 70 50 61 72 73 65 29 3b 0a 7d  reate(pParse);.}
123b0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  .../*.** Compute
123c0 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
123d0 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
123e0 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
123f0 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69  ed on the.** pLi
12400 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  mit expressions.
12410 20 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20    pLimit->pLeft 
12420 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67  and pLimit->pRig
12430 68 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  ht hold the expr
12440 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
12450 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
12460 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
12470 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
12480 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
12490 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
124a0 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b   NULL if those k
124b0 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
124c0 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20  ted. iLimit and 
124d0 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20  iOffset .** are 
124e0 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
124f0 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
12500 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73  ers for counters
12510 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
12520 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61   .** the limit a
12530 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
12540 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
12550 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
12560 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20  then .** iLimit 
12570 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
12580 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
12590 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
125a0 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
125b0 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  of iLimit and iO
125c0 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
125d0 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
125e0 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
125f0 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61   pLimit->pLeft a
12600 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68  nd pLimit->pRigh
12610 74 2e 20 20 69 4c 69 6d 69 74 0a 2a 2a 20 61 6e  t.  iLimit.** an
12620 64 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  d iOffset should
12630 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
12640 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
12650 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20   default values 
12660 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20  (zero).** prior 
12670 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
12680 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
12690 68 65 20 69 4f 66 66 73 65 74 20 72 65 67 69 73  he iOffset regis
126a0 74 65 72 20 28 69 66 20 69 74 20 65 78 69 73 74  ter (if it exist
126b0 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  s) is initialize
126c0 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a  d to the value.*
126d0 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e  * of the OFFSET.
126e0 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67    The iLimit reg
126f0 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c  ister is initial
12700 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20  ized to LIMIT.  
12710 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66  Register.** iOff
12720 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c  set+1 is initial
12730 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46  ized to LIMIT+OF
12740 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  FSET..**.** Only
12750 20 69 66 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66   if pLimit->pLef
12760 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69  t!=0 do the limi
12770 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a  t registers get.
12780 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54  ** redefined.  T
12790 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
127a0 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20  rator uses this 
127b0 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63  property to forc
127c0 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f  e.** the reuse o
127d0 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74  f the same limit
127e0 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69   and offset regi
127f0 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c  sters across mul
12800 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20  tiple.** SELECT 
12810 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  statements..*/.s
12820 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75  tatic void compu
12830 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
12840 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
12850 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
12860 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a  Break){.  Vdbe *
12870 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69  v = 0;.  int iLi
12880 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  mit = 0;.  int i
12890 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b  Offset;.  int n;
128a0 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20  .  Expr *pLimit 
128b0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 0a 20 20  = p->pLimit;..  
128c0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20  if( p->iLimit ) 
128d0 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20  return;..  /* . 
128e0 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
128f0 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
12900 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
12910 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f  some.  ** contro
12920 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
12930 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
12940 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
12950 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
12960 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
12970 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
12980 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
12990 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
129a0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
129b0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
129c0 3b 0a 20 20 69 66 28 20 70 4c 69 6d 69 74 20 29  ;.  if( pLimit )
129d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
129e0 69 6d 69 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d  imit->op==TK_LIM
129f0 49 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  IT );.    assert
12a00 28 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21  ( pLimit->pLeft!
12a10 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69  =0 );.    p->iLi
12a20 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b  mit = iLimit = +
12a30 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
12a40 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
12a50 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
12a60 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20     assert( v!=0 
12a70 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
12a80 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
12a90 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26  pLimit->pLeft, &
12aa0 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  n) ){.      sqli
12ab0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12ac0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20   OP_Integer, n, 
12ad0 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56  iLimit);.      V
12ae0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
12af0 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
12b00 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30  ;.      if( n==0
12b10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
12b20 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69  te3VdbeGoto(v, i
12b30 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65  Break);.      }e
12b40 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20  lse if( n>=0 && 
12b50 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71  p->nSelectRow>sq
12b60 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
12b70 29 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  )n) ){.        p
12b80 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
12b90 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36  qlite3LogEst((u6
12ba0 34 29 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  4)n);.        p-
12bb0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
12bc0 46 69 78 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20  FixedLimit;.    
12bd0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
12be0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
12bf0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69  Code(pParse, pLi
12c00 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 69 4c 69 6d  mit->pLeft, iLim
12c10 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  it);.      sqlit
12c20 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
12c30 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c  OP_MustBeInt, iL
12c40 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  imit); VdbeCover
12c50 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
12c60 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
12c70 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
12c80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12c90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
12ca0 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42  fNot, iLimit, iB
12cb0 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
12cc0 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
12cd0 20 20 69 66 28 20 70 4c 69 6d 69 74 2d 3e 70 52    if( pLimit->pR
12ce0 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 2d  ight ){.      p-
12cf0 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73  >iOffset = iOffs
12d00 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
12d10 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73  Mem;.      pPars
12d20 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20  e->nMem++;   /* 
12d30 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72  Allocate an extr
12d40 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c  a register for l
12d50 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20  imit+offset */. 
12d60 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
12d70 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69  Code(pParse, pLi
12d80 6d 69 74 2d 3e 70 52 69 67 68 74 2c 20 69 4f 66  mit->pRight, iOf
12d90 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
12da0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
12db0 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
12dc0 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f  iOffset); VdbeCo
12dd0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
12de0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
12df0 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72   "OFFSET counter
12e00 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
12e10 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
12e20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20  OP_OffsetLimit, 
12e30 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b  iLimit, iOffset+
12e40 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  1, iOffset);.   
12e50 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
12e60 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54  v, "LIMIT+OFFSET
12e70 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  "));.    }.  }.}
12e80 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12e90 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
12ea0 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ELECT./*.** Retu
12eb0 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
12ec0 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
12ed0 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43  uence for the iC
12ee0 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a  ol-th column of.
12ef0 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
12f00 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  t for the compou
12f10 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd-select statem
12f20 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e  ent "p".  Return
12f30 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20   NULL if.** the 
12f40 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65  column has no de
12f50 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
12f60 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
12f70 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
12f80 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63  quence for the c
12f90 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69  ompound select i
12fa0 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65  s taken from the
12fb0 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  .** left-most te
12fc0 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  rm of the select
12fd0 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c   that has a coll
12fe0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
12ff0 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65  */.static CollSe
13000 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f  q *multiSelectCo
13010 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
13020 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
13030 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c  int iCol){.  Col
13040 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66  lSeq *pRet;.  if
13050 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
13060 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53     pRet = multiS
13070 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
13080 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  rse, p->pPrior, 
13090 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iCol);.  }else{.
130a0 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
130b0 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  }.  assert( iCol
130c0 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c  >=0 );.  /* iCol
130d0 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74 68   must be less th
130e0 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  an p->pEList->nE
130f0 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20  xpr.  Otherwise 
13100 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20  an error would. 
13110 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68   ** have been th
13120 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65  rown during name
13130 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20   resolution and 
13140 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76  we would not hav
13150 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68  e gotten.  ** th
13160 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20  is far */.  if( 
13170 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59  pRet==0 && ALWAY
13180 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74  S(iCol<p->pEList
13190 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
131a0 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
131b0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
131c0 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  , p->pEList->a[i
131d0 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  Col].pExpr);.  }
131e0 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
131f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c  }../*.** The sel
13200 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
13210 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
13220 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
13230 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
13240 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44  T.** with an ORD
13250 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68  ER BY clause. Th
13260 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
13270 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e  cates and return
13280 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73  s a KeyInfo.** s
13290 74 72 75 63 74 75 72 65 20 73 75 69 74 61 62 6c  tructure suitabl
132a0 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69  e for implementi
132b0 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e  ng the ORDER BY.
132c0 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
132d0 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f  hold the KeyInfo
132e0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62   structure is ob
132f0 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
13300 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a  oc. The calling.
13310 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  ** function is r
13320 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65  esponsible for e
13330 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 69  nsuring that thi
13340 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  s structure is e
13350 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65  ventually.** fre
13360 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65  ed..*/.static Ke
13370 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65  yInfo *multiSele
13380 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f  ctOrderByKeyInfo
13390 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
133a0 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e  Select *p, int n
133b0 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69  Extra){.  ExprLi
133c0 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
133d0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e  ->pOrderBy;.  in
133e0 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t nOrderBy = p->
133f0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
13400 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
13410 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b   pParse->db;.  K
13420 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73  eyInfo *pRet = s
13430 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
13440 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b  oc(db, nOrderBy+
13450 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66  nExtra, 1);.  if
13460 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e  ( pRet ){.    in
13470 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
13480 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
13490 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
134a0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
134b0 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42  pItem = &pOrderB
134c0 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45  y->a[i];.      E
134d0 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74  xpr *pTerm = pIt
134e0 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
134f0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
13500 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ..      if( pTer
13510 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  m->flags & EP_Co
13520 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  llate ){.       
13530 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
13540 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
13550 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  se, pTerm);.    
13560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13570 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65   pColl = multiSe
13580 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
13590 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e  se, p, pItem->u.
135a0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29  x.iOrderByCol-1)
135b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
135c0 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d  oll==0 ) pColl =
135d0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
135e0 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
135f0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20  ->a[i].pExpr =. 
13600 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13610 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74  ExprAddCollateSt
13620 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65  ring(pParse, pTe
13630 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  rm, pColl->zName
13640 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13650 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13660 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
13670 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20  le(pRet) );.    
13680 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d    pRet->aColl[i]
13690 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
136a0 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pRet->aSortOrder
136b0 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  [i] = pOrderBy->
136c0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
136d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
136e0 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66  urn pRet;.}..#if
136f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13700 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  _CTE./*.** This 
13710 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
13720 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63  s VDBE code to c
13730 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65  ompute the conte
13740 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52 45 43  nt of a WITH REC
13750 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20  URSIVE.** query 
13760 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
13770 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d  **   <recursive-
13780 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75  table> AS (<setu
13790 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b  p-query> UNION [
137a0 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d  ALL] <recursive-
137b0 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20  query>).**      
137c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137d0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f     \___________/
137e0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
137f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a  _____________/.*
13800 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
13810 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
13820 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20  Prior           
13830 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a             p.**.
13840 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65  **.** There is e
13850 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72  xactly one refer
13860 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63 75  ence to the recu
13870 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74  rsive-table in t
13880 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a  he FROM clause.*
13890 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71  * of recursive-q
138a0 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74  uery, marked wit
138b0 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61  h the SrcList->a
138c0 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76  [].fg.isRecursiv
138d0 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  e flag..**.** Th
138e0 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 72 75  e setup-query ru
138f0 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72  ns once to gener
13900 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73  ate an initial s
13910 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  et of rows that 
13920 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65  go.** into a Que
13930 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20  ue table.  Rows 
13940 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72  are extracted fr
13950 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74 61 62  om the Queue tab
13960 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65  le one by.** one
13970 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72  .  Each row extr
13980 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65  acted from Queue
13990 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44   is output to pD
139a0 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73  est.  Then the s
139b0 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74  ingle.** extract
139c0 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74  ed row (now in t
139d0 68 65 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c  he iCurrent tabl
139e0 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63  e) becomes the c
139f0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a  ontent of the.**
13a00 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65   recursive-table
13a10 20 66 6f 72 20 61 20 72 65 63 75 72 73 69 76 65   for a recursive
13a20 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65  -query run.  The
13a30 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 72   output of the r
13a40 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a  ecursive-query.*
13a50 2a 20 69 73 20 61 64 64 65 64 20 62 61 63 6b 20  * is added back 
13a60 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74  into the Queue t
13a70 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74  able.  Then anot
13a80 68 65 72 20 72 6f 77 20 69 73 20 65 78 74 72 61  her row is extra
13a90 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a  cted from Queue.
13aa0 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72 61  ** and the itera
13ab0 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75  tion continues u
13ac0 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 74  ntil the Queue t
13ad0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
13ae0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70  *.** If the comp
13af0 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61  ound query opera
13b00 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65  tor is UNION the
13b10 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72  n no duplicate r
13b20 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20  ows are ever.** 
13b30 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
13b40 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20  e Queue table.  
13b50 54 68 65 20 69 44 69 73 74 69 6e 63 74 20 74 61  The iDistinct ta
13b60 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79  ble keeps a copy
13b70 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20   of all rows.** 
13b80 74 68 61 74 20 68 61 76 65 20 65 76 65 72 20 62  that have ever b
13b90 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74  een inserted int
13ba0 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73  o Queue and caus
13bb0 65 73 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f  es duplicates to
13bc0 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64   be.** discarded
13bd0 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  .  If the operat
13be0 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c  or is UNION ALL,
13bf0 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73   then duplicates
13c00 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a   are allowed..**
13c10 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72   .** If the quer
13c20 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42  y has an ORDER B
13c30 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20  Y, then entries 
13c40 69 6e 20 74 68 65 20 51 75 65 75 65 20 74 61 62  in the Queue tab
13c50 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a  le are kept in.*
13c60 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  * ORDER BY order
13c70 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 65   and the first e
13c80 6e 74 72 79 20 69 73 20 65 78 74 72 61 63 74 65  ntry is extracte
13c90 64 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65  d for each cycle
13ca0 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e  .  Without.** an
13cb0 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 51   ORDER BY, the Q
13cc0 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75  ueue table is ju
13cd0 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a  st a FIFO..**.**
13ce0 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   If a LIMIT clau
13cf0 73 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20  se is provided, 
13d00 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 69  then the iterati
13d10 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c  on stops after L
13d20 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76  IMIT rows.** hav
13d30 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f  e been output to
13d40 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54   pDest.  A LIMIT
13d50 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74   of zero means t
13d60 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73  o output no rows
13d70 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69   and a.** negati
13d80 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74  ve LIMIT means t
13d90 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77  o output all row
13da0 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  s.  If there is 
13db0 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63  also an OFFSET c
13dc0 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20  lause.** with a 
13dd0 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20  positive value, 
13de0 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f  then the first O
13df0 46 46 53 45 54 20 6f 75 74 70 75 74 73 20 61 72  FFSET outputs ar
13e00 65 20 64 69 73 63 61 72 64 65 64 20 72 61 74 68  e discarded rath
13e10 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67  er.** than being
13e20 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20   sent to pDest. 
13e30 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74   The LIMIT count
13e40 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
13e50 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53  until after OFFS
13e60 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20  ET.** rows have 
13e70 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f  been skipped..*/
13e80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
13e90 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
13ea0 76 65 51 75 65 72 79 28 0a 20 20 50 61 72 73 65  veQuery(.  Parse
13eb0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
13ec0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
13ed0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
13ee0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
13ef0 2a 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20  * The recursive 
13f00 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64  SELECT to be cod
13f10 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
13f20 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
13f30 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
13f40 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
13f50 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
13f60 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20  pSrc = p->pSrc; 
13f70 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
13f80 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72   clause of the r
13f90 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a  ecursive query *
13fa0 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70  /.  int nCol = p
13fb0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
13fc0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
13fd0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
13fe0 63 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f  cursive table */
13ff0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
14000 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
14010 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
14020 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
14030 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
14040 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75  .  Select *pSetu
14050 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20  p = p->pPrior;  
14060 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71 75   /* The setup qu
14070 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ery */.  int add
14080 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
14090 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
140a0 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
140b0 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64  nt addrCont, add
140c0 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20  rBreak;      /* 
140d0 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45  CONTINUE and BRE
140e0 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a  AK addresses */.
140f0 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d    int iCurrent =
14100 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
14110 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20 74  /* The Current t
14120 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  able */.  int re
14130 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20  gCurrent;       
14140 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
14150 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72  ter holding Curr
14160 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ent table */.  i
14170 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20 20 20  nt iQueue;      
14180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14190 54 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  The Queue table 
141a0 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e  */.  int iDistin
141b0 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ct = 0;         
141c0 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20     /* To ensure 
141d0 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20 69  unique results i
141e0 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74  f UNION */.  int
141f0 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66   eDest = SRT_Fif
14200 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f  o;         /* Ho
14210 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75  w to write to Qu
14220 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  eue */.  SelectD
14230 65 73 74 20 64 65 73 74 51 75 65 75 65 3b 20 20  est destQueue;  
14240 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
14250 44 65 73 74 20 74 61 72 67 65 74 74 69 6e 67 20  Dest targetting 
14260 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
14270 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
14280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14290 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
142a0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  er */.  int rc; 
142b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142c0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
142d0 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  code */.  ExprLi
142e0 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
142f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f          /* The O
14300 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
14310 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
14320 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14330 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54    /* Saved LIMIT
14340 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20   and OFFSET */. 
14350 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72   int regLimit, r
14360 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  egOffset;      /
14370 2a 20 52 65 67 69 73 74 65 72 73 20 75 73 65 64  * Registers used
14380 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46   by LIMIT and OF
14390 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62  FSET */..  /* Ob
143a0 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  tain authorizati
143b0 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72  on to do a recur
143c0 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  sive query */.  
143d0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
143e0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
143f0 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30  ITE_RECURSIVE, 0
14400 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
14410 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  ;..  /* Process 
14420 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
14430 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66  FSET clauses, if
14440 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20   they exist */. 
14450 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c   addrBreak = sql
14460 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
14470 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65  l(v);.  p->nSele
14480 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a  ctRow = 320;  /*
14490 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20   4 billion rows 
144a0 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  */.  computeLimi
144b0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
144c0 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29  e, p, addrBreak)
144d0 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  ;.  pLimit = p->
144e0 70 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4c 69 6d  pLimit;.  regLim
144f0 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
14500 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d    regOffset = p-
14510 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70  >iOffset;.  p->p
14520 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  Limit = 0;.  p->
14530 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66  iLimit = p->iOff
14540 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65  set = 0;.  pOrde
14550 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
14560 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20  y;..  /* Locate 
14570 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
14580 72 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74  r of the Current
14590 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28   table */.  for(
145a0 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53  i=0; ALWAYS(i<pS
145b0 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b  rc->nSrc); i++){
145c0 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61  .    if( pSrc->a
145d0 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69  [i].fg.isRecursi
145e0 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72  ve ){.      iCur
145f0 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69  rent = pSrc->a[i
14600 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ].iCursor;.     
14610 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14620 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
14630 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73   cursors numbers
14640 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44   for Queue and D
14650 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75  istinct.  The cu
14660 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a  rsor number for.
14670 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63    ** the Distinc
14680 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  t table must be 
14690 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61  exactly one grea
146a0 74 65 72 20 74 68 61 6e 20 51 75 65 75 65 20 69  ter than Queue i
146b0 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72  n order.  ** for
146c0 20 74 68 65 20 53 52 54 5f 44 69 73 74 46 69 66   the SRT_DistFif
146d0 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75  o and SRT_DistQu
146e0 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73  eue destinations
146f0 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69   to work. */.  i
14700 51 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e  Queue = pParse->
14710 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d  nTab++;.  if( p-
14720 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b  >op==TK_UNION ){
14730 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72  .    eDest = pOr
14740 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74  derBy ? SRT_Dist
14750 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74  Queue : SRT_Dist
14760 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69  Fifo;.    iDisti
14770 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
14780 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ab++;.  }else{. 
14790 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65     eDest = pOrde
147a0 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20  rBy ? SRT_Queue 
147b0 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a  : SRT_Fifo;.  }.
147c0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
147d0 65 73 74 49 6e 69 74 28 26 64 65 73 74 51 75 65  estInit(&destQue
147e0 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75  ue, eDest, iQueu
147f0 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  e);..  /* Alloca
14800 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43  te cursors for C
14810 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61  urrent, Queue, a
14820 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a  nd Distinct. */.
14830 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b    regCurrent = +
14840 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
14850 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14860 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
14870 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72  udo, iCurrent, r
14880 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29  egCurrent, nCol)
14890 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
148a0 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
148b0 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74  *pKeyInfo = mult
148c0 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
148d0 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c  yInfo(pParse, p,
148e0 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
148f0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
14900 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
14910 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79  iQueue, pOrderBy
14920 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20  ->nExpr+2, 0,.  
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14940 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
14950 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
14960 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75 65 2e  ;.    destQueue.
14970 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
14980 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rBy;.  }else{.  
14990 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
149a0 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
149b0 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c  hemeral, iQueue,
149c0 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64   nCol);.  }.  Vd
149d0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51  beComment((v, "Q
149e0 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20  ueue table"));. 
149f0 20 69 66 28 20 69 44 69 73 74 69 6e 63 74 20 29   if( iDistinct )
14a00 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  {.    p->addrOpe
14a10 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74  nEphm[0] = sqlit
14a20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14a30 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
14a40 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b  , iDistinct, 0);
14a50 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
14a60 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
14a70 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  eral;.  }..  /* 
14a80 44 65 74 61 63 68 20 74 68 65 20 4f 52 44 45 52  Detach the ORDER
14a90 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20   BY clause from 
14aa0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
14ab0 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64  ECT */.  p->pOrd
14ac0 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  erBy = 0;..  /* 
14ad0 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
14ae0 73 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71  s of the setup-q
14af0 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a  uery in Queue. *
14b00 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78  /.  pSetup->pNex
14b10 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  t = 0;.  rc = sq
14b20 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
14b30 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73  se, pSetup, &des
14b40 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75  tQueue);.  pSetu
14b50 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  p->pNext = p;.  
14b60 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
14b70 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71  d_of_recursive_q
14b80 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  uery;..  /* Find
14b90 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
14ba0 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f   the Queue and o
14bb0 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a  utput that row *
14bc0 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71  /.  addrTop = sq
14bd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14be0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51  v, OP_Rewind, iQ
14bf0 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29  ueue, addrBreak)
14c00 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
14c10 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65  );..  /* Transfe
14c20 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  r the next row i
14c30 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20  n Queue over to 
14c40 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  Current */.  sql
14c50 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
14c60 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43  , OP_NullRow, iC
14c70 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72  urrent); /* To r
14c80 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68  eset column cach
14c90 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65  e */.  if( pOrde
14ca0 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
14cb0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
14cc0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75  OP_Column, iQueu
14cd0 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  e, pOrderBy->nEx
14ce0 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74  pr+1, regCurrent
14cf0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
14d00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14d10 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
14d20 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72 72   iQueue, regCurr
14d30 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ent);.  }.  sqli
14d40 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
14d50 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65   OP_Delete, iQue
14d60 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  ue);..  /* Outpu
14d70 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77  t the single row
14d80 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20   in Current */. 
14d90 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69   addrCont = sqli
14da0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14db0 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65  (v);.  codeOffse
14dc0 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20  t(v, regOffset, 
14dd0 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c  addrCont);.  sel
14de0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
14df0 72 73 65 2c 20 70 2c 20 69 43 75 72 72 65 6e 74  rse, p, iCurrent
14e00 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44  ,.      0, 0, pD
14e10 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61  est, addrCont, a
14e20 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28  ddrBreak);.  if(
14e30 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20   regLimit ){.   
14e40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14e50 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
14e60 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c  pZero, regLimit,
14e70 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
14e80 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
14e90 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
14ea0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
14eb0 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20  v, addrCont);.. 
14ec0 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20   /* Execute the 
14ed0 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54  recursive SELECT
14ee0 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67   taking the sing
14ef0 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
14f00 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61  t as.  ** the va
14f10 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75  lue for the recu
14f20 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f  rsive-table. Sto
14f30 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
14f40 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a  n the Queue..  *
14f50 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
14f60 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
14f70 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  te ){.    sqlite
14f80 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14f90 2c 20 22 72 65 63 75 72 73 69 76 65 20 61 67 67  , "recursive agg
14fa0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 6e  regate queries n
14fb0 6f 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a  ot supported");.
14fc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
14fd0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
14fe0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
14ff0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75  arse, p, &destQu
15000 65 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  eue);.    assert
15010 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
15020 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
15030 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20  = pSetup;.  }.. 
15040 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67   /* Keep running
15050 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20   the loop until 
15060 74 68 65 20 51 75 65 75 65 20 69 73 20 65 6d 70  the Queue is emp
15070 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  ty */.  sqlite3V
15080 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54  dbeGoto(v, addrT
15090 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  op);.  sqlite3Vd
150a0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
150b0 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65  , addrBreak);..e
150c0 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f  nd_of_recursive_
150d0 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33  query:.  sqlite3
150e0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
150f0 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f  Parse->db, p->pO
15100 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f  rderBy);.  p->pO
15110 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
15120 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  y;.  p->pLimit =
15130 20 70 4c 69 6d 69 74 3b 0a 20 20 72 65 74 75 72   pLimit;.  retur
15140 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  n;.}.#endif /* S
15150 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a  QLITE_OMIT_CTE *
15160 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  /../* Forward re
15170 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74  ferences */.stat
15180 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
15190 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72  ctOrderBy(.  Par
151a0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
151b0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
151c0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
151d0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
151e0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
151f0 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
15200 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
15210 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
15220 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
15230 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
15240 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a  sults */.);../*.
15250 2a 2a 20 48 61 6e 64 6c 65 20 74 68 65 20 73 70  ** Handle the sp
15260 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20  ecial case of a 
15270 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
15280 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20  that originates 
15290 66 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53  from a.** VALUES
152a0 20 63 6c 61 75 73 65 2e 20 20 42 79 20 68 61 6e   clause.  By han
152b0 64 6c 69 6e 67 20 74 68 69 73 20 61 73 20 61 20  dling this as a 
152c0 73 70 65 63 69 61 6c 20 63 61 73 65 2c 20 77 65  special case, we
152d0 20 61 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72   avoid deep.** r
152e0 65 63 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68  ecursion, and th
152f0 75 73 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  us do not need t
15300 6f 20 65 6e 66 6f 72 63 65 20 74 68 65 20 53 51  o enforce the SQ
15310 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f  LITE_LIMIT_COMPO
15320 55 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e  UND_SELECT.** on
15330 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65   a VALUES clause
15340 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20  ..**.** Because 
15350 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63  the Select objec
15360 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f  t originates fro
15370 6d 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73  m a VALUES claus
15380 65 3a 0a 2a 2a 20 20 20 28 31 29 20 54 68 65 72  e:.**   (1) Ther
15390 65 20 69 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72  e is no LIMIT or
153a0 20 4f 46 46 53 45 54 20 6f 72 20 65 6c 73 65 20   OFFSET or else 
153b0 74 68 65 72 65 20 69 73 20 61 20 4c 49 4d 49 54  there is a LIMIT
153c0 20 6f 66 20 65 78 61 63 74 6c 79 20 31 0a 2a 2a   of exactly 1.**
153d0 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73     (2) All terms
153e0 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a   are UNION ALL.*
153f0 2a 20 20 20 28 33 29 20 54 68 65 72 65 20 69 73  *   (3) There is
15400 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
15410 75 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 4c  use.**.** The "L
15420 49 4d 49 54 20 6f 66 20 65 78 61 63 74 6c 79 20  IMIT of exactly 
15430 31 22 20 63 61 73 65 20 6f 66 20 63 6f 6e 64 69  1" case of condi
15440 74 69 6f 6e 20 28 31 29 20 63 6f 6d 65 73 20 61  tion (1) comes a
15450 62 6f 75 74 20 77 68 65 6e 20 61 20 56 41 4c 55  bout when a VALU
15460 45 53 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 63 63  ES.** clause occ
15470 75 72 73 20 77 69 74 68 69 6e 20 73 63 61 6c 61  urs within scala
15480 72 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65 78  r expression (ex
15490 3a 20 22 53 45 4c 45 43 54 20 28 56 41 4c 55 45  : "SELECT (VALUE
154a0 53 28 31 29 2c 28 32 29 2c 28 33 29 29 22 29 2e  S(1),(2),(3))").
154b0 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 43  .** The sqlite3C
154c0 6f 64 65 53 75 62 73 65 6c 65 63 74 20 77 69 6c  odeSubselect wil
154d0 6c 20 68 61 76 65 20 61 64 64 65 64 20 74 68 65  l have added the
154e0 20 4c 49 4d 49 54 20 31 20 63 6c 61 75 73 65 20   LIMIT 1 clause 
154f0 69 6e 20 74 68 74 20 63 61 73 65 2e 0a 2a 2a 20  in tht case..** 
15500 53 69 6e 63 65 20 74 68 65 20 6c 69 6d 69 74 20  Since the limit 
15510 69 73 20 65 78 61 63 74 6c 79 20 31 2c 20 77 65  is exactly 1, we
15520 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 65 76   only need to ev
15530 61 6c 75 74 65 73 20 74 68 65 20 6c 65 66 74 2d  alutes the left-
15540 6d 6f 73 74 20 56 41 4c 55 45 53 2e 0a 2a 2f 0a  most VALUES..*/.
15550 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
15560 53 65 6c 65 63 74 56 61 6c 75 65 73 28 0a 20 20  SelectValues(.  
15570 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
15580 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
15590 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
155a0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
155b0 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
155c0 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
155d0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
155e0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
155f0 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
15600 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
15610 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
15620 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
15630 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 69 67 68  .  Select *pRigh
15640 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 69 6e 74  tmost = p;.  int
15650 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74   nRow = 1;.  int
15660 20 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72   rc = 0;.  asser
15670 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
15680 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29   SF_MultiValue )
15690 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65  ;.  do{.    asse
156a0 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
156b0 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20  & SF_Values );. 
156c0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
156d0 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e  ==TK_ALL || (p->
156e0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op==TK_SELECT &&
156f0 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29   p->pPrior==0) )
15700 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
15710 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e  >pNext==0 || p->
15720 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70  pEList->nExpr==p
15730 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d  ->pNext->pEList-
15740 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 69 66  >nExpr );.    if
15750 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
15760 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
15770 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70  rt( p->pPrior->p
15780 4e 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70  Next==p );.    p
15790 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
157a0 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 7d 77 68 69    nRow++;.  }whi
157b0 6c 65 28 31 29 3b 0a 20 20 77 68 69 6c 65 28 20  le(1);.  while( 
157c0 70 20 29 7b 0a 20 20 20 20 70 50 72 69 6f 72 20  p ){.    pPrior 
157d0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
157e0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
157f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15800 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
15810 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 70 2d  , pDest);.    p-
15820 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
15830 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20  ;.    if( rc || 
15840 70 52 69 67 68 74 6d 6f 73 74 2d 3e 70 4c 69 6d  pRightmost->pLim
15850 69 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  it ) break;.    
15860 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
15870 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d  nRow;.    p = p-
15880 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65  >pNext;.  }.  re
15890 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
158a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
158b0 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
158c0 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71  ess a compound q
158d0 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a  uery form from.*
158e0 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  * two or more se
158f0 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75  parate queries u
15900 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f  sing UNION, UNIO
15910 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f  N ALL, EXCEPT, o
15920 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a  r.** INTERSECT.*
15930 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20  *.** "p" points 
15940 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
15950 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65  t of the two que
15960 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79  ries.  the query
15970 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20   on the.** left 
15980 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54  is p->pPrior.  T
15990 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f  he left query co
159a0 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f  uld also be a co
159b0 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20  mpound query.** 
159c0 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
159d0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
159e0 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  be called recurs
159f0 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ively. .**.** Th
15a00 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
15a10 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65   total query are
15a20 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
15a30 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f  nto a destinatio
15a40 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65  n.** of type eDe
15a50 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  st with paramete
15a60 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45  r iParm..**.** E
15a70 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69  xample 1:  Consi
15a80 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20  der a three-way 
15a90 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61  compound SQL sta
15aa0 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
15ab0 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
15ac0 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
15ad0 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
15ae0 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
15af0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74  .**.** This stat
15b00 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20  ement is parsed 
15b10 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  up as follows:.*
15b20 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
15b30 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20  c FROM t3.**    
15b40 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d    |.**      `---
15b50 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52  -->  SELECT b FR
15b60 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20  OM t2.**        
15b70 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
15b80 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d              `---
15b90 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46  --->  SELECT a F
15ba0 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65  ROM t1.**.** The
15bb0 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64   arrows in the d
15bc0 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70  iagram above rep
15bd0 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63  resent the Selec
15be0 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72  t.pPrior pointer
15bf0 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20  ..** So if this 
15c00 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
15c10 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74  d with p equal t
15c20 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20  o the t3 query, 
15c30 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77  then.** pPrior w
15c40 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75  ill be the t2 qu
15c50 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c  ery.  p->op will
15c60 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20   be TK_UNION in 
15c70 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
15c80 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63   Notice that bec
15c90 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
15ca0 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f  SQLite parses co
15cb0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20  mpound SELECTs, 
15cc0 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
15cd0 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73  l selects always
15ce0 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74   group from left
15cf0 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74   to right..*/.st
15d00 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
15d10 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
15d20 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
15d30 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
15d40 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
15d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15d60 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
15d70 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
15d80 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
15d90 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
15da0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
15db0 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
15dc0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
15dd0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f  = SQLITE_OK;   /
15de0 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66  * Success code f
15df0 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65  rom a subroutine
15e00 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
15e10 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
15e20 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
15e30 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
15e40 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
15e50 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
15e60 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
15e70 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
15e80 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
15e90 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74  est;      /* Alt
15ea0 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65  ernative data de
15eb0 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53  stination */.  S
15ec0 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d  elect *pDelete =
15ed0 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66   0;  /* Chain of
15ee0 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20   simple selects 
15ef0 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73  to delete */.  s
15f00 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
15f10 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
15f20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23   connection */.#
15f30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15f40 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74  IT_EXPLAIN.  int
15f50 20 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20   iSub1 = 0;     
15f60 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20     /* EQP id of 
15f70 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20  left-hand query 
15f80 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d  */.  int iSub2 =
15f90 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51   0;        /* EQ
15fa0 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61  P id of right-ha
15fb0 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64  nd query */.#end
15fc0 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
15fd0 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  re there is no O
15fe0 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
15ff0 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72   clause on prior
16000 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a   SELECTs.  Only.
16010 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72    ** the last (r
16020 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43  ight-most) SELEC
16030 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20  T in the series 
16040 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45  may have an ORDE
16050 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20  R BY or LIMIT.. 
16060 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20   */.  assert( p 
16070 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20  && p->pPrior ); 
16080 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63   /* Calling func
16090 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20  tion guarantees 
160a0 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61  this much */.  a
160b0 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
160c0 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
160d0 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d  ve)==0 || p->op=
160e0 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70  =TK_ALL || p->op
160f0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
16100 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
16110 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
16120 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20  Prior;.  dest = 
16130 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50  *pDest;.  if( pP
16140 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 7c  rior->pOrderBy |
16150 7c 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  | pPrior->pLimit
16160 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
16170 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
16180 25 73 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  %s clause should
16190 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
161a0 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
161b0 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72    pPrior->pOrder
161c0 42 79 21 3d 30 20 3f 20 22 4f 52 44 45 52 20 42  By!=0 ? "ORDER B
161d0 59 22 20 3a 20 22 4c 49 4d 49 54 22 2c 20 73 65  Y" : "LIMIT", se
161e0 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
161f0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
16200 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
16210 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
16220 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
16230 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
16240 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
16250 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72   /* The VDBE alr
16260 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79 20  eady created by 
16270 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
16280 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65   */..  /* Create
16290 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
162a0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
162b0 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
162c0 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44  */.  if( dest.eD
162d0 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
162e0 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
162f0 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
16300 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16310 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
16320 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53  hemeral, dest.iS
16330 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74  DParm, p->pEList
16340 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65  ->nExpr);.    de
16350 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54  st.eDest = SRT_T
16360 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  able;.  }..  /* 
16370 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  Special handling
16380 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d   for a compound-
16390 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67  select that orig
163a0 69 6e 61 74 65 73 20 61 73 20 61 20 56 41 4c 55  inates as a VALU
163b0 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  ES clause..  */.
163c0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
163d0 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75  s & SF_MultiValu
163e0 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75  e ){.    rc = mu
163f0 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28  ltiSelectValues(
16400 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
16410 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  );.    goto mult
16420 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
16430 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
16440 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e  e all SELECTs in
16450 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68   the statement h
16460 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
16470 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a  ber of elements.
16480 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65    ** in their re
16490 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a  sult sets..  */.
164a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
164b0 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70  ist && pPrior->p
164c0 45 4c 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72  EList );.  asser
164d0 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  t( p->pEList->nE
164e0 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c  xpr==pPrior->pEL
164f0 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23  ist->nExpr );..#
16500 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16510 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e  IT_CTE.  if( p->
16520 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
16530 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67  cursive ){.    g
16540 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72  enerateWithRecur
16550 73 69 76 65 51 75 65 72 79 28 70 50 61 72 73 65  siveQuery(pParse
16560 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d  , p, &dest);.  }
16570 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  else.#endif..  /
16580 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  * Compound SELEC
16590 54 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20  Ts that have an 
165a0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
165b0 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61  are handled sepa
165c0 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  rately..  */.  i
165d0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
165e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c  {.    return mul
165f0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
16600 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
16610 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a  );.  }else..  /*
16620 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
16630 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  or the left and 
16640 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61  right SELECT sta
16650 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
16660 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
16670 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
16680 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
16690 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  dr = 0;.      in
166a0 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  t nLimit;.      
166b0 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
166c0 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20  >pLimit );.     
166d0 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
166e0 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  = p->iLimit;.   
166f0 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73     pPrior->iOffs
16700 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
16710 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
16720 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
16730 74 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  t;.      explain
16740 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
16750 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
16760 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
16770 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
16780 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
16790 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  r, &dest);.     
167a0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
167b0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
167c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
167d0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
167e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
167f0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
16800 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50    p->iLimit = pP
16810 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  rior->iLimit;.  
16820 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
16830 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
16840 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  ;.      if( p->i
16850 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
16860 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
16870 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
16880 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74  IfNot, p->iLimit
16890 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
168a0 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  v);.        Vdbe
168b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d  Comment((v, "Jum
168c0 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54  p ahead if LIMIT
168d0 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20   reached"));.   
168e0 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66 66       if( p->iOff
168f0 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  set ){.         
16900 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16910 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c  p3(v, OP_OffsetL
16920 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20  imit,.          
16930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16940 20 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e    p->iLimit, p->
16950 69 4f 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f  iOffset+1, p->iO
16960 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
16970 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
16980 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
16990 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d  r(iSub2, pParse-
169a0 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
169b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
169c0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
169d0 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  , p, &dest);.   
169e0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
169f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
16a00 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
16a10 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
16a20 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
16a30 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  r;.      p->nSel
16a40 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
16a50 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
16a60 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
16a70 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
16a80 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e      if( pPrior->
16a90 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26  pLimit.       &&
16aa0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
16ab0 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c  teger(pPrior->pL
16ac0 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c  imit->pLeft, &nL
16ad0 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26 26 20  imit).       && 
16ae0 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e  nLimit>0 && p->n
16af0 53 65 6c 65 63 74 52 6f 77 20 3e 20 73 71 6c 69  SelectRow > sqli
16b00 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
16b10 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20 29 7b  Limit) .      ){
16b20 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  .        p->nSel
16b30 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
16b40 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69 6d  LogEst((u64)nLim
16b50 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  it);.      }.   
16b60 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20     if( addr ){. 
16b70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16b80 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
16b90 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dr);.      }.   
16ba0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16bb0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
16bc0 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  PT:.    case TK_
16bd0 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  UNION: {.      i
16be0 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20  nt unionTab;    
16bf0 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
16c00 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
16c10 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20  y table holding 
16c20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
16c30 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20  u8 op = 0;      
16c40 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53   /* One of the S
16c50 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  RT_ operations t
16c60 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20  o apply to self 
16c70 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69  */.      int pri
16c80 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  orOp;     /* The
16c90 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20   SRT_ operation 
16ca0 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f  to apply to prio
16cb0 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20  r selects */.   
16cc0 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b     Expr *pLimit;
16cd0 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
16ce0 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74  ues of p->nLimit
16cf0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61    */.      int a
16d00 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  ddr;.      Selec
16d10 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b  tDest uniondest;
16d20 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ..      testcase
16d30 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45  ( p->op==TK_EXCE
16d40 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  PT );.      test
16d50 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
16d60 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70  UNION );.      p
16d70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69  riorOp = SRT_Uni
16d80 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65  on;.      if( de
16d90 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f  st.eDest==priorO
16da0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  p ){.        /* 
16db0 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74  We can reuse a t
16dc0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67  emporary table g
16dd0 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45  enerated by a SE
16de0 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20  LECT to our.    
16df0 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20      ** right..  
16e00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
16e10 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d   assert( p->pLim
16e20 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  it==0 );      /*
16e30 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   Not allowed on 
16e40 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
16e50 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69  s */.        uni
16e60 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44  onTab = dest.iSD
16e70 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Parm;.      }els
16e80 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  e{.        /* We
16e90 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72   will need to cr
16ea0 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d  eate our own tem
16eb0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
16ec0 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20  hold the.       
16ed0 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65   ** intermediate
16ee0 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20   results..      
16ef0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
16f00 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  onTab = pParse->
16f10 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
16f20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
16f30 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
16f40 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
16f50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16f60 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
16f70 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
16f80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
16f90 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
16fa0 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
16fb0 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
16fc0 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
16fd0 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f       findRightmo
16fe0 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20  st(p)->selFlags 
16ff0 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
17000 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ral;.        ass
17010 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
17020 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
17030 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
17040 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
17050 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20  o our left.     
17060 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
17070 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  ( !pPrior->pOrde
17080 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  rBy );.      sql
17090 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
170a0 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70  it(&uniondest, p
170b0 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
170c0 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
170d0 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
170e0 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
170f0 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
17100 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
17110 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
17120 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  r, &uniondest);.
17130 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
17140 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
17150 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
17160 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
17170 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
17180 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
17190 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  nt.      */.    
171a0 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
171b0 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20  EXCEPT ){.      
171c0 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70    op = SRT_Excep
171d0 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
171e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
171f0 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
17200 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  );.        op = 
17210 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
17220 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69   }.      p->pPri
17230 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
17240 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
17250 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
17260 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69  t = 0;.      uni
17270 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f  ondest.eDest = o
17280 70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  p;.      explain
17290 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
172a0 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
172b0 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
172c0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
172d0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75  ct(pParse, p, &u
172e0 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
172f0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
17300 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
17310 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74    /* Query flatt
17320 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33  ening in sqlite3
17330 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72  Select() might r
17340 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42  efill p->pOrderB
17350 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73  y..      ** Be s
17360 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d  ure to delete p-
17370 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65  >pOrderBy, there
17380 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61  fore, to avoid a
17390 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f   memory leak. */
173a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
173b0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
173c0 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
173d0 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
173e0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
173f0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
17400 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  or;.      p->pOr
17410 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
17420 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55   if( p->op==TK_U
17430 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  NION ){.        
17440 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
17450 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
17460 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20  (p->nSelectRow, 
17470 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
17480 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ow);.      }.   
17490 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
174a0 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
174b0 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  it);.      p->pL
174c0 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
174d0 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
174e0 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66   0;.      p->iOf
174f0 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  fset = 0;..     
17500 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
17510 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
17520 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
17530 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
17540 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
17550 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
17560 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
17570 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69       assert( uni
17580 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50  onTab==dest.iSDP
17590 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73  arm || dest.eDes
175a0 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20  t!=priorOp );.  
175b0 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
175c0 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20  st!=priorOp ){. 
175d0 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74         int iCont
175e0 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
175f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
17600 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
17610 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20         iBreak = 
17620 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
17630 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
17640 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
17650 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
17660 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
17670 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
17680 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
17690 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
176a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
176b0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f   OP_Rewind, unio
176c0 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56  nTab, iBreak); V
176d0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
176e0 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
176f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
17700 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
17710 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
17720 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 75  oop(pParse, p, u
17730 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20 20  nionTab,.       
17740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17750 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43   0, 0, &dest, iC
17760 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ont, iBreak);.  
17770 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17780 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
17790 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20   iCont);.       
177a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
177b0 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75  p2(v, OP_Next, u
177c0 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29  nionTab, iStart)
177d0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
177e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
177f0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
17800 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
17810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17820 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
17830 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  lose, unionTab, 
17840 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
17850 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
17860 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65     default: asse
17870 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  rt( p->op==TK_IN
17880 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20  TERSECT ); {.   
17890 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62     int tab1, tab
178a0 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  2;.      int iCo
178b0 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
178c0 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  rt;.      Expr *
178d0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 69 6e  pLimit;.      in
178e0 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65  t addr;.      Se
178f0 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65  lectDest interse
17900 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e  ctdest;.      in
17910 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  t r1;..      /* 
17920 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66  INTERSECT is dif
17930 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
17940 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20  others since it 
17950 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
17960 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20  * two temporary 
17970 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69  tables.  Hence i
17980 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61  t has its own ca
17990 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20  se.  Begin.     
179a0 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e   ** by allocatin
179b0 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20  g the tables we 
179c0 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20  will need..     
179d0 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d   */.      tab1 =
179e0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
179f0 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50  .      tab2 = pP
17a00 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
17a10 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
17a20 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20  OrderBy==0 );.. 
17a30 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
17a40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17a50 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
17a60 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  l, tab1, 0);.   
17a70 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
17a80 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
17a90 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
17aa0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
17ab0 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 66 69  = addr;.      fi
17ac0 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
17ad0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
17ae0 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
17af0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
17b00 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20  EList );..      
17b10 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
17b20 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  CTs to our left 
17b30 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
17b40 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20  able "tab1"..   
17b50 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
17b60 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
17b70 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  t(&intersectdest
17b80 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
17b90 31 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  1);.      explai
17ba0 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
17bb0 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  1, pParse->iNext
17bc0 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
17bd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
17be0 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
17bf0 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65  or, &intersectde
17c00 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  st);.      if( r
17c10 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
17c20 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
17c30 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
17c40 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
17c50 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e  urrent SELECT in
17c60 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
17c70 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20  le "tab2".      
17c80 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  */.      addr = 
17c90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17ca0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
17cb0 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b  meral, tab2, 0);
17cc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17cd0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
17ce0 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
17cf0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
17d00 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [1] = addr;.    
17d10 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
17d20 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
17d30 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
17d40 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
17d50 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64        intersectd
17d60 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61  est.iSDParm = ta
17d70 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  b2;.      explai
17d80 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
17d90 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
17da0 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
17db0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
17dc0 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
17dd0 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
17de0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17df0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
17e00 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
17e10 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
17e20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
17e30 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rior;.      if( 
17e40 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50  p->nSelectRow>pP
17e50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
17e60 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
17e70 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   = pPrior->nSele
17e80 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c  ctRow;.      sql
17e90 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
17ea0 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
17eb0 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
17ec0 20 70 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 20 20   pLimit;..      
17ed0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
17ee0 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74   to take the int
17ef0 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  ersection of the
17f00 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20   two temporary. 
17f10 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a       ** tables..
17f20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
17f30 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
17f40 20 29 3b 0a 20 20 20 20 20 20 69 42 72 65 61 6b   );.      iBreak
17f50 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
17f60 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
17f70 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
17f80 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
17f90 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65  );.      compute
17fa0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
17fb0 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b  Parse, p, iBreak
17fc0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17fd0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17fe0 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
17ff0 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
18000 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 72  rage(v);.      r
18010 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
18020 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
18030 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
18040 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18050 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 74  v, OP_RowData, t
18060 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ab1, r1);.      
18070 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18080 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  4Int(v, OP_NotFo
18090 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74  und, tab2, iCont
180a0 2c 20 72 31 2c 20 30 29 3b 20 56 64 62 65 43 6f  , r1, 0); VdbeCo
180b0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
180c0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
180d0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
180e0 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74  1);.      select
180f0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
18100 2c 20 70 2c 20 74 61 62 31 2c 0a 20 20 20 20 20  , p, tab1,.     
18110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18120 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43   0, 0, &dest, iC
18130 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ont, iBreak);.  
18140 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
18150 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
18160 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cont);.      sql
18170 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18180 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c  , OP_Next, tab1,
18190 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f   iStart); VdbeCo
181a0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
181b0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
181c0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
181d0 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
181e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
181f0 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20  OP_Close, tab2, 
18200 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
18210 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18220 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30  P_Close, tab1, 0
18230 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
18240 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70      }.  }..  exp
18250 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50  lainComposite(pP
18260 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75  arse, p->op, iSu
18270 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70  b1, iSub2, p->op
18280 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a  !=TK_ALL);..  /*
18290 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69   Compute collati
182a0 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65  ng sequences use
182b0 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f  d by .  ** tempo
182c0 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64  rary tables need
182d0 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
182e0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
182f0 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68  ect..  ** Attach
18300 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
18310 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65  ucture to all te
18320 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a  mporary tables..
18330 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73    **.  ** This s
18340 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79  ection is run by
18350 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
18360 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
18370 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45   only..  ** SELE
18380 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
18390 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73   the left always
183a0 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e   skip this part.
183b0 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    The right-most
183c0 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67  .  ** SELECT mig
183d0 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69  ht also skip thi
183e0 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73  s part if it has
183f0 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
18400 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20  use and.  ** no 
18410 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20  temp tables are 
18420 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20  required..  */. 
18430 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
18440 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65   & SF_UsesEpheme
18450 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ral ){.    int i
18460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18470 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
18480 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
18490 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
184a0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
184b0 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
184c0 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75  nce for the resu
184d0 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65  lt set */.    Se
184e0 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  lect *pLoop;    
184f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18500 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
18510 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  gh SELECT statem
18520 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  ents */.    Coll
18530 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20  Seq **apColl;   
18540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
18550 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
18560 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
18570 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  [] */.    int nC
18580 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
18590 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
185a0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
185b0 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20  result set */.. 
185c0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e     assert( p->pN
185d0 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43  ext==0 );.    nC
185e0 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
185f0 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49  nExpr;.    pKeyI
18600 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
18610 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43  InfoAlloc(db, nC
18620 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  ol, 1);.    if( 
18630 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20  !pKeyInfo ){.   
18640 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
18650 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
18660 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
18670 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
18680 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c    for(i=0, apCol
18690 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  l=pKeyInfo->aCol
186a0 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
186b0 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20  apColl++){.     
186c0 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69   *apColl = multi
186d0 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
186e0 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20  arse, p, i);.   
186f0 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c     if( 0==*apCol
18700 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70  l ){.        *ap
18710 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
18720 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
18730 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f    }..    for(pLo
18740 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f  op=p; pLoop; pLo
18750 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72  op=pLoop->pPrior
18760 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
18770 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
18780 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
18790 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
187a0 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  phm[i];.        
187b0 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
187c0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30          /* If [0
187d0 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e  ] is unused then
187e0 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75   [1] is also unu
187f0 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a  sed.  So we can.
18800 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77            ** alw
18810 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74  ays safely abort
18820 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20   as soon as the 
18830 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f  first unused slo
18840 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  t is found */.  
18850 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18860 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
18870 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20  phm[1]<0 );.    
18880 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
188a0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
188b0 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c  P2(v, addr, nCol
188c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
188d0 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
188e0 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 73  , addr, (char*)s
188f0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
18900 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20  (pKeyInfo),.    
18910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18920 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e          P4_KEYIN
18930 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  FO);.        pLo
18940 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
18950 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  [i] = -1;.      
18960 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
18970 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
18980 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a  pKeyInfo);.  }..
18990 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
189a0 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74  :.  pDest->iSdst
189b0 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20   = dest.iSdst;. 
189c0 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20   pDest->nSdst = 
189d0 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71  dest.nSdst;.  sq
189e0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
189f0 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a  e(db, pDelete);.
18a00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
18a10 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
18a20 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
18a30 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45  LECT */../*.** E
18a40 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72  rror message for
18a50 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72   when two or mor
18a60 65 20 74 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d  e terms of a com
18a70 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 68 61 76  pound select hav
18a80 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73  e different.** s
18a90 69 7a 65 20 72 65 73 75 6c 74 20 73 65 74 73 2e  ize result sets.
18aa0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18ab0 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65  SelectWrongNumTe
18ac0 72 6d 73 45 72 72 6f 72 28 50 61 72 73 65 20 2a  rmsError(Parse *
18ad0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
18ae0 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  p){.  if( p->sel
18af0 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65  Flags & SF_Value
18b00 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
18b10 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
18b20 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73   "all VALUES mus
18b30 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
18b40 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22  number of terms"
18b50 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
18b60 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18b70 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
18b80 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
18b90 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
18ba0 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76      " do not hav
18bb0 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
18bc0 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
18bd0 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  mns", selectOpNa
18be0 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a  me(p->op));.  }.
18bf0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
18c00 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
18c10 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69  ne for a corouti
18c20 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ne implementatio
18c30 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54  n of a.** SELECT
18c40 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   statment..**.**
18c50 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   The data to be 
18c60 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69  output is contai
18c70 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73  ned in pIn->iSds
18c80 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a  t.  There are.**
18c90 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75   pIn->nSdst colu
18ca0 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74  mns to be output
18cb0 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72  .  pDest is wher
18cc0 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f  e the output sho
18cd0 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a  uld.** be sent..
18ce0 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20  **.** regReturn 
18cf0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
18d00 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f   the register ho
18d10 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75  lding the subrou
18d20 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61  tine.** return a
18d30 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ddress..**.** If
18d40 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20   regPrev>0 then 
18d50 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  it is the first 
18d60 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65  register in a ve
18d70 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63  ctor that.** rec
18d80 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  ords the previou
18d90 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72  s output.  mem[r
18da0 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61  egPrev] is a fla
18db0 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a  g that is false.
18dc0 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20  ** if there has 
18dd0 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73  been no previous
18de0 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67   output.  If reg
18df0 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65  Prev>0 then code
18e00 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64   is.** generated
18e10 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70   to suppress dup
18e20 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e  licates.  pKeyIn
18e30 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63  fo is used for c
18e40 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73  omparing.** keys
18e50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c  ..**.** If the L
18e60 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d  IMIT found in p-
18e70 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68  >iLimit is reach
18e80 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  ed, jump immedia
18e90 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61  tely to.** iBrea
18ea0 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
18eb0 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
18ec0 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72  ubroutine(.  Par
18ed0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
18ee0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
18ef0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
18f00 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
18f10 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
18f20 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
18f30 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49    SelectDest *pI
18f40 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72  n,        /* Cor
18f50 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67  outine supplying
18f60 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
18f70 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
18f80 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
18f90 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a  end the data */.
18fa0 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c    int regReturn,
18fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18fc0 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
18fd0 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
18fe0 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20  t regPrev,      
18ff0 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
19000 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  s result registe
19010 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73  r.  No uniquenes
19020 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49  s if 0 */.  KeyI
19030 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
19040 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61      /* For compa
19050 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f  ring with previo
19060 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e  us entry */.  in
19070 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
19080 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
19090 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65  re if we hit the
190a0 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56   LIMIT */.){.  V
190b0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
190c0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43  >pVdbe;.  int iC
190d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61  ontinue;.  int a
190e0 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73  ddr;..  addr = s
190f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
19100 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e  tAddr(v);.  iCon
19110 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
19120 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
19130 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
19140 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55  duplicates for U
19150 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
19160 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a  d INTERSECT .  *
19170 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20  /.  if( regPrev 
19180 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31  ){.    int addr1
19190 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61 64 64  , addr2;.    add
191a0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
191b0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
191c0 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64  ot, regPrev); Vd
191d0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
191e0 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
191f0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
19200 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d  OP_Compare, pIn-
19210 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b  >iSdst, regPrev+
19220 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20  1, pIn->nSdst,. 
19230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19240 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
19250 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
19260 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
19270 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
19280 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19290 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
192a0 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e  addr2+2, iContin
192b0 75 65 2c 20 61 64 64 72 32 2b 32 29 3b 20 56 64  ue, addr2+2); Vd
192c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
192d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
192e0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
192f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19300 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
19310 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  py, pIn->iSdst, 
19320 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e  regPrev+1, pIn->
19330 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71  nSdst-1);.    sq
19340 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19350 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
19360 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a  , regPrev);.  }.
19370 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
19380 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
19390 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
193a0 20 53 75 70 70 72 65 73 73 20 74 68 65 20 66 69   Suppress the fi
193b0 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69  rst OFFSET entri
193c0 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  es if there is a
193d0 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a  n OFFSET clause.
193e0 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65    */.  codeOffse
193f0 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
19400 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20   iContinue);..  
19410 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
19420 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73  Dest!=SRT_Exists
19430 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
19440 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
19450 54 61 62 6c 65 20 29 3b 0a 20 20 73 77 69 74 63  Table );.  switc
19460 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20  h( pDest->eDest 
19470 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ){.    /* Store 
19480 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
19490 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
194a0 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
194b0 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
194c0 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
194d0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
194e0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
194f0 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20  .      int r2 = 
19500 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
19510 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
19520 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19530 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
19540 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  ord, pIn->iSdst,
19550 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29   pIn->nSdst, r1)
19560 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19570 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19580 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d  NewRowid, pDest-
19590 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20  >iSDParm, r2);. 
195a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
195b0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
195c0 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ert, pDest->iSDP
195d0 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
195e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
195f0 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
19600 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
19610 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
19620 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
19630 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
19640 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19650 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
19660 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19670 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19680 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
19690 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
196a0 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
196b0 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
196c0 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 20 20 20  ELECT ...)"..   
196d0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
196e0 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _Set: {.      in
196f0 74 20 72 31 3b 0a 20 20 20 20 20 20 74 65 73 74  t r1;.      test
19700 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74  case( pIn->nSdst
19710 3e 31 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  >1 );.      r1 =
19720 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
19730 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
19740 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19750 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
19760 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74  cord, pIn->iSdst
19770 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a 20  , pIn->nSdst, . 
19780 20 20 20 20 20 20 20 20 20 72 31 2c 20 70 44 65           r1, pDe
19790 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 70 49  st->zAffSdst, pI
197a0 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
197b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
197c0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
197d0 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
197e0 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
197f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19800 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
19810 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65  P_IdxInsert, pDe
19820 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c  st->iSDParm, r1,
19830 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19840 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d              pIn-
19850 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
19860 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
19870 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19880 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
19890 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
198a0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
198b0 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
198c0 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
198d0 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
198e0 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
198f0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
19900 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
19910 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
19920 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
19930 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
19940 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
19950 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
19960 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
19970 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c  pIn->nSdst==1 ||
19980 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
19990 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 70 49  );  testcase( pI
199a0 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20  n->nSdst!=1 );. 
199b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
199c0 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
199d0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65   pIn->iSdst, pDe
199e0 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b  st->iSDParm, 1);
199f0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
19a00 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
19a10 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  jump out of the 
19a20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
19a30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19a40 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
19a50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19a60 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
19a70 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20   /* The results 
19a80 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
19a90 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
19aa0 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61  sters.    ** sta
19ab0 72 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e  rting at pDest->
19ac0 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65  iSdst.  Then the
19ad0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c   co-routine yiel
19ae0 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ds..    */.    c
19af0 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  ase SRT_Coroutin
19b00 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e: {.      if( p
19b10 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
19b20 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  {.        pDest-
19b30 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33  >iSdst = sqlite3
19b40 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
19b50 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  rse, pIn->nSdst)
19b60 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  ;.        pDest-
19b70 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53  >nSdst = pIn->nS
19b80 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dst;.      }.   
19b90 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
19ba0 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
19bb0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  In->iSdst, pDest
19bc0 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
19bd0 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
19be0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
19bf0 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
19c00 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
19c10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
19c20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f      /* If none o
19c30 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65  f the above, the
19c40 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73  n the result des
19c50 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  tination must be
19c60 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70  .    ** SRT_Outp
19c70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ut.  This routin
19c80 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
19c90 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72  d with any other
19ca0 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74  .    ** destinat
19cb0 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ion other than t
19cc0 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20  he ones handled 
19cd0 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74  above or SRT_Out
19ce0 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  put..    **.    
19cf0 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75  ** For SRT_Outpu
19d00 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  t, results are s
19d10 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65  tored in a seque
19d20 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
19d30 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20  .  .    ** Then 
19d40 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  the OP_ResultRow
19d50 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
19d60 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33  to cause sqlite3
19d70 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a  _step() to.    *
19d80 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78  * return the nex
19d90 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e  t row of result.
19da0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
19db0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
19dc0 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
19dd0 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
19de0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19df0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
19e00 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69  esultRow, pIn->i
19e10 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
19e20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19e30 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
19e40 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
19e50 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
19e60 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62  >nSdst);.      b
19e70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
19e80 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
19e90 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
19ea0 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
19eb0 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a  s reached..  */.
19ec0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
19ed0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
19ee0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44  beAddOp2(v, OP_D
19ef0 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e  ecrJumpZero, p->
19f00 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
19f10 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19f20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
19f30 72 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74  rate the subrout
19f40 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a  ine return.  */.
19f50 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
19f60 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
19f70 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74  ntinue);.  sqlit
19f80 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
19f90 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
19fa0 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e  turn);..  return
19fb0 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
19fc0 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70  Alternative comp
19fd0 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65  ound select code
19fe0 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63   generator for c
19ff0 61 73 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a  ases when there.
1a000 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  ** is an ORDER B
1a010 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  Y clause..**.** 
1a020 57 65 20 61 73 73 75 6d 65 20 61 20 71 75 65 72  We assume a quer
1a030 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
1a040 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  ng form:.**.**  
1a050 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c      <selectA>  <
1a060 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65  operator>  <sele
1a070 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c  ctB>  ORDER BY <
1a080 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a  orderbylist>.**.
1a090 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
1a0a0 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c   one of UNION AL
1a0b0 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  L, UNION, EXCEPT
1a0c0 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20  , or INTERSECT. 
1a0d0 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20   The idea.** is 
1a0e0 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65  to code both <se
1a0f0 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65  lectA> and <sele
1a100 63 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52  ctB> with the OR
1a110 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
1a120 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e  .** co-routines.
1a130 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63    Then run the c
1a140 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61  o-routines in pa
1a150 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65  rallel and merge
1a160 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
1a170 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  into the output.
1a180 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f    In addition to
1a190 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
1a1a0 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65  nes (called sele
1a1b0 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63  ctA and.** selec
1a1c0 74 42 29 20 74 68 65 72 65 20 61 72 65 20 37 20  tB) there are 7 
1a1d0 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a  subroutines:.**.
1a1e0 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d  **    outA:    M
1a1f0 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ove the output o
1a200 66 20 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f  f the selectA co
1a210 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65  routine into the
1a220 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20   output.**      
1a230 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
1a240 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a  mpound query..**
1a250 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20  .**    outB:    
1a260 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20  Move the output 
1a270 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42 20 63  of the selectB c
1a280 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68  oroutine into th
1a290 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20  e output.**     
1a2a0 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
1a2b0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20  ompound query.  
1a2c0 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20  (Only generated 
1a2d0 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a  for UNION and.**
1a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49               UNI
1a2f0 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20  ON ALL.  EXCEPT 
1a300 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e  and INSERTSECT n
1a310 65 76 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f  ever output a ro
1a320 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  w that.**       
1a330 20 20 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e        appears on
1a340 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20  ly in B.).**.** 
1a350 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c     AltB:    Call
1a360 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
1a370 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
1a380 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
1a390 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71  <B..**.**    Aeq
1a3a0 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
1a3b0 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
1a3c0 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
1a3d0 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a  ines and A==B..*
1a3e0 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20  *.**    AgtB:   
1a3f0 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
1a400 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
1a410 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
1a420 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A>B..**.**  
1a430 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65    EofA:    Calle
1a440 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
1a450 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
1a460 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lectA..**.**    
1a470 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  EofB:    Called 
1a480 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68  when data is exh
1a490 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65  austed from sele
1a4a0 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ctB..**.** The i
1a4b0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1a4c0 20 74 68 65 20 6c 61 74 74 65 72 20 66 69 76 65   the latter five
1a4d0 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70   subroutines dep
1a4e0 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a  end on which .**
1a4f0 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75   <operator> is u
1a500 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20  sed:.**.**.**   
1a510 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
1a520 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f  ALL         UNIO
1a530 4e 20 20 20 20 20 20 20 20 20 20 20 20 45 58 43  N            EXC
1a540 45 50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54  EPT          INT
1a550 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  ERSECT.**       
1a560 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
1a570 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
1a580 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
1a590 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
1a5a0 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42  ------.**   AltB
1a5b0 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
1a5c0 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
1a5d0 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
1a5e0 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41  tA         nextA
1a5f0 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20  .**.**   AeqB:  
1a600 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
1a610 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20       nextA      
1a620 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
1a630 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
1a640 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20  .**.**   AgtB:  
1a650 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
1a660 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
1a670 20 20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20         nextB    
1a680 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a          nextB.**
1a690 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75  .**   EofA:   ou
1a6a0 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f  tB, nextB      o
1a6b0 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
1a6c0 20 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20      halt        
1a6d0 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20       halt.**.** 
1a6e0 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20    EofB:   outA, 
1a6f0 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c  nextA      outA,
1a700 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74   nextA       out
1a710 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
1a720 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74   halt.**.** In t
1a730 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61  he AltB, AeqB, a
1a740 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75 74 69  nd AgtB subrouti
1a750 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41  nes, an EOF on A
1a760 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41   following nextA
1a770 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d  .** causes an im
1a780 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
1a790 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20  EofA and an EOF 
1a7a0 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  on B following n
1a7b0 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61  extB causes.** a
1a7c0 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70  n immediate jump
1a7d0 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69   to EofB.  Withi
1a7e0 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c  n EofA and EofB,
1a7f0 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72   and EOF on entr
1a800 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  y or.** followin
1a810 67 20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61  g nextX causes a
1a820 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   jump to the end
1a830 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 70   of the select p
1a840 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
1a850 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76   Duplicate remov
1a860 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c  al in the UNION,
1a870 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54   EXCEPT, and INT
1a880 45 52 53 45 43 54 20 63 61 73 65 73 20 69 73 20  ERSECT cases is 
1a890 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69  handled.** withi
1a8a0 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62  n the output sub
1a8b0 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65  routine.  The re
1a8c0 67 50 72 65 76 20 72 65 67 69 73 74 65 72 20 73  gPrev register s
1a8d0 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65  et holds the pre
1a8e0 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75  viously.** outpu
1a8f0 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70  t value.  A comp
1a900 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61  arison is made a
1a910 67 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75  gainst this valu
1a920 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  e and the output
1a930 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69  .** is skipped i
1a940 66 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c  f the next resul
1a950 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20  ts would be the 
1a960 73 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 76  same as the prev
1a970 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ious..**.** The 
1a980 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70  implementation p
1a990 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d  lan is to implem
1a9a0 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f  ent the two coro
1a9b0 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e  utines and seven
1a9c0 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20  .** subroutines 
1a9d0 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20  first, then put 
1a9e0 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69  the control logi
1a9f0 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e  c at the bottom.
1aa00 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a    Like this:.**.
1aa10 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  **          goto
1aa20 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41   Init.**     coA
1aa30 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  : coroutine for 
1aa40 6c 65 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a  left query (A).*
1aa50 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75  *     coB: corou
1aa60 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71  tine for right q
1aa70 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f  uery (B).**    o
1aa80 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20  utA: output one 
1aa90 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f  row of A.**    o
1aaa0 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20  utB: output one 
1aab0 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20  row of B (UNION 
1aac0 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e  and UNION ALL on
1aad0 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20  ly).**    EofA: 
1aae0 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20  ....**    EofB: 
1aaf0 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20  ....**    AltB: 
1ab00 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  ....**    AeqB: 
1ab10 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  ....**    AgtB: 
1ab20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20  ....**    Init: 
1ab30 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75  initialize corou
1ab40 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a  tine registers.*
1ab50 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64  *          yield
1ab60 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20   coA.**         
1ab70 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20   if eof(A) goto 
1ab80 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  EofA.**         
1ab90 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20   yield coB.**   
1aba0 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 42 29         if eof(B)
1abb0 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20   goto EofB.**   
1abc0 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41   Cmpr: Compare A
1abd0 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  , B.**          
1abe0 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c  Jump AltB, AeqB,
1abf0 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64   AgtB.**     End
1ac00 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63  : ....**.** We c
1ac10 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  all AltB, AeqB, 
1ac20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20  AgtB, EofA, and 
1ac30 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65  EofB "subroutine
1ac40 73 22 20 62 75 74 20 74 68 65 79 20 61 72 65 20  s" but they are 
1ac50 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20  not.** actually 
1ac60 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73  called using Gos
1ac70 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e  ub and they do n
1ac80 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41  ot Return.  EofA
1ac90 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a   and EofB loop.*
1aca0 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61  * until all data
1acb0 20 69 73 20 65 78 68 61 75 73 74 65 64 20 74 68   is exhausted th
1acc0 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22  en jump to the "
1acd0 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42  end" labe.  AltB
1ace0 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41  , AeqB,.** and A
1acf0 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68  gtB jump to eith
1ad00 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20  er L2 or to one 
1ad10 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e  of EofA or EofB.
1ad20 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1ad30 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
1ad40 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69  _SELECT.static i
1ad50 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
1ad60 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
1ad70 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
1ad80 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1ad90 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
1ada0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1adb0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
1adc0 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
1add0 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
1ade0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
1adf0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
1ae00 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
1ae10 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  s */.){.  int i,
1ae20 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
1ae30 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
1ae40 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
1ae50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
1ae60 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
1ae70 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
1ae80 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
1ae90 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
1aea0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1aeb0 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
1aec0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
1aed0 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73  estA;     /* Des
1aee0 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72  tination for cor
1aef0 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65  outine A */.  Se
1af00 6c 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20  lectDest destB; 
1af10 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
1af20 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
1af30 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41   B */.  int regA
1af40 64 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  ddrA;         /*
1af50 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
1af60 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63  r for select-A c
1af70 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
1af80 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20  t regAddrB;     
1af90 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
1afa0 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
1afb0 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
1afc0 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65  /.  int addrSele
1afd0 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ctA;      /* Add
1afe0 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
1aff0 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-A coroutine *
1b000 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65  /.  int addrSele
1b010 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ctB;      /* Add
1b020 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
1b030 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
1b040 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b  /.  int regOutA;
1b050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1b060 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
1b070 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73  r the output-A s
1b080 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1b090 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20  nt regOutB;     
1b0a0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1b0b0 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65  register for the
1b0c0 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
1b0d0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1b0e0 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20  drOutA;         
1b0f0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1b100 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
1b110 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
1b120 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20  ddrOutB = 0;    
1b130 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1b140 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
1b150 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b160 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20  addrEofA;       
1b170 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1b180 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68  the select-A-exh
1b190 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
1b1a0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  e */.  int addrE
1b1b0 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20  ofA_noB;     /* 
1b1c0 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f  Alternate addrEo
1b1d0 66 41 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69  fA if B is unini
1b1e0 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e  tialized */.  in
1b1f0 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20  t addrEofB;     
1b200 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1b210 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65  f the select-B-e
1b220 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
1b230 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1b240 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f  rAltB;         /
1b250 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1b260 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20   A<B subroutine 
1b270 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71  */.  int addrAeq
1b280 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
1b290 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d  dress of the A==
1b2a0 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
1b2b0 20 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20    int addrAgtB; 
1b2c0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1b2d0 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75  ss of the A>B su
1b2e0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
1b2f0 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20  t regLimitA;    
1b300 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67      /* Limit reg
1b310 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
1b320 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  -A */.  int regL
1b330 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a  imitB;        /*
1b340 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
1b350 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
1b360 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20    int regPrev;  
1b370 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e          /* A ran
1b380 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ge of registers 
1b390 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73  to hold previous
1b3a0 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74   output */.  int
1b3b0 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20   savedLimit;    
1b3c0 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
1b3d0 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a  e of p->iLimit *
1b3e0 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66  /.  int savedOff
1b3f0 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76  set;      /* Sav
1b400 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69  ed value of p->i
1b410 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  Offset */.  int 
1b420 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20  labelCmpr;      
1b430 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74    /* Label for t
1b440 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1b450 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20  merge algorithm 
1b460 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e  */.  int labelEn
1b470 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  d;         /* La
1b480 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20  bel for the end 
1b490 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53  of the overall S
1b4a0 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20  ELECT stmt */.  
1b4b0 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
1b4c0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e        /* Jump in
1b4d0 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20  structions that 
1b4e0 67 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20  get retargetted 
1b4f0 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
1b500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
1b510 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f  e of TK_ALL, TK_
1b520 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54  UNION, TK_EXCEPT
1b530 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a  , TK_INTERSECT *
1b540 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
1b550 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d  yDup = 0; /* Com
1b560 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
1b570 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ion for duplicat
1b580 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b  e removal */.  K
1b590 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67  eyInfo *pKeyMerg
1b5a0 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73  e;   /* Comparis
1b5b0 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  on information f
1b5c0 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20  or merging rows 
1b5d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1b5e0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
1b5f0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1b600 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  n */.  ExprList 
1b610 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20  *pOrderBy;   /* 
1b620 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
1b630 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72  use */.  int nOr
1b640 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f  derBy;         /
1b650 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
1b660 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
1b670 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
1b680 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20  t *aPermute;    
1b690 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
1b6a0 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72  rom ORDER BY ter
1b6b0 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74  ms to result set
1b6c0 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e   columns */.#ifn
1b6d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b6e0 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53  EXPLAIN.  int iS
1b6f0 75 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  ub1;            
1b700 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66  /* EQP id of lef
1b710 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
1b720 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20    int iSub2;    
1b730 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
1b740 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20  d of right-hand 
1b750 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a  query */.#endif.
1b760 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
1b770 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61  rderBy!=0 );.  a
1b780 73 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d  ssert( pKeyDup==
1b790 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64  0 ); /* "Managed
1b7a0 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69  " code needs thi
1b7b0 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32  s.  Ticket #3382
1b7c0 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  . */.  db = pPar
1b7d0 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50  se->db;.  v = pP
1b7e0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
1b7f0 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
1b800 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20       /* Already 
1b810 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72  thrown the error
1b820 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66   if VDBE alloc f
1b830 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c  ailed */.  label
1b840 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
1b850 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1b860 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c   labelCmpr = sql
1b870 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1b880 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74  l(v);...  /* Pat
1b890 63 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20  ch up the ORDER 
1b8a0 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  BY clause.  */. 
1b8b0 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20   op = p->op;  . 
1b8c0 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
1b8d0 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ior;.  assert( p
1b8e0 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d  Prior->pOrderBy=
1b8f0 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79  =0 );.  pOrderBy
1b900 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
1b910 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
1b920 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79  By );.  nOrderBy
1b930 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
1b940 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70  pr;..  /* For op
1b950 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68  erators other th
1b960 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20  an UNION ALL we 
1b970 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  have to make sur
1b980 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  e that.  ** the 
1b990 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1b9a0 63 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72  covers every ter
1b9b0 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  m of the result 
1b9c0 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74  set.  Add.  ** t
1b9d0 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45  erms to the ORDE
1b9e0 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e  R BY clause as n
1b9f0 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
1ba00 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20   if( op!=TK_ALL 
1ba10 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
1ba20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1ba30 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c  ==0 && i<=p->pEL
1ba40 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1ba50 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
1ba60 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
1ba70 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  tem;.      for(j
1ba80 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =0, pItem=pOrder
1ba90 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42  By->a; j<nOrderB
1baa0 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  y; j++, pItem++)
1bab0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1bac0 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
1bad0 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20  derByCol>0 );.  
1bae0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
1baf0 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
1bb00 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==i ) break;.   
1bb10 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
1bb20 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ==nOrderBy ){.  
1bb30 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
1bb40 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
1bb50 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  b, TK_INTEGER, 0
1bb60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1bb70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
1bb80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
1bb90 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  T;.        pNew-
1bba0 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
1bbb0 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
1bbc0 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
1bbd0 69 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f  i;.        p->pO
1bbe0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
1bbf0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
1bc00 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1bc10 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77  , pOrderBy, pNew
1bc20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1bc30 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72  OrderBy ) pOrder
1bc40 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b  By->a[nOrderBy++
1bc50 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
1bc60 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20  l = (u16)i;.    
1bc70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1bc80 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
1bc90 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75  comparison permu
1bca0 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e  tation and keyin
1bcb0 66 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20  fo that is used 
1bcc0 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65  with.  ** the pe
1bcd0 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74  rmutation used t
1bce0 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
1bcf0 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77  he next.  ** row
1bd00 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65   of results come
1bd10 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f  s from selectA o
1bd20 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f  r selectB.  Also
1bd30 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20   add explicit.  
1bd40 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f  ** collations to
1bd50 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1bd60 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68  ause terms so th
1bd70 61 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71  at when the subq
1bd80 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74  ueries.  ** to t
1bd90 68 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65  he right and the
1bda0 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61   left are evalua
1bdb0 74 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68  ted, they use th
1bdc0 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63  e correct.  ** c
1bdd0 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  ollation..  */. 
1bde0 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69   aPermute = sqli
1bdf0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
1be00 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  (db, sizeof(int)
1be10 2a 28 6e 4f 72 64 65 72 42 79 20 2b 20 31 29 29  *(nOrderBy + 1))
1be20 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65  ;.  if( aPermute
1be30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
1be40 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
1be50 74 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75 74  tem;.    aPermut
1be60 65 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b  e[0] = nOrderBy;
1be70 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49  .    for(i=1, pI
1be80 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
1be90 20 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b   i<=nOrderBy; i+
1bea0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1beb0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
1bec0 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
1bed0 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  l>0 );.      ass
1bee0 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  ert( pItem->u.x.
1bef0 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e  iOrderByCol<=p->
1bf00 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
1bf10 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b  .      aPermute[
1bf20 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  i] = pItem->u.x.
1bf30 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b  iOrderByCol - 1;
1bf40 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d  .    }.    pKeyM
1bf50 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65  erge = multiSele
1bf60 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f  ctOrderByKeyInfo
1bf70 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a  (pParse, p, 1);.
1bf80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65    }else{.    pKe
1bf90 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  yMerge = 0;.  }.
1bfa0 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74  .  /* Reattach t
1bfb0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1bfc0 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e  se to the query.
1bfd0 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  .  */.  p->pOrde
1bfe0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
1bff0 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72    pPrior->pOrder
1c000 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
1c010 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e  ListDup(pParse->
1c020 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29  db, pOrderBy, 0)
1c030 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
1c040 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70   a range of temp
1c050 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20  orary registers 
1c060 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  and the KeyInfo 
1c070 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20  needed.  ** for 
1c080 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72  the logic that r
1c090 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65  emoves duplicate
1c0a0 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65   result rows whe
1c0b0 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61  n the.  ** opera
1c0c0 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58  tor is UNION, EX
1c0d0 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45  CEPT, or INTERSE
1c0e0 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f  CT (but not UNIO
1c0f0 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69  N ALL)..  */.  i
1c100 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op==TK_ALL ){
1c110 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30  .    regPrev = 0
1c120 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1c130 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45  nt nExpr = p->pE
1c140 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
1c150 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42   assert( nOrderB
1c160 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  y>=nExpr || db->
1c170 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1c180 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50      regPrev = pP
1c190 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
1c1a0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
1c1b0 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73  = nExpr+1;.    s
1c1c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1c1d0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1c1e0 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20  0, regPrev);.   
1c1f0 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74   pKeyDup = sqlit
1c200 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
1c210 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20  b, nExpr, 1);.  
1c220 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b    if( pKeyDup ){
1c230 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
1c240 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
1c250 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70  riteable(pKeyDup
1c260 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ) );.      for(i
1c270 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  =0; i<nExpr; i++
1c280 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  ){.        pKeyD
1c290 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d  up->aColl[i] = m
1c2a0 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
1c2b0 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
1c2c0 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
1c2d0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1c2e0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1c2f0 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65   }.  }. .  /* Se
1c300 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20  parate the left 
1c310 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75  and the right qu
1c320 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f  ery from one ano
1c330 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  ther.  */.  p->p
1c340 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72  Prior = 0;.  pPr
1c350 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  ior->pNext = 0;.
1c360 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
1c370 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
1c380 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65  rse, p, p->pOrde
1c390 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
1c3a0 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72   if( pPrior->pPr
1c3b0 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ior==0 ){.    sq
1c3c0 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
1c3d0 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
1c3e0 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d   pPrior, pPrior-
1c3f0 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
1c400 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  R");.  }..  /* C
1c410 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74  ompute the limit
1c420 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
1c430 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
1c440 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
1c450 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66   labelEnd);.  if
1c460 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f  ( p->iLimit && o
1c470 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
1c480 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70   regLimitA = ++p
1c490 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1c4a0 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70   regLimitB = ++p
1c4b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1c4c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c4d0 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p2(v, OP_Copy, p
1c4e0 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69  ->iOffset ? p->i
1c4f0 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c  Offset+1 : p->iL
1c500 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20  imit,.          
1c510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c520 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74          regLimit
1c530 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
1c540 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1c550 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c  Copy, regLimitA,
1c560 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d   regLimitB);.  }
1c570 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d  else{.    regLim
1c580 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20  itA = regLimitB 
1c590 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
1c5a0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1c5b0 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70   p->pLimit);.  p
1c5c0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20  ->pLimit = 0;.. 
1c5d0 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50   regAddrA = ++pP
1c5e0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
1c5f0 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73  gAddrB = ++pPars
1c600 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75  e->nMem;.  regOu
1c610 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
1c620 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d  Mem;.  regOutB =
1c630 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1c640 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1c650 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c  DestInit(&destA,
1c660 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
1c670 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
1c680 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
1c690 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43  it(&destB, SRT_C
1c6a0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
1c6b0 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  rB);..  /* Gener
1c6c0 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
1c6d0 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
1c6e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1c6f0 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66   to the.  ** lef
1c700 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  t of the compoun
1c710 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65  d operator - the
1c720 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a   "A" select..  *
1c730 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20  /.  addrSelectA 
1c740 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1c750 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b  rentAddr(v) + 1;
1c760 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
1c770 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1c780 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
1c790 2c 20 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61  , regAddrA, 0, a
1c7a0 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56  ddrSelectA);.  V
1c7b0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1c7c0 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  left SELECT"));.
1c7d0 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74    pPrior->iLimit
1c7e0 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20   = regLimitA;.  
1c7f0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
1c800 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
1c810 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
1c820 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1c830 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
1c840 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69   &destA);.  sqli
1c850 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
1c860 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72 41 29  ine(v, regAddrA)
1c870 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
1c880 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
1c890 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1c8a0 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
1c8b0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
1c8c0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
1c8d0 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68  n .  ** the righ
1c8e0 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65  t - the "B" sele
1c8f0 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65  ct.  */.  addrSe
1c900 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56  lectB = sqlite3V
1c910 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1c920 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d  ) + 1;.  addr1 =
1c930 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c940 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
1c950 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
1c960 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 42  , 0, addrSelectB
1c970 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
1c980 28 28 76 2c 20 22 72 69 67 68 74 20 53 45 4c 45  ((v, "right SELE
1c990 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69  CT"));.  savedLi
1c9a0 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
1c9b0 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d  .  savedOffset =
1c9c0 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70   p->iOffset;.  p
1c9d0 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69  ->iLimit = regLi
1c9e0 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  mitB;.  p->iOffs
1c9f0 65 74 20 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c  et = 0;  .  expl
1ca00 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
1ca10 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
1ca20 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73  xtSelectId);.  s
1ca30 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1ca40 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b  rse, p, &destB);
1ca50 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73  .  p->iLimit = s
1ca60 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e  avedLimit;.  p->
1ca70 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f  iOffset = savedO
1ca80 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33  ffset;.  sqlite3
1ca90 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
1caa0 28 76 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a  (v, regAddrB);..
1cab0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1cac0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
1cad0 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
1cae0 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41  ent row of the A
1caf0 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
1cb00 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
1cb10 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
1cb20 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
1cb30 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1cb40 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
1cb50 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b  outine for A"));
1cb60 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65  .  addrOutA = ge
1cb70 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
1cb80 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
1cb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cba0 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74  p, &destA, pDest
1cbb0 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20  , regOutA,.     
1cbc0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
1cbd0 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61  rev, pKeyDup, la
1cbe0 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a  belEnd);.  .  /*
1cbf0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1cc00 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
1cc10 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  uts the current 
1cc20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a  row of the B.  *
1cc30 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20  * select as the 
1cc40 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20  next output row 
1cc50 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
1cc60 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69  select..  */.  i
1cc70 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  f( op==TK_ALL ||
1cc80 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b   op==TK_UNION ){
1cc90 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1cca0 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
1ccb0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29   routine for B")
1ccc0 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20  );.    addrOutB 
1ccd0 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
1cce0 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
1ccf0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1cd00 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70      p, &destB, p
1cd10 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20  Dest, regOutB,. 
1cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd30 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
1cd40 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d  , labelEnd);.  }
1cd50 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  .  sqlite3KeyInf
1cd60 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b  oUnref(pKeyDup);
1cd70 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1cd80 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
1cd90 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
1cda0 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
1cdb0 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   A.  ** are exha
1cdc0 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
1cdd0 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20  ata in select B 
1cde0 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
1cdf0 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50  if( op==TK_EXCEP
1ce00 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45  T || op==TK_INTE
1ce10 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
1ce20 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72  rEofA_noB = addr
1ce30 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b  EofA = labelEnd;
1ce40 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20  .  }else{  .    
1ce50 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1ce60 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f  (v, "eof-A subro
1ce70 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
1ce80 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33  drEofA = sqlite3
1ce90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1cea0 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c  _Gosub, regOutB,
1ceb0 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20   addrOutB);.    
1cec0 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73  addrEofA_noB = s
1ced0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1cee0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1cef0 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64  gAddrB, labelEnd
1cf00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1cf30 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1cf40 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1cf50 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70  addrEofA);.    p
1cf60 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
1cf70 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
1cf80 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70  p->nSelectRow, p
1cf90 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
1cfa0 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  w);.  }..  /* Ge
1cfb0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1cfc0 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
1cfd0 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
1cfe0 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61   select B.  ** a
1cff0 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
1d000 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
1d010 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a  lect A remains..
1d020 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
1d030 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
1d040 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64     addrEofB = ad
1d050 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20  drEofA;.    if( 
1d060 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20  p->nSelectRow > 
1d070 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
1d080 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow ) p->nSelectR
1d090 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
1d0a0 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65  lectRow;.  }else
1d0b0 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  {  .    VdbeNoop
1d0c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
1d0d0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1d0e0 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  ;.    addrEofB =
1d0f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d100 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1d110 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
1d120 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
1d130 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d140 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1d150 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62 65   labelEnd); Vdbe
1d160 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1d170 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1d180 28 76 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20  (v, addrEofB);. 
1d190 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1d1a0 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
1d1b0 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42   the case of A<B
1d1c0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1d1d0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c  Comment((v, "A-l
1d1e0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
1d1f0 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20  );.  addrAltB = 
1d200 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d210 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1d220 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
1d230 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1d240 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1d250 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ld, regAddrA, ad
1d260 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76  drEofA); VdbeCov
1d270 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1d280 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1d290 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
1d2a0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1d2b0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
1d2c0 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20  e of A==B.  */. 
1d2d0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1d2e0 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
1d2f0 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65  = addrAltB;.  }e
1d300 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  lse if( op==TK_I
1d310 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
1d320 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
1d330 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74  ltB;.    addrAlt
1d340 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  B++;.  }else{.  
1d350 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1d360 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75  t((v, "A-eq-B su
1d370 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
1d380 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20   addrAeqB =.    
1d390 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d3a0 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1d3b0 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
1d3c0 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  A); VdbeCoverage
1d3d0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1d3e0 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65  VdbeGoto(v, labe
1d3f0 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lCmpr);.  }..  /
1d400 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1d410 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1d420 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20  se of A>B.  */. 
1d430 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1d440 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62  ((v, "A-gt-B sub
1d450 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
1d460 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33  drAgtB = sqlite3
1d470 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1d480 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  v);.  if( op==TK
1d490 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
1d4a0 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  NION ){.    sqli
1d4b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d4c0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1d4d0 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
1d4e0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1d4f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1d500 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ld, regAddrB, ad
1d510 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76  drEofB); VdbeCov
1d520 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1d530 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1d540 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
1d550 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20   This code runs 
1d560 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  once to initiali
1d570 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20  ze everything.. 
1d580 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1d590 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
1d5a0 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
1d5b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1d5c0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1d5d0 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56  addrEofA_noB); V
1d5e0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1d5f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d600 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1d610 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45   regAddrB, addrE
1d620 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofB); VdbeCovera
1d630 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70  ge(v);..  /* Imp
1d640 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20  lement the main 
1d650 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  merge loop.  */.
1d660 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1d670 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
1d680 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74  elCmpr);.  sqlit
1d690 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1d6a0 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20  OP_Permutation, 
1d6b0 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29  0, 0, 0, (char*)
1d6c0 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54  aPermute, P4_INT
1d6d0 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65  ARRAY);.  sqlite
1d6e0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1d6f0 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41  P_Compare, destA
1d700 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53  .iSdst, destB.iS
1d710 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20  dst, nOrderBy,. 
1d720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d730 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1d740 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59  KeyMerge, P4_KEY
1d750 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
1d760 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
1d770 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b  OPFLAG_PERMUTE);
1d780 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1d790 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
1d7a0 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41   addrAltB, addrA
1d7b0 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 20  eqB, addrAgtB); 
1d7c0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1d7d0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
1d7e0 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  he this point in
1d7f0 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e   order to termin
1d800 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20  ate the query.. 
1d810 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1d820 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1d830 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f   labelEnd);..  /
1d840 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65  * Reassembly the
1d850 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
1d860 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
1d870 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74  be freed correct
1d880 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63  ly.  ** by the c
1d890 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
1d8a0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
1d8b0 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
1d8c0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
1d8d0 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
1d8e0 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  }.  p->pPrior = 
1d8f0 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72  pPrior;.  pPrior
1d900 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20  ->pNext = p;..  
1d910 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72  /*** TBD:  Inser
1d920 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c  t subroutine cal
1d930 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73  ls to close curs
1d940 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74  ors on incomplet
1d950 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72  e.  **** subquer
1d960 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c  ies ****/.  expl
1d970 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61  ainComposite(pPa
1d980 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62  rse, p->op, iSub
1d990 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20  1, iSub2, 0);.  
1d9a0 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e  return pParse->n
1d9b0 45 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66  Err!=0;.}.#endif
1d9c0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
1d9d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1d9e0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1d9f0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1da00 57 29 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e  W)../* An instan
1da10 63 65 20 6f 66 20 74 68 65 20 53 75 62 73 74 43  ce of the SubstC
1da20 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 64 65  ontext object de
1da30 73 63 72 69 62 65 73 20 61 6e 20 73 75 62 73 74  scribes an subst
1da40 69 74 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20  itution edit.** 
1da50 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  to be performed 
1da60 6f 6e 20 61 20 70 61 72 73 65 20 74 72 65 65 2e  on a parse tree.
1da70 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72  .**.** All refer
1da80 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
1da90 20 69 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65   in table iTable
1daa0 20 61 72 65 20 74 6f 20 62 65 20 72 65 70 6c 61   are to be repla
1dab0 63 65 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e  ced by correspon
1dac0 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69  ding.** expressi
1dad0 6f 6e 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a  ons in pEList..*
1dae0 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1daf0 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a   SubstContext {.
1db00 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
1db10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1db20 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
1db30 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  xt */.  int iTab
1db40 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
1db50 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 72 65 66    /* Replace ref
1db60 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20  erences to this 
1db70 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1db80 4e 65 77 54 61 62 6c 65 3b 20 20 20 20 20 20 20  NewTable;       
1db90 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c       /* New tabl
1dba0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
1dbb0 74 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20  t isLeftJoin;   
1dbc0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 54          /* Add T
1dbd0 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70  K_IF_NULL_ROW op
1dbe0 63 6f 64 65 73 20 6f 6e 20 65 61 63 68 20 72 65  codes on each re
1dbf0 70 6c 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45  placement */.  E
1dc00 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
1dc10 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c           /* Repl
1dc20 61 63 65 6d 65 6e 74 20 65 78 70 72 65 73 73 69  acement expressi
1dc30 6f 6e 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f  ons */.} SubstCo
1dc40 6e 74 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61  ntext;../* Forwa
1dc50 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20  rd Declarations 
1dc60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1dc70 75 62 73 74 45 78 70 72 4c 69 73 74 28 53 75 62  ubstExprList(Sub
1dc80 73 74 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72  stContext*, Expr
1dc90 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76  List*);.static v
1dca0 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
1dcb0 53 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53  SubstContext*, S
1dcc0 65 6c 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  elect*, int);../
1dcd0 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67  *.** Scan throug
1dce0 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
1dcf0 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65   pExpr.  Replace
1dd00 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
1dd10 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20   to.** a column 
1dd20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
1dd30 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f  iTable with a co
1dd40 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d  py of the iColum
1dd50 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  n-th.** entry in
1dd60 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c   pEList.  (But l
1dd70 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20  eave references 
1dd80 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c  to the ROWID col
1dd90 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  umn .** unchange
1dda0 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d.).**.** This r
1ddb0 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f  outine is part o
1ddc0 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  f the flattening
1ddd0 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73   procedure.  A s
1dde0 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65  ubquery.** whose
1ddf0 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64   result set is d
1de00 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74  efined by pEList
1de10 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72   appears as entr
1de20 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d  y in the.** FROM
1de30 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
1de40 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68  ECT such that th
1de50 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73  e VDBE cursor as
1de60 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a  signed to that.*
1de70 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e  * FORM clause en
1de80 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20  try is iTable.  
1de90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
1dea0 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  es the necessary
1deb0 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
1dec0 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74  pExpr so that it
1ded0 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
1dee0 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74   to the source t
1def0 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73  able.** of the s
1df00 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74  ubquery rather t
1df10 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
1df20 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a   the subquery..*
1df30 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73  /.static Expr *s
1df40 75 62 73 74 45 78 70 72 28 0a 20 20 53 75 62 73  ubstExpr(.  Subs
1df50 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74  tContext *pSubst
1df60 2c 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f  ,  /* Descriptio
1df70 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74  n of the substit
1df80 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ution */.  Expr 
1df90 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
1dfa0 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69    /* Expr in whi
1dfb0 63 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  ch substitution 
1dfc0 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69  occurs */.){.  i
1dfd0 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
1dfe0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78  turn 0;.  if( Ex
1dff0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1e000 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
1e010 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69  ).   && pExpr->i
1e020 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d  RightJoinTable==
1e030 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 0a 20  pSubst->iTable. 
1e040 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   ){.    pExpr->i
1e050 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
1e060 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62   pSubst->iNewTab
1e070 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45  le;.  }.  if( pE
1e080 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
1e090 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
1e0a0 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61  ble==pSubst->iTa
1e0b0 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ble ){.    if( p
1e0c0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
1e0d0 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
1e0e0 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
1e0f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
1e100 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  xpr *pNew;.     
1e110 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 70   Expr *pCopy = p
1e120 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  Subst->pEList->a
1e130 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
1e140 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78  .pExpr;.      Ex
1e150 70 72 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20  pr ifNullRow;.  
1e160 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
1e170 73 74 2d 3e 70 45 4c 69 73 74 21 3d 30 20 26 26  st->pEList!=0 &&
1e180 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
1e190 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e  pSubst->pEList->
1e1a0 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
1e1b0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
1e1c0 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
1e1d0 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
1e1e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1e1f0 78 70 72 49 73 56 65 63 74 6f 72 28 70 43 6f 70  xprIsVector(pCop
1e200 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  y) ){.        sq
1e210 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72  lite3VectorError
1e220 4d 73 67 28 70 53 75 62 73 74 2d 3e 70 50 61 72  Msg(pSubst->pPar
1e230 73 65 2c 20 70 43 6f 70 79 29 3b 0a 20 20 20 20  se, pCopy);.    
1e240 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e250 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1e260 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64  Subst->pParse->d
1e270 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  b;.        if( p
1e280 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f 69  Subst->isLeftJoi
1e290 6e 20 26 26 20 70 43 6f 70 79 2d 3e 6f 70 21 3d  n && pCopy->op!=
1e2a0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
1e2b0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 69         memset(&i
1e2c0 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20 73 69 7a  fNullRow, 0, siz
1e2d0 65 6f 66 28 69 66 4e 75 6c 6c 52 6f 77 29 29 3b  eof(ifNullRow));
1e2e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c  .          ifNul
1e2f0 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49 46 5f  lRow.op = TK_IF_
1e300 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20 20 20  NULL_ROW;.      
1e310 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 70 4c      ifNullRow.pL
1e320 65 66 74 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20  eft = pCopy;.   
1e330 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77         ifNullRow
1e340 2e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74  .iTable = pSubst
1e350 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20  ->iNewTable;.   
1e360 20 20 20 20 20 20 20 70 43 6f 70 79 20 3d 20 26         pCopy = &
1e370 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20  ifNullRow;.     
1e380 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65     }.        pNe
1e390 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  w = sqlite3ExprD
1e3a0 75 70 28 64 62 2c 20 70 43 6f 70 79 2c 20 30 29  up(db, pCopy, 0)
1e3b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
1e3c0 65 77 20 26 26 20 70 53 75 62 73 74 2d 3e 69 73  ew && pSubst->is
1e3d0 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
1e3e0 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f        ExprSetPro
1e3f0 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 43  perty(pNew, EP_C
1e400 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  anBeNull);.     
1e410 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1e420 20 70 4e 65 77 20 26 26 20 45 78 70 72 48 61 73   pNew && ExprHas
1e430 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45  Property(pExpr,E
1e440 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
1e450 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69           pNew->i
1e460 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
1e470 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f   pExpr->iRightJo
1e480 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  inTable;.       
1e490 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
1e4a0 74 79 28 70 4e 65 77 2c 20 45 50 5f 46 72 6f 6d  ty(pNew, EP_From
1e4b0 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  Join);.        }
1e4c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e4d0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1e4e0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70  Expr);.        p
1e4f0 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Expr = pNew;.   
1e500 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
1e510 73 65 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70  se{.    if( pExp
1e520 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c  r->op==TK_IF_NUL
1e530 4c 5f 52 4f 57 20 26 26 20 70 45 78 70 72 2d 3e  L_ROW && pExpr->
1e540 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e  iTable==pSubst->
1e550 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
1e560 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
1e570 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c  pSubst->iNewTabl
1e580 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 78  e;.    }.    pEx
1e590 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73  pr->pLeft = subs
1e5a0 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 45  tExpr(pSubst, pE
1e5b0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
1e5c0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
1e5d0 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73   substExpr(pSubs
1e5e0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1e5f0 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
1e600 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1e610 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1e620 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
1e630 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70 45 78  lect(pSubst, pEx
1e640 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 31  pr->x.pSelect, 1
1e650 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1e660 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1e670 74 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d  t(pSubst, pExpr-
1e680 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
1e690 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
1e6a0 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  xpr;.}.static vo
1e6b0 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
1e6c0 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74  (.  SubstContext
1e6d0 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73   *pSubst, /* Des
1e6e0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1e6f0 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a  substitution */.
1e700 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1e710 74 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t       /* List 
1e720 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77  to scan and in w
1e730 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
1e740 73 74 69 74 75 74 65 73 20 2a 2f 0a 29 7b 0a 20  stitutes */.){. 
1e750 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1e760 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1e770 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1e780 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1e790 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  {.    pList->a[i
1e7a0 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45  ].pExpr = substE
1e7b0 78 70 72 28 70 53 75 62 73 74 2c 20 70 4c 69 73  xpr(pSubst, pLis
1e7c0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
1e7d0 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
1e7e0 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20  d substSelect(. 
1e7f0 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70   SubstContext *p
1e800 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69  Subst, /* Descri
1e810 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62  ption of the sub
1e820 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 53  stitution */.  S
1e830 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1e840 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
1e850 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63  tatement in whic
1e860 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
1e870 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  tutions */.  int
1e880 20 64 6f 50 72 69 6f 72 20 20 20 20 20 20 20 20   doPrior        
1e890 20 20 20 2f 2a 20 44 6f 20 73 75 62 73 74 69 74     /* Do substit
1e8a0 75 74 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69 6f  utes on p->pPrio
1e8b0 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72  r too */.){.  Sr
1e8c0 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73  cList *pSrc;.  s
1e8d0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1e8e0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
1e8f0 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72   i;.  if( !p ) r
1e900 65 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20  eturn;.  do{.   
1e910 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
1e920 53 75 62 73 74 2c 20 70 2d 3e 70 45 4c 69 73 74  Subst, p->pEList
1e930 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
1e940 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e  List(pSubst, p->
1e950 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
1e960 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1e970 62 73 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  bst, p->pOrderBy
1e980 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  );.    p->pHavin
1e990 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53  g = substExpr(pS
1e9a0 75 62 73 74 2c 20 70 2d 3e 70 48 61 76 69 6e 67  ubst, p->pHaving
1e9b0 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65  );.    p->pWhere
1e9c0 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75   = substExpr(pSu
1e9d0 62 73 74 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  bst, p->pWhere);
1e9e0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  .    pSrc = p->p
1e9f0 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Src;.    assert(
1ea00 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20   pSrc!=0 );.    
1ea10 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
1ea20 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b  , pItem=pSrc->a;
1ea30 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
1ea40 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ++){.      subst
1ea50 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70  Select(pSubst, p
1ea60 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 31  Item->pSelect, 1
1ea70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
1ea80 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
1ea90 20 29 7b 0a 20 20 20 20 20 20 20 20 73 75 62 73   ){.        subs
1eaa0 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74  tExprList(pSubst
1eab0 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e  , pItem->u1.pFun
1eac0 63 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  cArg);.      }. 
1ead0 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64     }.  }while( d
1eae0 6f 50 72 69 6f 72 20 26 26 20 28 70 20 3d 20 70  oPrior && (p = p
1eaf0 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a  ->pPrior)!=0 );.
1eb00 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
1eb10 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1eb20 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1eb30 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1eb40 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66  IT_VIEW) */..#if
1eb50 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1eb60 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1eb70 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1eb80 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
1eb90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1eba0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
1ebb0 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
1ebc0 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  as a performance
1ebd0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
1ebe0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
1ebf0 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
1ec00 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
1ec10 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
1ec20 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ing occurs..**.*
1ec30 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  * To understand 
1ec40 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66  the concept of f
1ec50 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69  lattening, consi
1ec60 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
1ec70 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  g.** query:.**.*
1ec80 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
1ec90 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20  ROM (SELECT x+y 
1eca0 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
1ecb0 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20  RE z<100) WHERE 
1ecc0 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  a>5.**.** The de
1ecd0 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70  fault way of imp
1ece0 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71  lementing this q
1ecf0 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75  uery is to execu
1ed00 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65  te the.** subque
1ed10 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f  ry first and sto
1ed20 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
1ed30 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
1ed40 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e  ble, then.** run
1ed50 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1ed60 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
1ed70 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  ry table.  This 
1ed80 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20  requires two.** 
1ed90 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20  passes over the 
1eda0 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f  data.  Furthermo
1edb0 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  re, because the 
1edc0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
1edd0 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65  ** has no indice
1ede0 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  s, the WHERE cla
1edf0 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72  use on the outer
1ee00 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65   query cannot be
1ee10 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a  .** optimized..*
1ee20 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ee30 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  e attempts to re
1ee40 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75  write queries su
1ee50 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20  ch as the above 
1ee60 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
1ee70 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69   flat select, li
1ee80 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1ee90 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53     SELECT x+y AS
1eea0 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
1eeb0 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a   z<100 AND a>5.*
1eec0 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65  *.** The code ge
1eed0 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73  nerated for this
1eee0 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20   simplification 
1eef0 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
1ef00 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
1ef10 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
1ef20 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
1ef30 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
1ef40 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
1ef50 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
1ef60 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
1ef70 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
1ef80 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
1ef90 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
1efa0 6e 69 6e 67 20 69 73 20 73 75 62 6a 65 63 74 20  ning is subject 
1efb0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
1efc0 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 0a 2a 2a   constraints:.**
1efd0 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f  .**  (**)  We no
1efe0 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20   longer attempt 
1eff0 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65  to flatten aggre
1f000 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e  gate subqueries.
1f010 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20   Was:.**        
1f020 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1f030 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f040 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20   cannot both be 
1f050 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
1f060 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c  *  (**)  We no l
1f070 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f  onger attempt to
1f080 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61   flatten aggrega
1f090 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 57  te subqueries. W
1f0a0 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 28 32  as:.**        (2
1f0b0 29 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72  ) If the subquer
1f0c0 79 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  y is an aggregat
1f0d0 65 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  e then.**       
1f0e0 20 28 32 61 29 20 74 68 65 20 6f 75 74 65 72 20   (2a) the outer 
1f0f0 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74 20 62  query must not b
1f100 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20  e a join and.** 
1f110 20 20 20 20 20 20 20 28 32 62 29 20 74 68 65 20         (2b) the 
1f120 6f 75 74 65 72 20 71 75 65 72 79 20 6d 75 73 74  outer query must
1f130 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75 65 72   not use subquer
1f140 69 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ies.**          
1f150 20 20 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68     other than th
1f160 65 20 6f 6e 65 20 46 52 4f 4d 2d 63 6c 61 75 73  e one FROM-claus
1f170 65 20 73 75 62 71 75 65 72 79 20 74 68 61 74 20  e subquery that 
1f180 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 0a 2a  is a candidate.*
1f190 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  *             fo
1f1a0 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28  r flattening.  (
1f1b0 54 68 69 73 20 69 73 20 64 75 65 20 74 6f 20 74  This is due to t
1f1c0 69 63 6b 65 74 20 5b 32 66 37 31 37 30 64 37 33  icket [2f7170d73
1f1d0 62 66 39 61 62 66 38 30 5d 0a 2a 2a 20 20 20 20  bf9abf80].**    
1f1e0 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 32 30           from 20
1f1f0 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a  15-02-09.).**.**
1f200 20 20 20 28 33 29 20 20 49 66 20 74 68 65 20 73     (3)  If the s
1f210 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
1f220 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
1f230 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e  a LEFT JOIN then
1f240 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 61 29 20  .**        (3a) 
1f250 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  the subquery may
1f260 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 61   not be a join a
1f270 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 62  nd.**        (3b
1f280 29 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  ) the FROM claus
1f290 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
1f2a0 79 20 6d 61 79 20 6e 6f 74 20 63 6f 6e 74 61 69  y may not contai
1f2b0 6e 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 20  n a virtual.**  
1f2c0 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65             table
1f2d0 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28   and.**        (
1f2e0 33 63 29 20 74 68 65 20 6f 75 74 65 72 20 71 75  3c) the outer qu
1f2f0 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  ery may not be a
1f300 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a  n aggregate..**.
1f310 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75  **   (4)  The su
1f320 62 71 75 65 72 79 20 63 61 6e 20 6e 6f 74 20 62  bquery can not b
1f330 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a  e DISTINCT..**.*
1f340 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20  *  (**)  At one 
1f350 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f  point restrictio
1f360 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29 20 64  ns (4) and (5) d
1f370 65 66 69 6e 65 64 20 61 20 73 75 62 73 65 74 20  efined a subset 
1f380 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20  of DISTINCT.**  
1f390 20 20 20 20 20 20 73 75 62 2d 71 75 65 72 69 65        sub-querie
1f3a0 73 20 74 68 61 74 20 77 65 72 65 20 65 78 63 6c  s that were excl
1f3b0 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f  uded from this o
1f3c0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73  ptimization. Res
1f3d0 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  triction .**    
1f3e0 20 20 20 20 28 34 29 20 68 61 73 20 73 69 6e 63      (4) has sinc
1f3f0 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20  e been expanded 
1f400 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44  to exclude all D
1f410 49 53 54 49 4e 43 54 20 73 75 62 71 75 65 72 69  ISTINCT subqueri
1f420 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  es..**.**  (**) 
1f430 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74   We no longer at
1f440 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e  tempt to flatten
1f450 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75   aggregate subqu
1f460 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a 20  eries.  Was:.** 
1f470 20 20 20 20 20 20 20 49 66 20 74 68 65 20 73 75         If the su
1f480 62 71 75 65 72 79 20 69 73 20 61 67 67 72 65 67  bquery is aggreg
1f490 61 74 65 2c 20 74 68 65 20 6f 75 74 65 72 20 71  ate, the outer q
1f4a0 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
1f4b0 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
1f4c0 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
1f4d0 65 72 79 20 6d 75 73 74 20 68 61 76 65 20 61 20  ery must have a 
1f4e0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f  FROM clause.  TO
1f4f0 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72  DO:  For subquer
1f500 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20  ies without.**  
1f510 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61        A FROM cla
1f520 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64  use, consider ad
1f530 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c 61 75  ding a FROM clau
1f540 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65 63  se with the spec
1f550 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 61  ial.**        ta
1f560 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20  ble sqlite_once 
1f570 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
1f580 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f   a single row co
1f590 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20  ntaining a.**   
1f5a0 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c       single NULL
1f5b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 49  ..**.**   (8)  I
1f5c0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
1f5d0 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74  ses LIMIT then t
1f5e0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1f5f0 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e  ay not be a join
1f600 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 49  ..**.**   (9)  I
1f610 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
1f620 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74  ses LIMIT then t
1f630 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1f640 61 79 20 6e 6f 74 20 62 65 20 61 67 67 72 65 67  ay not be aggreg
1f650 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  ate..**.**  (**)
1f660 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31    Restriction (1
1f670 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66  0) was removed f
1f680 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20  rom the code on 
1f690 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77  2005-02-05 but w
1f6a0 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69  e.**        acci
1f6b0 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74  dently carried t
1f6c0 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61  he comment forwa
1f6d0 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39  rd until 2014-09
1f6e0 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a  -15.  Original.*
1f6f0 2a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61  *        constra
1f700 69 6e 74 3a 20 22 49 66 20 74 68 65 20 73 75 62  int: "If the sub
1f710 71 75 65 72 79 20 69 73 20 61 67 67 72 65 67 61  query is aggrega
1f720 74 65 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65  te then the oute
1f730 72 20 71 75 65 72 79 20 0a 2a 2a 20 20 20 20 20  r query .**     
1f740 20 20 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4c     may not use L
1f750 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31  IMIT.".**.**  (1
1f760 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
1f770 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
1f780 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f 74  uery may not bot
1f790 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20  h have ORDER BY 
1f7a0 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
1f7b0 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d  (**)  Not implem
1f7c0 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64  ented.  Subsumed
1f7d0 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f   into restrictio
1f7e0 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76  n (3).  Was prev
1f7f0 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20  iously.**       
1f800 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74   a separate rest
1f810 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67  riction deriving
1f820 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35   from ticket #35
1f830 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20  0..**.**  (13)  
1f840 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1f850 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1f860 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49   not both use LI
1f870 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29  MIT..**.**  (14)
1f880 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 6d    The subquery m
1f890 61 79 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45  ay not use OFFSE
1f8a0 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20  T..**.**  (15)  
1f8b0 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  If the outer que
1f8c0 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  ry is part of a 
1f8d0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1f8e0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20   then the.**    
1f8f0 20 20 20 20 73 75 62 71 75 65 72 79 20 6d 61 79      subquery may
1f900 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e 0a   not use LIMIT..
1f910 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74  **        (See t
1f920 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20  icket #2339 and 
1f930 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64  ticket [02a8e81d
1f940 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36  44])..**.**  (16
1f950 29 20 20 49 66 20 74 68 65 20 6f 75 74 65 72 20  )  If the outer 
1f960 71 75 65 72 79 20 69 73 20 61 67 67 72 65 67 61  query is aggrega
1f970 74 65 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62  te, then the sub
1f980 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a  query may not.**
1f990 20 20 20 20 20 20 20 20 75 73 65 20 4f 52 44 45          use ORDE
1f9a0 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23  R BY.  (Ticket #
1f9b0 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64  2942)  This used
1f9c0 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a   to not matter.*
1f9d0 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77  *        until w
1f9e0 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65  e introduced the
1f9f0 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20   group_concat() 
1fa00 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  function.  .**.*
1fa10 2a 20 20 28 31 37 29 20 20 49 66 20 74 68 65 20  *  (17)  If the 
1fa20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 63 6f  subquery is a co
1fa30 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
1fa40 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 31  hen.**        (1
1fa50 37 61 29 20 61 6c 6c 20 63 6f 6d 70 6f 75 6e 64  7a) all compound
1fa60 20 6f 70 65 72 61 74 6f 72 73 20 6d 75 73 74 20   operators must 
1fa70 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  be a UNION ALL, 
1fa80 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 31  and.**        (1
1fa90 37 62 29 20 6e 6f 20 74 65 72 6d 73 20 77 69 74  7b) no terms wit
1faa0 68 69 6e 20 74 68 65 20 73 75 62 71 75 65 72 79  hin the subquery
1fab0 20 63 6f 6d 70 6f 75 6e 64 20 6d 61 79 20 62 65   compound may be
1fac0 20 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20   aggregate.**   
1fad0 20 20 20 20 20 20 20 20 20 20 20 6f 72 20 44 49             or DI
1fae0 53 54 49 4e 43 54 2c 20 61 6e 64 0a 2a 2a 20 20  STINCT, and.**  
1faf0 20 20 20 20 20 20 28 31 37 63 29 20 65 76 65 72        (17c) ever
1fb00 79 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68  y term within th
1fb10 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d 70 6f  e subquery compo
1fb20 75 6e 64 20 6d 75 73 74 20 68 61 76 65 20 61 20  und must have a 
1fb30 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 20  FROM clause.**  
1fb40 20 20 20 20 20 20 28 31 37 64 29 20 74 68 65 20        (17d) the 
1fb50 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20  outer query may 
1fb60 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  not be.**       
1fb70 20 20 20 20 20 20 20 28 31 37 64 31 29 20 61 67         (17d1) ag
1fb80 67 72 65 67 61 74 65 2c 20 6f 72 0a 2a 2a 20 20  gregate, or.**  
1fb90 20 20 20 20 20 20 20 20 20 20 20 20 28 31 37 64              (17d
1fba0 32 29 20 44 49 53 54 49 4e 43 54 2c 20 6f 72 0a  2) DISTINCT, or.
1fbb0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1fbc0 28 31 37 64 33 29 20 61 20 6a 6f 69 6e 2e 0a 2a  (17d3) a join..*
1fbd0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20  *.**        The 
1fbe0 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71  parent and sub-q
1fbf0 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  uery may contain
1fc00 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20   WHERE clauses. 
1fc10 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20  Subject to.**   
1fc20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c       rules (11),
1fc30 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20   (13) and (14), 
1fc40 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f  they may also co
1fc50 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a  ntain ORDER BY,.
1fc60 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20  **        LIMIT 
1fc70 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73  and OFFSET claus
1fc80 65 73 2e 20 20 54 68 65 20 73 75 62 71 75 65 72  es.  The subquer
1fc90 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79  y cannot use any
1fca0 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
1fcb0 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68      operator oth
1fcc0 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c  er than UNION AL
1fcd0 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68  L because all th
1fce0 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64  e other compound
1fcf0 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61  .**        opera
1fd00 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70  tors have an imp
1fd10 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20 77 68  lied DISTINCT wh
1fd20 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65  ich is disallowe
1fd30 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72  d by.**        r
1fd40 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a  estriction (4)..
1fd50 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73  **.**        Als
1fd60 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e  o, each componen
1fd70 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65  t of the sub-que
1fd80 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74  ry must return t
1fd90 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a  he same number.*
1fda0 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65 73 75  *        of resu
1fdb0 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73  lt columns. This
1fdc0 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72   is actually a r
1fdd0 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61  equirement for a
1fde0 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
1fdf0 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 74 61        SELECT sta
1fe00 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20  tement, but all 
1fe10 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f  the code here do
1fe20 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20  es is make sure 
1fe30 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20  that no.**      
1fe40 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29    such (illegal)
1fe50 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c   sub-query is fl
1fe60 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c  attened. The cal
1fe70 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20  ler will detect 
1fe80 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79  the.**        sy
1fe90 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72  ntax error and r
1fea0 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64  eturn a detailed
1feb0 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   message..**.** 
1fec0 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75   (18)  If the su
1fed0 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
1fee0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
1fef0 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  en all terms of 
1ff00 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52  the.**        OR
1ff10 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66  DER BY clause of
1ff20 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74   the parent must
1ff30 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72   be simple refer
1ff40 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20  ences to .**    
1ff50 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74      columns of t
1ff60 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a  he sub-query..**
1ff70 0a 2a 2a 20 20 28 31 39 29 20 20 49 66 20 74 68  .**  (19)  If th
1ff80 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1ff90 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f  LIMIT then the o
1ffa0 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1ffb0 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76  ot.**        hav
1ffc0 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
1ffd0 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49  ..**.**  (20)  I
1ffe0 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1fff0 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
20000 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75  lect, then it mu
20010 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  st not use.**   
20020 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59       an ORDER BY
20030 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74   clause.  Ticket
20040 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c   #3773.  We coul
20050 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e  d relax this con
20060 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20  straint.**      
20070 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61    somewhat by sa
20080 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65  ying that the te
20090 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
200a0 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a   BY clause must.
200b0 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72  **        appear
200c0 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72   as unmodified r
200d0 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e  esult columns in
200e0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
200f0 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20  .  But we.**    
20100 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f      have other o
20110 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20  ptimizations in 
20120 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74  mind to deal wit
20130 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a  h that case..**.
20140 2a 2a 20 20 28 32 31 29 20 20 49 66 20 74 68 65  **  (21)  If the
20150 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c   subquery uses L
20160 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75  IMIT then the ou
20170 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
20180 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 44  t be.**        D
20190 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74  ISTINCT.  (See t
201a0 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66  icket [752e1646f
201b0 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29  c])..**.**  (22)
201c0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 6d    The subquery m
201d0 61 79 20 6e 6f 74 20 62 65 20 61 20 72 65 63 75  ay not be a recu
201e0 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a  rsive CTE..**.**
201f0 20 20 28 2a 2a 29 20 20 53 75 62 73 75 6d 65 64    (**)  Subsumed
20200 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f   into restrictio
20210 6e 20 28 31 37 64 33 29 2e 20 20 57 61 73 3a 20  n (17d3).  Was: 
20220 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  If the outer que
20230 72 79 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20  ry is.**        
20240 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2c  a recursive CTE,
20250 20 74 68 65 6e 20 74 68 65 20 73 75 62 2d 71 75   then the sub-qu
20260 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  ery may not be a
20270 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
20280 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 69 73 20  .**        This 
20290 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62  restriction is b
202a0 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d  ecause transform
202b0 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ing the.**      
202c0 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f    parent to a co
202d0 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e  mpound query con
202e0 66 75 73 65 73 20 74 68 65 20 63 6f 64 65 20 74  fuses the code t
202f0 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20  hat handles.**  
20300 20 20 20 20 20 20 72 65 63 75 72 73 69 76 65 20        recursive 
20310 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69  queries in multi
20320 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20  Select()..**.** 
20330 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e   (**)  We no lon
20340 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66  ger attempt to f
20350 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65  latten aggregate
20360 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 57 61   subqueries.  Wa
20370 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65  s:.**        The
20380 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
20390 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61 74  t be an aggregat
203a0 65 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20  e that uses the 
203b0 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f  built-in min() o
203c0 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20  r .**        or 
203d0 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  max() functions.
203e0 20 20 28 57 69 74 68 6f 75 74 20 74 68 69 73 20    (Without this 
203f0 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 61 20 71  restriction, a q
20400 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20  uery like:.**   
20410 20 20 20 20 20 22 53 45 4c 45 43 54 20 78 20 46       "SELECT x F
20420 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28  ROM (SELECT max(
20430 79 29 2c 20 78 20 46 52 4f 4d 20 74 31 29 22 20  y), x FROM t1)" 
20440 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73  would not necess
20450 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  arily.**        
20460 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  return the value
20470 20 58 20 66 6f 72 20 77 68 69 63 68 20 59 20 77   X for which Y w
20480 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a  as maximal.).**.
20490 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f  **.** In this ro
204a0 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70  utine, the "p" p
204b0 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
204c0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74  inter to the out
204d0 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65  er query..** The
204e0 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e   subquery is p->
204f0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20  pSrc->a[iFrom]. 
20500 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69   isAgg is true i
20510 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
20520 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67  y.** uses aggreg
20530 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66  ates..**.** If f
20540 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74  lattening is not
20550 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
20560 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
20570 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20  -op and returns 
20580 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  0..** If flatten
20590 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64  ing is attempted
205a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
205b0 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41  turns 1..**.** A
205c0 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ll of the expres
205d0 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75  sion analysis mu
205e0 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68  st occur on both
205f0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20600 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71   and.** the subq
20610 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73  uery before this
20620 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a   routine runs..*
20630 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61  /.static int fla
20640 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20  ttenSubquery(.  
20650 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
20660 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
20670 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
20680 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
20690 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
206a0 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  or outer SELECT 
206b0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
206c0 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
206d0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
206e0 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  p->pSrc->a[] of 
206f0 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65  the inner subque
20700 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  ry */.  int isAg
20710 67 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g            /* 
20720 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45  True if outer SE
20730 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67  LECT uses aggreg
20740 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
20750 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
20760 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
20770 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
20780 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65  uthContext;.  Se
20790 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20  lect *pParent;  
207a0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49    /* Current UNI
207b0 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74  ON ALL term of t
207c0 68 65 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a  he other query *
207d0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
207e0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
207f0 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73  nner query or "s
20800 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65  ubquery" */.  Se
20810 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20  lect *pSub1;    
20820 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
20830 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65  the rightmost se
20840 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72  lect in sub-quer
20850 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
20860 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
20870 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
20880 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20890 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
208a0 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
208b0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
208c0 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
208d0 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20    int iParent;  
208e0 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75        /* VDBE cu
208f0 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
20900 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73  he pSub result s
20910 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  et temp table */
20920 0a 20 20 69 6e 74 20 69 4e 65 77 50 61 72 65 6e  .  int iNewParen
20930 74 20 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c 61 63  t = -1;/* Replac
20940 65 6d 65 6e 74 20 74 61 62 6c 65 20 66 6f 72 20  ement table for 
20950 69 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  iParent */.  int
20960 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b   isLeftJoin = 0;
20970 20 2f 2a 20 54 72 75 65 20 69 66 20 70 53 75 62   /* True if pSub
20980 20 69 73 20 74 68 65 20 72 69 67 68 74 20 73 69   is the right si
20990 64 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  de of a LEFT JOI
209a0 4e 20 2a 2f 20 20 20 20 0a 20 20 69 6e 74 20 69  N */    .  int i
209b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
209c0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
209d0 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
209e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
209f0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
20a00 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
20a10 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
20a20 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f  m *pSubitem;   /
20a30 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a  * The subquery *
20a40 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
20a50 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
20a60 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
20a70 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   if flattening i
20a80 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65  s permitted.  Re
20a90 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20  turn 0 if not.. 
20aa0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21   */.  assert( p!
20ab0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
20ac0 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a  p->pPrior==0 );.
20ad0 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
20ae0 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
20af0 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74  QLITE_QueryFlatt
20b00 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20 30  ener) ) return 0
20b10 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
20b20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
20b30 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26  rc && iFrom>=0 &
20b40 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53  & iFrom<pSrc->nS
20b50 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d  rc );.  pSubitem
20b60 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f   = &pSrc->a[iFro
20b70 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20  m];.  iParent = 
20b80 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f  pSubitem->iCurso
20b90 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62  r;.  pSub = pSub
20ba0 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  item->pSelect;. 
20bb0 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30   assert( pSub!=0
20bc0 20 29 3b 0a 0a 20 20 70 53 75 62 53 72 63 20 3d   );..  pSubSrc =
20bd0 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61   pSub->pSrc;.  a
20be0 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29  ssert( pSubSrc )
20bf0 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20  ;.  /* Prior to 
20c00 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77  version 3.1.2, w
20c10 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  hen LIMIT and OF
20c20 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20 73  FSET had to be s
20c30 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c  imple constants,
20c40 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72  .  ** not arbitr
20c50 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ary expressions,
20c60 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65   we allowed some
20c70 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49   combining of LI
20c80 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
20c90 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79   ** because they
20ca0 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74   could be comput
20cb0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
20cc0 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49  me.  But when LI
20cd0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
20ce0 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74   ** became arbit
20cf0 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73  rary expressions
20d00 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64  , we were forced
20d10 20 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74   to add restrict
20d20 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61  ions (13).  ** a
20d30 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66  nd (14). */.  if
20d40 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
20d50 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65  & p->pLimit ) re
20d60 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
20d70 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
20d80 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66  ion (13) */.  if
20d90 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
20da0 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 2d 3e  & pSub->pLimit->
20db0 70 52 69 67 68 74 20 29 20 72 65 74 75 72 6e 20  pRight ) return 
20dc0 30 3b 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74  0;   /* Restrict
20dd0 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66  ion (14) */.  if
20de0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
20df0 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30   SF_Compound)!=0
20e00 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   && pSub->pLimit
20e10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
20e20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20e50 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29  Restriction (15)
20e60 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
20e70 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29  ubSrc->nSrc==0 )
20e80 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
20e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ea0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
20eb0 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  (7)  */.  if( pS
20ec0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
20ed0 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74  F_Distinct ) ret
20ee0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
20ef0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
20f00 28 34 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  (4)  */.  if( pS
20f10 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70  ub->pLimit && (p
20f20 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69  Src->nSrc>1 || i
20f30 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65  sAgg) ){.     re
20f40 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
20f50 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20  /* Restrictions 
20f60 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20  (8)(9) */.  }.  
20f70 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
20f80 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
20f90 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  y ){.     return
20fa0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
20fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20fd0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31   Restriction (11
20fe0 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69  ) */.  }.  if( i
20ff0 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f  sAgg && pSub->pO
21000 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
21010 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
21020 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
21030 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70   (16) */.  if( p
21040 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
21050 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
21060 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
21070 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
21080 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70   (19) */.  if( p
21090 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28  Sub->pLimit && (
210a0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
210b0 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b  _Distinct)!=0 ){
210c0 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
210d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
210e0 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20  iction (21) */. 
210f0 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73   }.  if( pSub->s
21100 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65  elFlags & (SF_Re
21110 63 75 72 73 69 76 65 29 20 29 7b 0a 20 20 20 20  cursive) ){.    
21120 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73  return 0; /* Res
21130 74 72 69 63 74 69 6f 6e 73 20 28 32 32 29 20 2a  trictions (22) *
21140 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  /.  }..  /*.  **
21150 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
21160 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
21170 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20  erand of a LEFT 
21180 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68 65 0a 20  JOIN, then the. 
21190 20 2a 2a 20 73 75 62 71 75 65 72 79 20 6d 61 79   ** subquery may
211a0 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 69   not be a join i
211b0 74 73 65 6c 66 20 28 33 61 29 2e 20 45 78 61 6d  tself (3a). Exam
211c0 70 6c 65 20 6f 66 20 77 68 79 20 74 68 69 73 20  ple of why this 
211d0 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f  is not.  ** allo
211e0 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
211f0 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
21200 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f  UTER JOIN (t2 JO
21210 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a  IN t3).  **.  **
21220 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
21230 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
21240 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
21250 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
21260 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
21270 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20   JOIN t3.  **.  
21280 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20  ** which is not 
21290 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20  at all the same 
212a0 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  thing..  **.  **
212b0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
212c0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
212d0 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20  erand of a LEFT 
212e0 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68 65 20 6f  JOIN, then the o
212f0 75 74 65 72 0a 20 20 2a 2a 20 71 75 65 72 79 20  uter.  ** query 
21300 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 61 67 67  cannot be an agg
21310 72 65 67 61 74 65 2e 20 28 33 63 29 20 20 54 68  regate. (3c)  Th
21320 69 73 20 69 73 20 61 6e 20 61 72 74 69 66 61 63  is is an artifac
21330 74 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a  t of the way.  *
21340 2a 20 61 67 67 72 65 67 61 74 65 73 20 61 72 65  * aggregates are
21350 20 70 72 6f 63 65 73 73 65 64 20 2d 20 74 68 65   processed - the
21360 72 65 20 69 73 20 6e 6f 20 6d 65 63 68 61 6e 69  re is no mechani
21370 73 6d 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  sm to determine 
21380 69 66 0a 20 20 2a 2a 20 74 68 65 20 4c 45 46 54  if.  ** the LEFT
21390 20 4a 4f 49 4e 20 74 61 62 6c 65 20 73 68 6f 75   JOIN table shou
213a0 6c 64 20 62 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a  ld be all-NULL..
213b0 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c    **.  ** See al
213c0 73 6f 20 74 69 63 6b 65 74 73 20 23 33 30 36 2c  so tickets #306,
213d0 20 23 33 35 30 2c 20 61 6e 64 20 23 33 33 30 30   #350, and #3300
213e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  ..  */.  if( (pS
213f0 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  ubitem->fg.joint
21400 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
21410 3d 30 20 29 7b 0a 20 20 20 20 69 73 4c 65 66 74  =0 ){.    isLeft
21420 4a 6f 69 6e 20 3d 20 31 3b 0a 20 20 20 20 69 66  Join = 1;.    if
21430 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e  ( pSubSrc->nSrc>
21440 31 20 7c 7c 20 69 73 41 67 67 20 7c 7c 20 49 73  1 || isAgg || Is
21450 56 69 72 74 75 61 6c 28 70 53 75 62 53 72 63 2d  Virtual(pSubSrc-
21460 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20  >a[0].pTab) ){. 
21470 20 20 20 20 20 2f 2a 20 20 28 33 61 29 20 20 20       /*  (3a)   
21480 20 20 20 20 20 20 20 20 20 20 28 33 63 29 20 20            (3c)  
21490 20 20 20 28 33 62 29 20 2a 2f 0a 20 20 20 20 20     (3b) */.     
214a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
214b0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
214c0 54 45 5f 45 58 54 52 41 5f 49 46 4e 55 4c 4c 52  TE_EXTRA_IFNULLR
214d0 4f 57 0a 20 20 65 6c 73 65 20 69 66 28 20 69 46  OW.  else if( iF
214e0 72 6f 6d 3e 30 20 26 26 20 21 69 73 41 67 67 20  rom>0 && !isAgg 
214f0 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74 74 69 6e  ){.    /* Settin
21500 67 20 69 73 4c 65 66 74 4a 6f 69 6e 20 74 6f 20  g isLeftJoin to 
21510 2d 31 20 63 61 75 73 65 73 20 4f 50 5f 49 66 4e  -1 causes OP_IfN
21520 75 6c 6c 52 6f 77 20 6f 70 63 6f 64 65 73 20 74  ullRow opcodes t
21530 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66  o be generated f
21540 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20  or.    ** every 
21550 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79  reference to any
21560 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 66   result column f
21570 72 6f 6d 20 73 75 62 71 75 65 72 79 20 69 6e 20  rom subquery in 
21580 61 20 6a 6f 69 6e 2c 20 65 76 65 6e 0a 20 20 20  a join, even.   
21590 20 2a 2a 20 74 68 6f 75 67 68 20 74 68 65 79 20   ** though they 
215a0 61 72 65 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  are not necessar
215b0 79 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 73 74  y.  This will st
215c0 72 65 73 73 2d 74 65 73 74 20 74 68 65 20 4f 50  ress-test the OP
215d0 5f 49 66 4e 75 6c 6c 52 6f 77 20 0a 20 20 20 20  _IfNullRow .    
215e0 2a 2a 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20  ** opcode. */.  
215f0 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d    isLeftJoin = -
21600 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  1;.  }.#endif.. 
21610 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
21620 28 31 37 29 3a 20 49 66 20 74 68 65 20 73 75 62  (17): If the sub
21630 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
21640 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65  ound SELECT, the
21650 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75  n it must.  ** u
21660 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f  se only the UNIO
21670 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20  N ALL operator. 
21680 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  And none of the 
21690 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75  simple select qu
216a0 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  eries.  ** that 
216b0 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70  make up the comp
216c0 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20  ound SELECT are 
216d0 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67  allowed to be ag
216e0 67 72 65 67 61 74 65 20 6f 72 20 64 69 73 74 69  gregate or disti
216f0 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73  nct.  ** queries
21700 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ..  */.  if( pSu
21710 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  b->pPrior ){.   
21720 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
21730 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rBy ){.      ret
21740 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72  urn 0;  /* Restr
21750 69 63 74 69 6f 6e 20 28 32 30 29 20 2a 2f 0a 20  iction (20) */. 
21760 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41     }.    if( isA
21770 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61  gg || (p->selFla
21780 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
21790 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53  )!=0 || pSrc->nS
217a0 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  rc!=1 ){.      r
217b0 65 74 75 72 6e 20 30 3b 20 2f 2a 20 28 31 37 64  eturn 0; /* (17d
217c0 31 29 2c 20 28 31 37 64 32 29 2c 20 6f 72 20 28  1), (17d2), or (
217d0 31 37 64 33 29 20 2a 2f 0a 20 20 20 20 7d 0a 20  17d3) */.    }. 
217e0 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75     for(pSub1=pSu
217f0 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d  b; pSub1; pSub1=
21800 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a  pSub1->pPrior){.
21810 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21820 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
21830 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
21840 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
21850 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
21860 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
21870 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
21880 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
21890 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
218a0 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20  F_Aggregate );. 
218b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
218c0 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  b->pSrc!=0 );.  
218d0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
218e0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  ->pEList->nExpr=
218f0 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e  =pSub1->pEList->
21900 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 69  nExpr );.      i
21910 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  f( (pSub1->selFl
21920 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
21930 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
21940 29 21 3d 30 20 20 20 20 2f 2a 20 28 31 37 62 29  )!=0    /* (17b)
21950 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20 28 70   */.       || (p
21960 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20  Sub1->pPrior && 
21970 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  pSub1->op!=TK_AL
21980 4c 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L)              
21990 20 20 20 2f 2a 20 28 31 37 61 29 20 2a 2f 0a 20     /* (17a) */. 
219a0 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e        || pSub1->
219b0 70 53 72 63 2d 3e 6e 53 72 63 3c 31 20 20 20 20  pSrc->nSrc<1    
219c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
219e0 20 28 31 37 63 29 20 2a 2f 0a 20 20 20 20 20 20   (17c) */.      
219f0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
21a00 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
21a10 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75     testcase( pSu
21a20 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31  b1->pSrc->nSrc>1
21a30 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   );.    }..    /
21a40 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
21a50 38 29 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  8). */.    if( p
21a60 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
21a70 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
21a80 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
21a90 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
21aa0 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
21ab0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
21ac0 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72  y->a[ii].u.x.iOr
21ad0 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65  derByCol==0 ) re
21ae0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
21af0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
21b00 45 78 2d 72 65 73 74 72 69 63 74 69 6f 6e 20 28  Ex-restriction (
21b10 32 33 29 3a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e  23):.  ** The on
21b20 6c 79 20 77 61 79 20 74 68 61 74 20 74 68 65 20  ly way that the 
21b30 72 65 63 75 72 73 69 76 65 20 70 61 72 74 20 6f  recursive part o
21b40 66 20 61 20 43 54 45 20 63 61 6e 20 63 6f 6e 74  f a CTE can cont
21b50 61 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 0a 20  ain a compound. 
21b60 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73 20   ** subquery is 
21b70 66 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79  for the subquery
21b80 20 74 6f 20 62 65 20 6f 6e 65 20 74 65 72 6d 20   to be one term 
21b90 6f 66 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20  of a join.  But 
21ba0 69 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  if the.  ** subq
21bb0 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20  uery is a join, 
21bc0 74 68 65 6e 20 74 68 65 20 66 6c 61 74 74 65 6e  then the flatten
21bd0 69 6e 67 20 68 61 73 20 61 6c 72 65 61 64 79 20  ing has already 
21be0 62 65 65 6e 20 73 74 6f 70 70 65 64 20 62 79 0a  been stopped by.
21bf0 20 20 2a 2a 20 72 65 73 74 72 69 63 74 69 6f 6e    ** restriction
21c00 20 28 31 37 64 33 29 0a 20 20 2a 2f 0a 20 20 61   (17d3).  */.  a
21c10 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
21c20 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
21c30 76 65 29 3d 3d 30 20 7c 7c 20 70 53 75 62 2d 3e  ve)==0 || pSub->
21c40 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 0a 20 20  pPrior==0 );..  
21c50 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61  /***** If we rea
21c60 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66  ch this point, f
21c70 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
21c80 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20  mitted. *****/. 
21c90 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
21ca0 50 61 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65  Parse,p,("flatte
21cb0 6e 20 25 73 2e 25 70 20 66 72 6f 6d 20 74 65 72  n %s.%p from ter
21cc0 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  m %d\n",.       
21cd0 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
21ce0 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62  ->zSelName, pSub
21cf0 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a  , iFrom));..  /*
21d00 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73   Authorize the s
21d10 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61  ubquery */.  pPa
21d20 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
21d30 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  t = pSubitem->zN
21d40 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  ame;.  TESTONLY(
21d50 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68  i =) sqlite3Auth
21d60 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
21d70 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
21d80 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73  0, 0);.  testcas
21d90 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e  e( i==SQLITE_DEN
21da0 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a  Y );.  pParse->z
21db0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
21dc0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
21dd0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75  ..  /* If the su
21de0 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
21df0 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
21e00 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79  tement, then (by
21e10 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20   restrictions.  
21e20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f  ** 17 and 18 abo
21e30 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  ve) it must be a
21e40 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74   UNION ALL and t
21e50 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
21e60 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66  must .  ** be of
21e70 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a   the form:.  **.
21e80 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
21e90 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d  <expr-list> FROM
21ea0 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c   (<sub-query>) <
21eb0 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20  where-clause> . 
21ec0 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65   **.  ** followe
21ed0 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42  d by any ORDER B
21ee0 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20  Y, LIMIT and/or 
21ef0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
21f00 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20  This block.  ** 
21f10 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69  creates N-1 copi
21f20 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  es of the parent
21f30 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61   query without a
21f40 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
21f50 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53  IT or .  ** OFFS
21f60 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a  ET clauses and j
21f70 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65  oins them to the
21f80 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20   left-hand-side 
21f90 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  of the original.
21fa0 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e    ** using UNION
21fb0 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20   ALL operators. 
21fc0 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69  In this case N i
21fd0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
21fe0 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65  simple.  ** sele
21ff0 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ct statements in
22000 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
22010 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20  b-query..  **.  
22020 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  ** Example:.  **
22030 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
22040 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a   a+1 FROM (.  **
22050 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78          SELECT x
22060 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
22070 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
22080 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
22090 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT y FROM tab.  
220a0 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
220b0 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
220c0 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20  SELECT abs(z*2) 
220d0 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20  FROM tab2.  **  
220e0 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20     ) WHERE a!=5 
220f0 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
22100 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64    ** Transformed
22110 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
22120 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20       SELECT x+1 
22130 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78  FROM tab WHERE x
22140 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
22150 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
22160 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f    SELECT y+1 FRO
22170 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21  M tab WHERE y+1!
22180 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
22190 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
221a0 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31  ELECT abs(z*2)+1
221b0 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45   FROM tab2 WHERE
221c0 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20   abs(z*2)+1!=5. 
221d0 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59   **     ORDER BY
221e0 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20   1.  **.  ** We 
221f0 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63  call this the "c
22200 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
22210 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20   flattening"..  
22220 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53  */.  for(pSub=pS
22230 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62  ub->pPrior; pSub
22240 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  ; pSub=pSub->pPr
22250 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ior){.    Select
22260 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72   *pNew;.    Expr
22270 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
22280 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
22290 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d    Expr *pLimit =
222a0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
222b0 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d  Select *pPrior =
222c0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
222d0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
222e0 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30  .    p->pSrc = 0
222f0 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
22300 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  = 0;.    p->pLim
22310 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  it = 0;.    pNew
22320 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
22330 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20  Dup(db, p, 0);. 
22340 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
22350 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 53  SetName(pNew, pS
22360 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20  ub->zSelName);. 
22370 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
22380 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f  Limit;.    p->pO
22390 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
223a0 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  y;.    p->pSrc =
223b0 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70   pSrc;.    p->op
223c0 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69   = TK_ALL;.    i
223d0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
223e0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
223f0 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73  pPrior;.    }els
22400 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  e{.      pNew->p
22410 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
22420 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72        if( pPrior
22430 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74   ) pPrior->pNext
22440 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70   = pNew;.      p
22450 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  New->pNext = p;.
22460 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
22470 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 53 45  = pNew;.      SE
22480 4c 45 43 54 54 52 41 43 45 28 32 2c 70 50 61 72  LECTTRACE(2,pPar
22490 73 65 2c 70 2c 28 22 63 6f 6d 70 6f 75 6e 64 2d  se,p,("compound-
224a0 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e  subquery flatten
224b0 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
224c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224d0 20 20 22 20 63 72 65 61 74 65 73 20 25 73 2e 25    " creates %s.%
224e0 70 20 61 73 20 70 65 65 72 5c 6e 22 2c 70 4e 65  p as peer\n",pNe
224f0 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e 65  w->zSelName, pNe
22500 77 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  w));.    }.    i
22510 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
22520 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  led ) return 1;.
22530 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
22540 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69  flattening the i
22550 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66  From-th entry of
22560 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
22570 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75   .  ** in the ou
22580 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  ter query..  */.
22590 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d    pSub = pSub1 =
225a0 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
225b0 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  ct;..  /* Delete
225c0 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74   the transient t
225d0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61  able structure a
225e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
225f0 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
22600 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
22610 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
22620 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
22630 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
22640 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  db, pSubitem->zN
22650 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
22660 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
22670 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70  em->zAlias);.  p
22680 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
22690 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  se = 0;.  pSubit
226a0 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  em->zName = 0;. 
226b0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
226c0 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  s = 0;.  pSubite
226d0 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a  m->pSelect = 0;.
226e0 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65  .  /* Defer dele
226f0 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f  ting the Table o
22700 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64  bject associated
22710 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
22720 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f  ubquery until co
22730 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73  de generation is
22740 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20  .  ** complete, 
22750 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20  since there may 
22760 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72  still exist Expr
22770 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20 74 68  .pTab entries th
22780 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f  at.  ** refer to
22790 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65 76   the subquery ev
227a0 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e  en after flatten
227b0 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33  ing.  Ticket #33
227c0 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53  46..  **.  ** pS
227d0 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20  ubitem->pTab is 
227e0 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20  always non-NULL 
227f0 62 79 20 74 65 73 74 20 72 65 73 74 72 69 63 74  by test restrict
22800 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61  ions and tests a
22810 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  bove..  */.  if(
22820 20 41 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d   ALWAYS(pSubitem
22830 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20  ->pTab!=0) ){.  
22840 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44    Table *pTabToD
22850 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  el = pSubitem->p
22860 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Tab;.    if( pTa
22870 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d  bToDel->nTabRef=
22880 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73  =1 ){.      Pars
22890 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
228a0 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
228b0 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  vel(pParse);.   
228c0 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e     pTabToDel->pN
228d0 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70  extZombie = pTop
228e0 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61  level->pZombieTa
228f0 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76  b;.      pToplev
22900 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d  el->pZombieTab =
22910 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20   pTabToDel;.    
22920 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
22930 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d  bToDel->nTabRef-
22940 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75  -;.    }.    pSu
22950 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  bitem->pTab = 0;
22960 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
22970 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75  ollowing loop ru
22980 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
22990 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f   term in a compo
229a0 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a  und-subquery.  *
229b0 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73  * flattening (as
229c0 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
229d0 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f  ).  If we are do
229e0 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20  ing a different 
229f0 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61  kind.  ** of fla
22a00 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74  ttening - a flat
22a10 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61  tening other tha
22a20 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
22a30 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  query flattening
22a40 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69   -.  ** then thi
22a50 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73  s loop only runs
22a60 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   once..  **.  **
22a70 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73   This loop moves
22a80 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d   all of the FROM
22a90 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
22aa0 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
22ab0 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  he.  ** the FROM
22ac0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
22ad0 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66  uter query.  Bef
22ae0 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20  ore doing this, 
22af0 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68  remember.  ** th
22b00 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
22b10 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  for the original
22b20 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f   outer query FRO
22b30 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a  M element in.  *
22b40 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20  * iParent.  The 
22b50 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77  iParent cursor w
22b60 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
22b70 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63  d.  Subsequent c
22b80 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63  ode.  ** will sc
22b90 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c  an expressions l
22ba0 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65  ooking for iPare
22bb0 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  nt references an
22bc0 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74  d replace.  ** t
22bd0 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20  hose references 
22be0 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73  with expressions
22bf0 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f   that resolve to
22c00 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52   the subquery FR
22c10 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73  OM.  ** elements
22c20 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79   we are now copy
22c30 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66  ing in..  */.  f
22c40 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50  or(pParent=p; pP
22c50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70  arent; pParent=p
22c60 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20  Parent->pPrior, 
22c70 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
22c80 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62  r){.    int nSub
22c90 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e  Src;.    u8 join
22ca0 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53  type = 0;.    pS
22cb0 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
22cc0 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  rc;     /* FROM 
22cd0 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65  clause of subque
22ce0 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72  ry */.    nSubSr
22cf0 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  c = pSubSrc->nSr
22d00 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  c;  /* Number of
22d10 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65   terms in subque
22d20 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  ry FROM clause *
22d30 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61  /.    pSrc = pPa
22d40 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20  rent->pSrc;     
22d50 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  /* FROM clause o
22d60 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
22d70 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53  y */..    if( pS
22d80 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  rc ){.      asse
22d90 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29  rt( pParent==p )
22da0 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65  ;  /* First time
22db0 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f   through the loo
22dc0 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74  p */.      joint
22dd0 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ype = pSubitem->
22de0 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  fg.jointype;.   
22df0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
22e00 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70  sert( pParent!=p
22e10 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20   );  /* 2nd and 
22e20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73  subsequent times
22e30 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f   through the loo
22e40 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20  p */.      pSrc 
22e50 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20  = pParent->pSrc 
22e60 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
22e70 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c  Append(db, 0, 0,
22e80 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
22e90 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Src==0 ){.      
22ea0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
22eb0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
22ec0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22ed0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
22ee0 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
22ef0 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c  uses a single sl
22f00 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ot of the FROM c
22f10 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
22f20 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e  er.    ** query.
22f30 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
22f40 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  y has more than 
22f50 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69  one element in i
22f60 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a  ts FROM clause,.
22f70 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61      ** then expa
22f80 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
22f90 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65  ry to make space
22fa0 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20   for it to hold 
22fb0 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20  all elements.   
22fc0 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75   ** of the subqu
22fd0 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ery..    **.    
22fe0 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20  ** Example:.    
22ff0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c  **.    **    SEL
23000 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c  ECT * FROM tabA,
23010 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
23020 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62  sub1, sub2), tab
23030 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  B;.    **.    **
23040 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
23050 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20   has 3 slots in 
23060 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  its FROM clause.
23070 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68    One slot of th
23080 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
23090 75 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65  uery (the middle
230a0 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62   slot) is used b
230b0 79 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20  y the subquery. 
230c0 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   The next.    **
230d0 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77   block of code w
230e0 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f  ill expand the o
230f0 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
23100 63 6c 61 75 73 65 20 74 6f 20 34 20 73 6c 6f 74  clause to 4 slot
23110 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d 69  s..    ** The mi
23120 64 64 6c 65 20 73 6c 6f 74 20 69 73 20 65 78 70  ddle slot is exp
23130 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f  anded to two slo
23140 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d  ts in order to m
23150 61 6b 65 20 73 70 61 63 65 0a 20 20 20 20 2a 2a  ake space.    **
23160 20 66 6f 72 20 74 68 65 20 74 77 6f 20 65 6c 65   for the two ele
23170 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f  ments in the FRO
23180 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
23190 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f  subquery..    */
231a0 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63  .    if( nSubSrc
231b0 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  >1 ){.      pPar
231c0 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  ent->pSrc = pSrc
231d0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
231e0 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72  tEnlarge(db, pSr
231f0 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72  c, nSubSrc-1,iFr
23200 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28  om+1);.      if(
23210 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
23220 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  d ){.        bre
23230 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
23240 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66  }..    /* Transf
23250 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  er the FROM clau
23260 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68  se terms from th
23270 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
23280 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
23290 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20   query..    */. 
232a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
232b0 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubSrc; i++){.   
232c0 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
232d0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d  Delete(db, pSrc-
232e0 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69  >a[i+iFrom].pUsi
232f0 6e 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ng);.      asser
23300 74 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72  t( pSrc->a[i+iFr
23310 6f 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e 63  om].fg.isTabFunc
23320 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53 72  ==0 );.      pSr
23330 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20  c->a[i+iFrom] = 
23340 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  pSubSrc->a[i];. 
23350 20 20 20 20 20 69 4e 65 77 50 61 72 65 6e 74 20       iNewParent 
23360 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e  = pSubSrc->a[i].
23370 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 6d  iCursor;.      m
23380 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e  emset(&pSubSrc->
23390 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  a[i], 0, sizeof(
233a0 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b  pSubSrc->a[i]));
233b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d  .    }.    pSrc-
233c0 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69  >a[iFrom].fg.joi
233d0 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65  ntype = jointype
233e0 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  ;.  .    /* Now 
233f0 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69  begin substituti
23400 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75  ng subquery resu
23410 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt set expressio
23420 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72  ns for .    ** r
23430 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
23440 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
23450 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
23460 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d   ** .    ** Exam
23470 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
23480 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c  **   SELECT a+5,
23490 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45   b*10 FROM (SELE
234a0 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31  CT x*3 AS a, y+1
234b0 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20  0 AS b FROM t1) 
234c0 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a  WHERE a>b;.    *
234d0 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20  *   \           
234e0 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
234f0 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  ________ subquer
23500 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  y __________/   
23510 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20         /.    ** 
23520 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
23530 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
23540 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
23550 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23560 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20  ____/.    **.   
23570 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
23580 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
23590 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
235a0 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
235b0 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a  ce we see.    **
235c0 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75   "a" we substitu
235d0 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65  te "x*3" and eve
235e0 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20  ry place we see 
235f0 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "b" we substitut
23600 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f  e "y+10"..    */
23610 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
23620 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
23630 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
23640 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20  t, any non-zero 
23650 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75  iOrderByCol valu
23660 65 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  es indicate that
23670 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52   the.      ** OR
23680 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78  DER BY column ex
23690 70 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e  pression is iden
236a0 74 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72  tical to the iOr
236b0 64 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20  derByCol'th.    
236c0 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
236d0 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45  returned by SELE
236e0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75  CT statement pSu
236f0 62 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20 76  b. Since these v
23700 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64  alues.      ** d
23710 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  o not necessaril
23720 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  y correspond to 
23730 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43  columns in SELEC
23740 54 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72  T statement pPar
23750 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65  ent,.      ** ze
23760 72 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74  ro them before t
23770 72 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f  ransfering the O
23780 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
23790 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
237a0 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73  * Not doing this
237b0 20 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65 72   may cause an er
237c0 72 6f 72 20 69 66 20 61 20 73 75 62 73 65 71 75  ror if a subsequ
237d0 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ent call to this
237e0 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
237f0 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  on attempts to f
23800 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e  latten a compoun
23810 64 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f  d sub-query into
23820 20 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a   pParent.      *
23830 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  * (the only way 
23840 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
23850 69 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75  is if the compou
23860 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a  nd sub-query is.
23870 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
23880 6c 79 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d  ly part of pSub-
23890 3e 70 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b  >pSrc). See tick
238a0 65 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e  et [d11a6e908f].
238b0 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c    */.      ExprL
238c0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
238d0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  pSub->pOrderBy;.
238e0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
238f0 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
23900 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
23910 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75  pOrderBy->a[i].u
23920 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  .x.iOrderByCol =
23930 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
23940 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
23950 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t->pOrderBy==0 )
23960 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
23970 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
23980 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62  erBy;.      pSub
23990 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
239a0 20 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65      }.    pWhere
239b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
239c0 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65  p(db, pSub->pWhe
239d0 72 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  re, 0);.    if( 
239e0 69 73 4c 65 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a  isLeftJoin>0 ){.
239f0 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70        setJoinExp
23a00 72 28 70 57 68 65 72 65 2c 20 69 4e 65 77 50 61  r(pWhere, iNewPa
23a10 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rent);.    }.   
23a20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
23a30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
23a40 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70 50  d(db, pWhere, pP
23a50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 29 3b 0a  arent->pWhere);.
23a60 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
23a70 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20  ocFailed==0 ){. 
23a80 20 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78       SubstContex
23a90 74 20 78 3b 0a 20 20 20 20 20 20 78 2e 70 50 61  t x;.      x.pPa
23aa0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
23ab0 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69      x.iTable = i
23ac0 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e  Parent;.      x.
23ad0 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 4e 65 77  iNewTable = iNew
23ae0 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e  Parent;.      x.
23af0 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 69 73 4c  isLeftJoin = isL
23b00 65 66 74 4a 6f 69 6e 3b 0a 20 20 20 20 20 20 78  eftJoin;.      x
23b10 2e 70 45 4c 69 73 74 20 3d 20 70 53 75 62 2d 3e  .pEList = pSub->
23b20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 75  pEList;.      su
23b30 62 73 74 53 65 6c 65 63 74 28 26 78 2c 20 70 50  bstSelect(&x, pP
23b40 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 7d  arent, 0);.    }
23b50 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  .  .    /* The f
23b60 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69  lattened query i
23b70 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69  s distinct if ei
23b80 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f  ther the inner o
23b90 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  r the.    ** out
23ba0 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74  er query is dist
23bb0 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  inct. .    */.  
23bc0 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c    pParent->selFl
23bd0 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c  ags |= pSub->sel
23be0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
23bf0 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20  nct;.  .    /*. 
23c00 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e     ** SELECT ...
23c10 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
23c20 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54  . LIMIT a OFFSET
23c30 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53   b) LIMIT x OFFS
23c40 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ET y;.    **.   
23c50 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74   ** One is tempt
23c60 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64  ed to try to add
23c70 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62   a and b to comb
23c80 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20  ine the limits. 
23c90 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a   But this.    **
23ca0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69   does not work i
23cb0 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69  f either limit i
23cc0 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20  s negative..    
23cd0 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
23ce0 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >pLimit ){.     
23cf0 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74   pParent->pLimit
23d00 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b   = pSub->pLimit;
23d10 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69  .      pSub->pLi
23d20 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  mit = 0;.    }. 
23d30 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c   }..  /* Finiall
23d40 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
23d50 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
23d60 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
23d70 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
23d80 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65    */.  sqlite3Se
23d90 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
23da0 53 75 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45  Sub1);..#if SELE
23db0 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
23dc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
23dd0 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
23de0 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
23df0 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
23e00 2c 70 2c 28 22 41 66 74 65 72 20 66 6c 61 74 74  ,p,("After flatt
23e10 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20  ening:\n"));.   
23e20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
23e30 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
23e40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
23e50 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
23e60 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
23e70 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
23e80 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
23e90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
23ea0 29 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66  ) */....#if !def
23eb0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
23ec0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
23ed0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
23ee0 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d  IT_VIEW)./*.** M
23ef0 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72 65  ake copies of re
23f00 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c 61  levant WHERE cla
23f10 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  use terms of the
23f20 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e 74   outer query int
23f30 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  o.** the WHERE c
23f40 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
23f50 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  y.  Example:.**.
23f60 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
23f70 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53  ROM (SELECT a AS
23f80 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f   x, c-d AS y FRO
23f90 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d 35 20  M t1) WHERE x=5 
23fa0 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20  AND y=10;.**.** 
23fb0 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
23fc0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
23fd0 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T * FROM (SELECT
23fe0 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20   a AS x, c-d AS 
23ff0 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  y FROM t1 WHERE 
24000 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a  a=5 AND c-d=10).
24010 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d 35  **     WHERE x=5
24020 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a   AND y=10;.**.**
24030 20 54 68 65 20 68 6f 70 65 20 69 73 20 74 68 61   The hope is tha
24040 74 20 74 68 65 20 74 65 72 6d 73 20 61 64 64 65  t the terms adde
24050 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20 71  d to the inner q
24060 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69  uery will make i
24070 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69  t more.** effici
24080 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f  ent..**.** Do no
24090 74 20 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f  t attempt this o
240a0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a  ptimization if:.
240b0 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 28 2a 2a 20  **.**   (1) (** 
240c0 54 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  This restriction
240d0 20 77 61 73 20 72 65 6d 6f 76 65 64 20 6f 6e 20   was removed on 
240e0 32 30 31 37 2d 30 39 2d 32 39 2e 20 20 57 65 20  2017-09-29.  We 
240f0 75 73 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20  used to.**      
24100 20 20 20 20 20 64 69 73 61 6c 6c 6f 77 20 74 68       disallow th
24110 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
24120 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 73 75  for aggregate su
24130 62 71 75 65 72 69 65 73 2c 20 62 75 74 20 6e 6f  bqueries, but no
24140 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 69  w.**           i
24150 74 20 69 73 20 61 6c 6c 6f 77 65 64 20 62 79 20  t is allowed by 
24160 70 75 74 74 69 6e 67 20 74 68 65 20 65 78 74 72  putting the extr
24170 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 48  a terms on the H
24180 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a  AVING clause..**
24190 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20 61             The a
241a0 64 64 65 64 20 48 41 56 49 4e 47 20 63 6c 61 75  dded HAVING clau
241b0 73 65 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 20  se is pointless 
241c0 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
241d0 6c 61 63 6b 73 0a 2a 2a 20 20 20 20 20 20 20 20  lacks.**        
241e0 20 20 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c     a GROUP BY cl
241f0 61 75 73 65 2e 20 20 42 75 74 20 73 75 63 68 20  ause.  But such 
24200 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  a HAVING clause 
24210 69 73 20 61 6c 73 6f 20 68 61 72 6d 6c 65 73 73  is also harmless
24220 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 73 6f  .**           so
24230 20 74 68 65 72 65 20 64 6f 65 73 20 6e 6f 74 20   there does not 
24240 61 70 70 65 61 72 20 74 6f 20 62 65 20 61 6e 79  appear to be any
24250 20 72 65 61 73 6f 6e 20 74 6f 20 61 64 64 20 65   reason to add e
24260 78 74 72 61 20 6c 6f 67 69 63 0a 2a 2a 20 20 20  xtra logic.**   
24270 20 20 20 20 20 20 20 20 74 6f 20 73 75 70 70 72          to suppr
24280 65 73 73 20 69 74 2e 20 2a 2a 29 0a 2a 2a 0a 2a  ess it. **).**.*
24290 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e 6e 65  *   (2) The inne
242a0 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20 72  r query is the r
242b0 65 63 75 72 73 69 76 65 20 70 61 72 74 20 6f 66  ecursive part of
242c0 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20   a common table 
242d0 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
242e0 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e 6e 65  *   (3) The inne
242f0 72 20 71 75 65 72 79 20 68 61 73 20 61 20 4c 49  r query has a LI
24300 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69 6e 63  MIT clause (sinc
24310 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  e the changes to
24320 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 20 20   the WHERE.**   
24330 20 20 20 20 63 6c 6f 73 65 20 77 6f 75 6c 64 20      close would 
24340 63 68 61 6e 67 65 20 74 68 65 20 6d 65 61 6e 69  change the meani
24350 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 29  ng of the LIMIT)
24360 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54 68  ..**.**   (4) Th
24370 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73  e inner query is
24380 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
24390 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  nd of a LEFT JOI
243a0 4e 20 61 6e 64 20 74 68 65 0a 2a 2a 20 20 20 20  N and the.**    
243b0 20 20 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f     expression to
243c0 20 62 65 20 70 75 73 68 65 64 20 64 6f 77 6e 20   be pushed down 
243d0 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 66 72  does not come fr
243e0 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  om the ON clause
243f0 0a 2a 2a 20 20 20 20 20 20 20 6f 6e 20 74 68 61  .**       on tha
24400 74 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a  t LEFT JOIN..**.
24410 2a 2a 20 20 20 28 35 29 20 54 68 65 20 57 48 45  **   (5) The WHE
24420 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  RE clause expres
24430 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 73 20  sion originates 
24440 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
24450 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20  NG clause.**    
24460 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49     of a LEFT JOI
24470 4e 20 77 68 65 72 65 20 69 43 75 72 73 6f 72 20  N where iCursor 
24480 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
24490 2d 68 61 6e 64 20 74 61 62 6c 65 20 6f 66 20 74  -hand table of t
244a0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 6c 65 66  hat.**       lef
244b0 74 20 6a 6f 69 6e 2e 20 20 41 6e 20 65 78 61 6d  t join.  An exam
244c0 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
244d0 20 20 20 20 20 53 45 4c 45 43 54 20 2a 0a 2a 2a       SELECT *.**
244e0 20 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d 20             FROM 
244f0 28 53 45 4c 45 43 54 20 31 20 41 53 20 61 31 20  (SELECT 1 AS a1 
24500 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
24510 20 32 29 20 41 53 20 61 61 0a 2a 2a 20 20 20 20   2) AS aa.**    
24520 20 20 20 20 20 20 20 4a 4f 49 4e 20 28 53 45 4c         JOIN (SEL
24530 45 43 54 20 31 20 41 53 20 62 32 20 55 4e 49 4f  ECT 1 AS b2 UNIO
24540 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 32 29 20  N ALL SELECT 2) 
24550 41 53 20 62 62 20 4f 4e 20 28 61 31 3d 62 32 29  AS bb ON (a1=b2)
24560 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4c 45  .**           LE
24570 46 54 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20  FT JOIN (SELECT 
24580 38 20 41 53 20 63 33 20 55 4e 49 4f 4e 20 41 4c  8 AS c3 UNION AL
24590 4c 20 53 45 4c 45 43 54 20 39 29 20 41 53 20 63  L SELECT 9) AS c
245a0 63 20 4f 4e 20 28 62 32 3d 32 29 3b 0a 2a 2a 0a  c ON (b2=2);.**.
245b0 2a 2a 20 20 20 20 20 20 20 54 68 65 20 63 6f 72  **       The cor
245c0 72 65 63 74 20 61 6e 73 77 65 72 20 69 73 20 74  rect answer is t
245d0 68 72 65 65 20 72 6f 77 73 3a 20 20 28 31 2c 31  hree rows:  (1,1
245e0 2c 4e 55 4c 4c 29 2c 28 32 2c 32 2c 38 29 2c 28  ,NULL),(2,2,8),(
245f0 32 2c 32 2c 39 29 2e 0a 2a 2a 20 20 20 20 20 20  2,2,9)..**      
24600 20 42 75 74 20 69 66 20 74 68 65 20 28 62 32 3d   But if the (b2=
24610 32 29 20 74 65 72 6d 20 77 65 72 65 20 74 6f 20  2) term were to 
24620 62 65 20 70 75 73 68 65 64 20 64 6f 77 6e 20 69  be pushed down i
24630 6e 74 6f 20 74 68 65 20 62 62 20 73 75 62 71 75  nto the bb subqu
24640 65 72 79 2c 0a 2a 2a 20 20 20 20 20 20 20 74 68  ery,.**       th
24650 65 6e 20 74 68 65 20 28 31 2c 31 2c 4e 55 4c 4c  en the (1,1,NULL
24660 29 20 72 6f 77 20 77 6f 75 6c 64 20 62 65 20 73  ) row would be s
24670 75 70 70 72 65 73 73 65 64 2e 0a 2a 2a 0a 2a 2a  uppressed..**.**
24680 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20   Return 0 if no 
24690 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
246a0 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66   and non-zero if
246b0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45   one or more WHE
246c0 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72  RE clause.** ter
246d0 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61 74 65  ms are duplicate
246e0 64 20 69 6e 74 6f 20 74 68 65 20 73 75 62 71 75  d into the subqu
246f0 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
24700 6e 74 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65  nt pushDownWhere
24710 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a  Terms(.  Parse *
24720 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
24730 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
24740 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  (for malloc() an
24750 64 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e  d error reportin
24760 67 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  g) */.  Select *
24770 70 53 75 62 71 2c 20 20 20 20 20 20 20 20 2f 2a  pSubq,        /*
24780 20 54 68 65 20 73 75 62 71 75 65 72 79 20 77 68   The subquery wh
24790 6f 73 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ose WHERE clause
247a0 20 69 73 20 74 6f 20 62 65 20 61 75 67 6d 65 6e   is to be augmen
247b0 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ted */.  Expr *p
247c0 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
247d0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
247e0 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
247f0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
24800 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20  Cursor,         
24810 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
24820 72 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  r of the subquer
24830 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66  y */.  int isLef
24840 74 4a 6f 69 6e 20 20 20 20 20 20 20 20 2f 2a 20  tJoin        /* 
24850 54 72 75 65 20 69 66 20 70 53 75 62 71 20 69 73  True if pSubq is
24860 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
24870 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a  of a LEFT JOIN *
24880 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  /.){.  Expr *pNe
24890 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d  w;.  int nChng =
248a0 20 30 3b 0a 20 20 69 66 28 20 70 57 68 65 72 65   0;.  if( pWhere
248b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
248c0 20 20 69 66 28 20 70 53 75 62 71 2d 3e 73 65 6c    if( pSubq->sel
248d0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
248e0 73 69 76 65 20 29 20 72 65 74 75 72 6e 20 30 3b  sive ) return 0;
248f0 20 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e    /* restriction
24900 20 28 32 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20   (2) */..#ifdef 
24910 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
24920 2a 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  * Only the first
24930 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f   term of a compo
24940 75 6e 64 20 63 61 6e 20 68 61 76 65 20 61 20 57  und can have a W
24950 49 54 48 20 63 6c 61 75 73 65 2e 20 20 42 75 74  ITH clause.  But
24960 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20   make.  ** sure 
24970 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 73 20 61  no other terms a
24980 72 65 20 6d 61 72 6b 65 64 20 53 46 5f 52 65 63  re marked SF_Rec
24990 75 72 73 69 76 65 20 69 6e 20 63 61 73 65 20 73  ursive in case s
249a0 6f 6d 65 74 68 69 6e 67 20 63 68 61 6e 67 65 73  omething changes
249b0 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 75 74  .  ** in the fut
249c0 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20  ure..  */.  {.  
249d0 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 20 20 0a    Select *pX;  .
249e0 20 20 20 20 66 6f 72 28 70 58 3d 70 53 75 62 71      for(pX=pSubq
249f0 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50 72  ; pX; pX=pX->pPr
24a00 69 6f 72 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ior){.      asse
24a10 72 74 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61 67  rt( (pX->selFlag
24a20 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76  s & (SF_Recursiv
24a30 65 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  e))==0 );.    }.
24a40 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
24a50 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21  ( pSubq->pLimit!
24a60 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
24a70 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69   0; /* restricti
24a80 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20  on (3) */.  }.  
24a90 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f  while( pWhere->o
24aa0 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p==TK_AND ){.   
24ab0 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f   nChng += pushDo
24ac0 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50 61  wnWhereTerms(pPa
24ad0 72 73 65 2c 20 70 53 75 62 71 2c 20 70 57 68 65  rse, pSubq, pWhe
24ae0 72 65 2d 3e 70 52 69 67 68 74 2c 0a 20 20 20 20  re->pRight,.    
24af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b00 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72              iCur
24b10 73 6f 72 2c 20 69 73 4c 65 66 74 4a 6f 69 6e 29  sor, isLeftJoin)
24b20 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70  ;.    pWhere = p
24b30 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20 20  Where->pLeft;.  
24b40 7d 0a 20 20 69 66 28 20 69 73 4c 65 66 74 4a 6f  }.  if( isLeftJo
24b50 69 6e 0a 20 20 20 26 26 20 28 45 78 70 72 48 61  in.   && (ExprHa
24b60 73 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65  sProperty(pWhere
24b70 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3d 3d 30  ,EP_FromJoin)==0
24b80 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57 68  .         || pWh
24b90 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  ere->iRightJoinT
24ba0 61 62 6c 65 21 3d 69 43 75 72 73 6f 72 29 0a 20  able!=iCursor). 
24bb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
24bc0 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
24bd0 20 28 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66   (4) */.  }.  if
24be0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
24bf0 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d  y(pWhere,EP_From
24c00 4a 6f 69 6e 29 20 26 26 20 70 57 68 65 72 65 2d  Join) && pWhere-
24c10 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
24c20 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  !=iCursor ){.   
24c30 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
24c40 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20 2a 2f  striction (5) */
24c50 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
24c60 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
24c70 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43  stant(pWhere, iC
24c80 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43  ursor) ){.    nC
24c90 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65  hng++;.    while
24ca0 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20  ( pSubq ){.     
24cb0 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b   SubstContext x;
24cc0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
24cd0 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
24ce0 72 73 65 2d 3e 64 62 2c 20 70 57 68 65 72 65 2c  rse->db, pWhere,
24cf0 20 30 29 3b 0a 20 20 20 20 20 20 75 6e 73 65 74   0);.      unset
24d00 4a 6f 69 6e 45 78 70 72 28 70 4e 65 77 2c 20 2d  JoinExpr(pNew, -
24d10 31 29 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72  1);.      x.pPar
24d20 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
24d30 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 43     x.iTable = iC
24d40 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69  ursor;.      x.i
24d50 4e 65 77 54 61 62 6c 65 20 3d 20 69 43 75 72 73  NewTable = iCurs
24d60 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c 65  or;.      x.isLe
24d70 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20 20 20  ftJoin = 0;.    
24d80 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75    x.pEList = pSu
24d90 62 71 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  bq->pEList;.    
24da0 20 20 70 4e 65 77 20 3d 20 73 75 62 73 74 45 78    pNew = substEx
24db0 70 72 28 26 78 2c 20 70 4e 65 77 29 3b 0a 20 20  pr(&x, pNew);.  
24dc0 20 20 20 20 69 66 28 20 70 53 75 62 71 2d 3e 73      if( pSubq->s
24dd0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
24de0 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20  regate ){.      
24df0 20 20 70 53 75 62 71 2d 3e 70 48 61 76 69 6e 67    pSubq->pHaving
24e00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
24e10 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  d(pParse->db, pS
24e20 75 62 71 2d 3e 70 48 61 76 69 6e 67 2c 20 70 4e  ubq->pHaving, pN
24e30 65 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ew);.      }else
24e40 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 71 2d  {.        pSubq-
24e50 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
24e60 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
24e70 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 57 68 65  >db, pSubq->pWhe
24e80 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  re, pNew);.     
24e90 20 7d 0a 20 20 20 20 20 20 70 53 75 62 71 20 3d   }.      pSubq =
24ea0 20 70 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b 0a   pSubq->pPrior;.
24eb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
24ec0 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64  rn nChng;.}.#end
24ed0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
24ee0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
24ef0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
24f00 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
24f10 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  W) */../*.** The
24f20 20 70 46 75 6e 63 20 69 73 20 74 68 65 20 6f 6e   pFunc is the on
24f30 6c 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ly aggregate fun
24f40 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 71 75 65  ction in the que
24f50 72 79 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  ry.  Check to se
24f60 65 0a 2a 2a 20 69 66 20 74 68 65 20 71 75 65 72  e.** if the quer
24f70 79 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  y is a candidate
24f80 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78   for the min/max
24f90 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 0a   optimization. .
24fa0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65  **.** If the que
24fb0 72 79 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ry is a candidat
24fc0 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61  e for the min/ma
24fd0 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  x optimization, 
24fe0 74 68 65 6e 20 73 65 74 0a 2a 2a 20 2a 70 70 4d  then set.** *ppM
24ff0 69 6e 4d 61 78 20 74 6f 20 62 65 20 61 6e 20 4f  inMax to be an O
25000 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
25010 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  o be used for th
25020 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
25030 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 65 69 74  * and return eit
25040 68 65 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42  her WHERE_ORDERB
25050 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f  Y_MIN or WHERE_O
25060 52 44 45 52 42 59 5f 4d 41 58 20 64 65 70 65 6e  RDERBY_MAX depen
25070 64 69 6e 67 20 6f 6e 0a 2a 2a 20 77 68 65 74 68  ding on.** wheth
25080 65 72 20 70 46 75 6e 63 20 69 73 20 61 20 6d 69  er pFunc is a mi
25090 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
250a0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
250b0 74 68 65 20 71 75 65 72 79 20 69 73 20 6e 6f 74  the query is not
250c0 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
250d0 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74   the min/max opt
250e0 69 6d 69 7a 61 74 69 6f 6e 2c 20 72 65 74 75 72  imization, retur
250f0 6e 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52  n.** WHERE_ORDER
25100 42 59 5f 4e 4f 52 4d 41 4c 20 28 77 68 69 63 68  BY_NORMAL (which
25110 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 29 2e 0a   must be zero)..
25120 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
25130 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
25140 64 20 61 66 74 65 72 20 61 67 67 72 65 67 61 74  d after aggregat
25150 65 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65  e functions have
25160 20 62 65 65 6e 0a 2a 2a 20 6c 6f 63 61 74 65 64   been.** located
25170 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 65 69   but before thei
25180 72 20 61 72 67 75 6d 65 6e 74 73 20 68 61 76 65  r arguments have
25190 20 62 65 65 6e 20 73 75 62 6a 65 63 74 65 64 20   been subjected 
251a0 74 6f 20 61 67 67 72 65 67 61 74 65 0a 2a 2a 20  to aggregate.** 
251b0 61 6e 61 6c 79 73 69 73 2e 0a 2a 2f 0a 73 74 61  analysis..*/.sta
251c0 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65  tic u8 minMaxQue
251d0 72 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ry(sqlite3 *db, 
251e0 45 78 70 72 20 2a 70 46 75 6e 63 2c 20 45 78 70  Expr *pFunc, Exp
251f0 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78  rList **ppMinMax
25200 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20  ){.  int eRet = 
25210 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
25220 52 4d 41 4c 3b 20 20 20 20 20 20 2f 2a 20 52 65  RMAL;      /* Re
25230 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20  turn value */.  
25240 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
25250 20 3d 20 70 46 75 6e 63 2d 3e 78 2e 70 4c 69 73   = pFunc->x.pLis
25260 74 3b 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e  t;    /* Argumen
25270 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69  ts to agg functi
25280 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
25290 61 72 20 2a 7a 46 75 6e 63 3b 20 20 20 20 20 20  ar *zFunc;      
252a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
252b0 20 4e 61 6d 65 20 6f 66 20 61 67 67 72 65 67 61   Name of aggrega
252c0 74 65 20 66 75 6e 63 74 69 6f 6e 20 70 46 75 6e  te function pFun
252d0 63 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  c */.  ExprList 
252e0 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 75 38 20  *pOrderBy;.  u8 
252f0 73 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 61 73  sortOrder;..  as
25300 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d  sert( *ppMinMax=
25310 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
25320 70 46 75 6e 63 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pFunc->op==TK_AG
25330 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
25340 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c  if( pEList==0 ||
25350 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
25360 31 20 29 20 72 65 74 75 72 6e 20 65 52 65 74 3b  1 ) return eRet;
25370 0a 20 20 7a 46 75 6e 63 20 3d 20 70 46 75 6e 63  .  zFunc = pFunc
25380 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 69 66  ->u.zToken;.  if
25390 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
253a0 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d  (zFunc, "min")==
253b0 30 20 29 7b 0a 20 20 20 20 65 52 65 74 20 3d 20  0 ){.    eRet = 
253c0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
253d0 4e 3b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  N;.    sortOrder
253e0 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43   = SQLITE_SO_ASC
253f0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
25400 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
25410 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b  nc, "max")==0 ){
25420 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52  .    eRet = WHER
25430 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20  E_ORDERBY_MAX;. 
25440 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 53     sortOrder = S
25450 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3b 0a 20  QLITE_SO_DESC;. 
25460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
25470 72 6e 20 65 52 65 74 3b 0a 20 20 7d 0a 20 20 2a  rn eRet;.  }.  *
25480 70 70 4d 69 6e 4d 61 78 20 3d 20 70 4f 72 64 65  ppMinMax = pOrde
25490 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
254a0 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c  rListDup(db, pEL
254b0 69 73 74 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ist, 0);.  asser
254c0 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 7c  t( pOrderBy!=0 |
254d0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
254e0 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 64  ed );.  if( pOrd
254f0 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d  erBy ) pOrderBy-
25500 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
25510 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 72  = sortOrder;.  r
25520 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f  eturn eRet;.}../
25530 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20  *.** The select 
25540 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
25550 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
25560 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67  gument is an agg
25570 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a  regate query..**
25580 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
25590 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f  ment is the asso
255a0 63 69 61 74 65 64 20 61 67 67 72 65 67 61 74 65  ciated aggregate
255b0 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68  -info object. Th
255c0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
255d0 74 65 73 74 73 20 69 66 20 74 68 65 20 53 45 4c  tests if the SEL
255e0 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ECT is of the fo
255f0 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  rm:.**.**   SELE
25600 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
25610 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65   <tbl>.**.** whe
25620 72 65 20 74 61 62 6c 65 20 69 73 20 61 20 64 61  re table is a da
25630 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f  tabase table, no
25640 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  t a sub-select o
25650 72 20 76 69 65 77 2e 20 49 66 20 74 68 65 20 71  r view. If the q
25660 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74  uery.** does mat
25670 63 68 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c  ch this pattern,
25680 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20   then a pointer 
25690 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  to the Table obj
256a0 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ect representing
256b0 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74  .** <tbl> is ret
256c0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
256d0 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
256e0 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65  .*/.static Table
256f0 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28   *isSimpleCount(
25700 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e  Select *p, AggIn
25710 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
25720 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
25730 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20  Expr *pExpr;..  
25740 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f  assert( !p->pGro
25750 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70  upBy );..  if( p
25760 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70  ->pWhere || p->p
25770 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
25780 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  .   || p->pSrc->
25790 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53  nSrc!=1 || p->pS
257a0 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
257b0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
257c0 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d   0;.  }.  pTab =
257d0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
257e0 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  Tab;.  pExpr = p
257f0 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
25800 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
25810 70 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70  pTab && !pTab->p
25820 53 65 6c 65 63 74 20 26 26 20 70 45 78 70 72 20  Select && pExpr 
25830 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74  );..  if( IsVirt
25840 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
25850 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
25860 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55  r->op!=TK_AGG_FU
25870 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20  NCTION ) return 
25880 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  0;.  if( NEVER(p
25890 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d  AggInfo->nFunc==
258a0 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0) ) return 0;. 
258b0 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e   if( (pAggInfo->
258c0 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e  aFunc[0].pFunc->
258d0 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45  funcFlags&SQLITE
258e0 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20  _FUNC_COUNT)==0 
258f0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
25900 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45  ( pExpr->flags&E
25910 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74  P_Distinct ) ret
25920 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  urn 0;..  return
25930 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
25940 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69  If the source-li
25950 73 74 20 69 74 65 6d 20 70 61 73 73 65 64 20 61  st item passed a
25960 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61  s an argument wa
25970 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68  s augmented with
25980 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42   an.** INDEXED B
25990 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
259a0 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ry to locate the
259b0 20 73 70 65 63 69 66 69 65 64 20 69 6e 64 65 78   specified index
259c0 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61  . If there.** wa
259d0 73 20 73 75 63 68 20 61 20 63 6c 61 75 73 65 20  s such a clause 
259e0 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  and the named in
259f0 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  dex cannot be fo
25a00 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  und, return .** 
25a10 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64  SQLITE_ERROR and
25a20 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
25a30 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72  in pParse. Other
25a40 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a  wise, populate .
25a50 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78  ** pFrom->pIndex
25a60 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
25a70 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
25a80 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f  lite3IndexedByLo
25a90 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61 72  okup(Parse *pPar
25aa0 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69  se, struct SrcLi
25ab0 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b  st_item *pFrom){
25ac0 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54  .  if( pFrom->pT
25ad0 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 66 67 2e  ab && pFrom->fg.
25ae0 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20  isIndexedBy ){. 
25af0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
25b00 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
25b10 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 65 64    char *zIndexed
25b20 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a  By = pFrom->u1.z
25b30 49 6e 64 65 78 65 64 42 79 3b 0a 20 20 20 20 49  IndexedBy;.    I
25b40 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
25b50 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
25b60 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20  Index; .        
25b70 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33 53  pIdx && sqlite3S
25b80 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61  trICmp(pIdx->zNa
25b90 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42 79 29 3b  me, zIndexedBy);
25ba0 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d 70   .        pIdx=p
25bb0 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29  Idx->pNext.    )
25bc0 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78 20  ;.    if( !pIdx 
25bd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
25be0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
25bf0 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
25c00 20 25 73 22 2c 20 7a 49 6e 64 65 78 65 64 42 79   %s", zIndexedBy
25c10 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
25c20 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
25c30 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
25c40 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
25c50 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d      }.    pFrom-
25c60 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 49 64 78  >pIBIndex = pIdx
25c70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
25c80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  QLITE_OK;.}./*.*
25c90 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e  * Detect compoun
25ca0 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
25cb0 6e 74 73 20 74 68 61 74 20 75 73 65 20 61 6e 20  nts that use an 
25cc0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
25cd0 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65  with .** an alte
25ce0 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e  rnative collatin
25cf0 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
25d00 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20  *    SELECT ... 
25d10 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
25d20 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
25d30 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f  2 ORDER BY .. CO
25d40 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  LLATE ....**.** 
25d50 54 68 65 73 65 20 61 72 65 20 72 65 77 72 69 74  These are rewrit
25d60 74 65 6e 20 61 73 20 61 20 73 75 62 71 75 65 72  ten as a subquer
25d70 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  y:.**.**    SELE
25d80 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
25d90 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58  T ... FROM t1 EX
25da0 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20  CEPT SELECT ... 
25db0 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20  FROM t2).**     
25dc0 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c  ORDER BY ... COL
25dd0 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54  LATE ....**.** T
25de0 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
25df0 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  on is necessary 
25e00 62 65 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74  because the mult
25e10 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29  iSelectOrderBy()
25e20 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76   routine.** abov
25e30 65 20 74 68 61 74 20 67 65 6e 65 72 61 74 65 73  e that generates
25e40 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   the code for a 
25e50 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
25e60 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
25e70 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20   clause.** uses 
25e80 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  a merge algorith
25e90 6d 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  m that requires 
25ea0 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69  the same collati
25eb0 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74  ng sequence on t
25ec0 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c  he.** result col
25ed0 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f  umns as on the O
25ee0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
25ef0 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68   See ticket.** h
25f00 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65  ttp://www.sqlite
25f10 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37  .org/src/info/67
25f20 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54  09574d2a.**.** T
25f30 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
25f40 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65  on is only neede
25f50 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e  d for EXCEPT, IN
25f60 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49  TERSECT, and UNI
25f70 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e  ON..** The UNION
25f80 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f   ALL operator wo
25f90 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75  rks fine with mu
25fa0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
25fb0 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20  () even when.** 
25fc0 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54  there are COLLAT
25fd0 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  E terms in the O
25fe0 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74  RDER BY..*/.stat
25ff0 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f  ic int convertCo
26000 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75  mpoundSelectToSu
26010 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70  bquery(Walker *p
26020 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
26030 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  p){.  int i;.  S
26040 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53  elect *pNew;.  S
26050 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c  elect *pX;.  sql
26060 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75  ite3 *db;.  stru
26070 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
26080 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   *a;.  SrcList *
26090 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65  pNewSrc;.  Parse
260a0 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65   *pParse;.  Toke
260b0 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20  n dummy;..  if( 
260c0 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72  p->pPrior==0 ) r
260d0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
260e0 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72  ue;.  if( p->pOr
260f0 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
26100 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
26110 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26    for(pX=p; pX &
26120 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  & (pX->op==TK_AL
26130 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  L || pX->op==TK_
26140 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e  SELECT); pX=pX->
26150 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20  pPrior){}.  if( 
26160 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  pX==0 ) return W
26170 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61  RC_Continue;.  a
26180 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e   = p->pOrderBy->
26190 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f  a;.  for(i=p->pO
261a0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b  rderBy->nExpr-1;
261b0 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
261c0 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d   if( a[i].pExpr-
261d0 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
261e0 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ate ) break;.  }
261f0 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
26200 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
26210 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  ;..  /* If we re
26220 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
26230 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74  that means the t
26240 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
26250 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20   required. */.. 
26260 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65   pParse = pWalke
26270 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  r->pParse;.  db 
26280 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
26290 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
262a0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
262b0 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
262c0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
262d0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
262e0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d  ;.  memset(&dumm
262f0 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d  y, 0, sizeof(dum
26300 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20  my));.  pNewSrc 
26310 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
26320 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70  AppendFromTerm(p
26330 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d  Parse,0,0,0,&dum
26340 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20  my,pNew,0,0);.  
26350 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29  if( pNewSrc==0 )
26360 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
26370 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b  t;.  *pNew = *p;
26380 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65  .  p->pSrc = pNe
26390 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73  wSrc;.  p->pELis
263a0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
263b0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
263c0 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72  , 0, sqlite3Expr
263d0 28 64 62 2c 20 54 4b 5f 41 53 54 45 52 49 53 4b  (db, TK_ASTERISK
263e0 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d  , 0));.  p->op =
263f0 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d   TK_SELECT;.  p-
26400 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70  >pWhere = 0;.  p
26410 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
26420 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  0;.  pNew->pHavi
26430 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  ng = 0;.  pNew->
26440 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
26450 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
26460 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20   p->pNext = 0;. 
26470 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20   p->pWith = 0;. 
26480 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
26490 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20  ~SF_Compound;.  
264a0 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
264b0 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72  lags & SF_Conver
264c0 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  ted)==0 );.  p->
264d0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43  selFlags |= SF_C
264e0 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73 73 65  onverted;.  asse
264f0 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  rt( pNew->pPrior
26500 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  !=0 );.  pNew->p
26510 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
26520 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  New;.  pNew->pLi
26530 6d 69 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  mit = 0;.  retur
26540 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
26550 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
26560 6f 20 73 65 65 20 69 66 20 74 68 65 20 46 52 4f  o see if the FRO
26570 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 46  M clause term pF
26580 72 6f 6d 20 68 61 73 20 74 61 62 6c 65 2d 76 61  rom has table-va
26590 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  lued function.**
265a0 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 49 66 20   arguments.  If 
265b0 69 74 20 64 6f 65 73 2c 20 6c 65 61 76 65 20 61  it does, leave a
265c0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
265d0 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
265e0 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
265f0 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d 20 69 73  , since pFrom is
26600 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20   not allowed to 
26610 62 65 20 61 20 74 61 62 6c 65 2d 76 61 6c 75 65  be a table-value
26620 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  d function..*/.s
26630 74 61 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f 74  tatic int cannot
26640 42 65 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65  BeFunction(Parse
26650 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74   *pParse, struct
26660 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
26670 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72  From){.  if( pFr
26680 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  om->fg.isTabFunc
26690 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
266a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
266b0 22 27 25 73 27 20 69 73 20 6e 6f 74 20 61 20 66  "'%s' is not a f
266c0 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d  unction", pFrom-
266d0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
266e0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
266f0 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn 0;.}..#ifnde
26700 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
26710 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  E./*.** Argument
26720 20 70 57 69 74 68 20 28 77 68 69 63 68 20 6d 61   pWith (which ma
26730 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74  y be NULL) point
26740 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69  s to a linked li
26750 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a  st of nested .**
26760 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20   WITH contexts, 
26770 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75  from inner to ou
26780 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20  termost. If the 
26790 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64  table identified
267a0 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   by .** FROM cla
267b0 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65  use element pIte
267c0 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f  m is really a co
267d0 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65  mmon-table-expre
267e0 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20  ssion (CTE) .** 
267f0 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f  then return a po
26800 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54 45  inter to the CTE
26810 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20   definition for 
26820 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65  that table. Othe
26830 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20  rwise.** return 
26840 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
26850 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
26860 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74  is returned, set
26870 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70   *ppContext to p
26880 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68  oint to the With
26890 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20  .** object that 
268a0 74 68 65 20 72 65 74 75 72 6e 65 64 20 43 54 45  the returned CTE
268b0 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a   belongs to..*/.
268c0 73 74 61 74 69 63 20 73 74 72 75 63 74 20 43 74  static struct Ct
268d0 65 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20  e *searchWith(. 
268e0 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20   With *pWith,   
268f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26900 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e 65   /* Current inne
26910 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73  rmost WITH claus
26920 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
26930 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
26940 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  m,     /* FROM c
26950 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f  lause element to
26960 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69   resolve */.  Wi
26970 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20  th **ppContext  
26980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26990 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73   OUT: WITH claus
269a0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62  e return value b
269b0 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a  elongs to */.){.
269c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
269d0 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  ame;.  if( pItem
269e0 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26  ->zDatabase==0 &
269f0 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d  & (zName = pItem
26a00 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ->zName)!=0 ){. 
26a10 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20     With *p;.    
26a20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20  for(p=pWith; p; 
26a30 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20  p=p->pOuter){.  
26a40 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
26a50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
26a60 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
26a70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
26a80 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e  rICmp(zName, p->
26a90 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
26aa0 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 43  {.          *ppC
26ab0 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  ontext = p;.    
26ac0 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d        return &p-
26ad0 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d  >a[i];.        }
26ae0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
26af0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
26b00 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65  ../* The code ge
26b10 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e  nerator maintain
26b20 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74  s a stack of act
26b30 69 76 65 20 57 49 54 48 20 63 6c 61 75 73 65 73  ive WITH clauses
26b40 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e  .** with the inn
26b50 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61  er-most WITH cla
26b60 75 73 65 20 62 65 69 6e 67 20 61 74 20 74 68 65  use being at the
26b70 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
26b80 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
26b90 75 74 69 6e 65 20 70 75 73 68 65 73 20 74 68 65  utine pushes the
26ba0 20 57 49 54 48 20 63 6c 61 75 73 65 20 70 61 73   WITH clause pas
26bb0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
26bc0 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e  d argument.** on
26bd0 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  to the top of th
26be0 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75  e stack. If argu
26bf0 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20 74 72  ment bFree is tr
26c00 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a  ue, then this.**
26c10 20 57 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c   WITH clause wil
26c20 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65  l never be poppe
26c30 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  d from the stack
26c40 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
26c50 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66  t.** should be f
26c60 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  reed along with 
26c70 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
26c80 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73  . In other cases
26c90 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d  , when.** bFree=
26ca0 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a  =0, the With obj
26cb0 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65  ect will be free
26cc0 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
26cd0 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74   SELECT .** stat
26ce0 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63 68  ement with which
26cf0 20 69 74 20 69 73 20 61 73 73 6f 63 69 61 74 65   it is associate
26d00 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
26d10 65 33 57 69 74 68 50 75 73 68 28 50 61 72 73 65  e3WithPush(Parse
26d20 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a   *pParse, With *
26d30 70 57 69 74 68 2c 20 75 38 20 62 46 72 65 65 29  pWith, u8 bFree)
26d40 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46 72 65  {.  assert( bFre
26d50 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73 65 2d  e==0 || (pParse-
26d60 3e 70 57 69 74 68 3d 3d 30 20 26 26 20 70 50 61  >pWith==0 && pPa
26d70 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65  rse->pWithToFree
26d80 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 57  ==0) );.  if( pW
26d90 69 74 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ith ){.    asser
26da0 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  t( pParse->pWith
26db0 21 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70  !=pWith );.    p
26dc0 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70  With->pOuter = p
26dd0 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20  Parse->pWith;.  
26de0 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
26df0 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28  = pWith;.    if(
26e00 20 62 46 72 65 65 20 29 20 70 50 61 72 73 65 2d   bFree ) pParse-
26e10 3e 70 57 69 74 68 54 6f 46 72 65 65 20 3d 20 70  >pWithToFree = p
26e20 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  With;.  }.}../*.
26e30 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
26e40 20 63 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d   checks if argum
26e50 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73  ent pFrom refers
26e60 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72   to a CTE declar
26e70 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48  ed by .** a WITH
26e80 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73   clause on the s
26e90 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d  tack currently m
26ea0 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65  aintained by the
26eb0 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a   parser. And,.**
26ec0 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72   if currently pr
26ed0 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45 20 65  ocessing a CTE e
26ee0 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74  xpression, if it
26ef0 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65 0a   is a recursive.
26f00 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ** reference to 
26f10 74 68 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e  the current CTE.
26f20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20  .**.** If pFrom 
26f30 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65  falls into eithe
26f40 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74  r of the two cat
26f50 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70  egories above, p
26f60 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e  From->pTab.** an
26f70 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61  d other fields a
26f80 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63  re populated acc
26f90 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61  ordingly. The ca
26fa0 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63  ller should chec
26fb0 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61  k.** (pFrom->pTa
26fc0 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69  b!=0) to determi
26fd0 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
26fe0 74 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d  t a successful m
26ff0 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e  atch.** was foun
27000 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
27010 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20   or not a match 
27020 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45  is found, SQLITE
27030 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
27040 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f  if no error.** o
27050 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72  ccurs. If an err
27060 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61  or does occur, a
27070 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
27080 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
27090 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73  .** parser and s
270a0 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ome error code o
270b0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
270c0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
270d0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 74 68  .static int with
270e0 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72  Expand(.  Walker
270f0 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74   *pWalker, .  st
27100 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
27110 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61  m *pFrom.){.  Pa
27120 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
27130 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
27140 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
27150 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72  Parse->db;.  str
27160 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20  uct Cte *pCte;  
27170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27180 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f 72 20  Matched CTE (or 
27190 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68  NULL if no match
271a0 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69  ) */.  With *pWi
271b0 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
271c0 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63         /* WITH c
271d0 6c 61 75 73 65 20 74 68 61 74 20 70 43 74 65 20  lause that pCte 
271e0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20  belongs to */.. 
271f0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
27200 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43  pTab==0 );..  pC
27210 74 65 20 3d 20 73 65 61 72 63 68 57 69 74 68 28  te = searchWith(
27220 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70  pParse->pWith, p
27230 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20  From, &pWith);. 
27240 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20   if( pCte ){.   
27250 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
27260 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
27270 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  st;.    Select *
27280 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74  pSel;.    Select
27290 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20   *pLeft;        
272a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d          /* Left-
272b0 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
272c0 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ement */.    int
272d0 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20   bMayRecursive; 
272e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
272f0 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a  ue if compound j
27300 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b  oined by UNION [
27310 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68  ALL] */.    With
27320 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20 20   *pSavedWith;   
27330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
27340 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50  tial value of pP
27350 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a  arse->pWith */..
27360 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e      /* If pCte->
27370 7a 43 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e  zCteErr is non-N
27380 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ULL at this poin
27390 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  t, then this is 
273a0 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a  an illegal.    *
273b0 2a 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  * recursive refe
273c0 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74  rence to CTE pCt
273d0 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f  e. Leave an erro
273e0 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  r in pParse and 
273f0 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61  return.    ** ea
27400 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43  rly. If pCte->zC
27410 74 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74  teErr is NULL, t
27420 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20  hen this is not 
27430 61 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  a recursive refe
27440 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e  rence..    ** In
27450 20 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63   this case, proc
27460 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  eed.  */.    if(
27470 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 29   pCte->zCteErr )
27480 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
27490 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
274a0 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70  pCte->zCteErr, p
274b0 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
274c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
274d0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
274e0 20 20 69 66 28 20 63 61 6e 6e 6f 74 42 65 46 75    if( cannotBeFu
274f0 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  nction(pParse, p
27500 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 53  From) ) return S
27510 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20  QLITE_ERROR;..  
27520 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
27530 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
27540 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
27550 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
27560 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
27570 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20  eof(Table));.   
27580 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
27590 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
275a0 0a 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52  .    pTab->nTabR
275b0 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54 61 62  ef = 1;.    pTab
275c0 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
275d0 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43  3DbStrDup(db, pC
275e0 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  te->zName);.    
275f0 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
27600 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77  ;.    pTab->nRow
27610 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73  LogEst = 200; as
27620 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74  sert( 200==sqlit
27630 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36  e3LogEst(1048576
27640 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74  ) );.    pTab->t
27650 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70  abFlags |= TF_Ep
27660 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f 4e 6f 56  hemeral | TF_NoV
27670 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20  isibleRowid;.   
27680 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
27690 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
276a0 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65  up(db, pCte->pSe
276b0 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  lect, 0);.    if
276c0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
276d0 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ed ) return SQLI
276e0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
276f0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
27700 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20  ->pSelect );..  
27710 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
27720 69 73 20 69 73 20 61 20 72 65 63 75 72 73 69 76  is is a recursiv
27730 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53  e CTE. */.    pS
27740 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
27750 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52 65 63  ect;.    bMayRec
27760 75 72 73 69 76 65 20 3d 20 28 20 70 53 65 6c 2d  ursive = ( pSel-
27770 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
27780 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  Sel->op==TK_UNIO
27790 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61  N );.    if( bMa
277a0 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  yRecursive ){.  
277b0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
277c0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
277d0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d   pFrom->pSelect-
277e0 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72  >pSrc;.      for
277f0 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
27800 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
27810 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
27820 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
27830 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pSrc->a[i];.    
27840 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
27850 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20 20 20  Database==0 .   
27860 20 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e        && pItem->
27870 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20 20 20  zName!=0 .      
27880 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33     && 0==sqlite3
27890 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a  StrICmp(pItem->z
278a0 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  Name, pCte->zNam
278b0 65 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  e).          ){.
278c0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
278d0 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20  >pTab = pTab;.  
278e0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66          pItem->f
278f0 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 3d 20  g.isRecursive = 
27900 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  1;.          pTa
27910 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20  b->nTabRef++;.  
27920 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65          pSel->se
27930 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 63  lFlags |= SF_Rec
27940 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20 20 20  ursive;.        
27950 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
27960 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65  .    /* Only one
27970 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
27980 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74 74 65  ence is permitte
27990 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 70  d. */ .    if( p
279a0 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 32 20 29  Tab->nTabRef>2 )
279b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
279c0 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20 20  rrorMsg(.       
279d0 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c 74     pParse, "mult
279e0 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20  iple references 
279f0 74 6f 20 72 65 63 75 72 73 69 76 65 20 74 61 62  to recursive tab
27a00 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a  le: %s", pCte->z
27a10 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  Name.      );.  
27a20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27a30 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
27a40 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
27a50 3e 6e 54 61 62 52 65 66 3d 3d 31 20 7c 7c 20 0a  >nTabRef==1 || .
27a60 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70 53              ((pS
27a70 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f  el->selFlags&SF_
27a80 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70 54  Recursive) && pT
27a90 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 32 20 29  ab->nTabRef==2 )
27aa0 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43  );..    pCte->zC
27ab0 74 65 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61  teErr = "circula
27ac0 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22  r reference: %s"
27ad0 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69 74 68  ;.    pSavedWith
27ae0 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68   = pParse->pWith
27af0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  ;.    pParse->pW
27b00 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20  ith = pWith;.   
27b10 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
27b20 76 65 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  ve ){.      Sele
27b30 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 53 65  ct *pPrior = pSe
27b40 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  l->pPrior;.     
27b50 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
27b60 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20 20  >pWith==0 );.   
27b70 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68     pPrior->pWith
27b80 20 3d 20 70 53 65 6c 2d 3e 70 57 69 74 68 3b 0a   = pSel->pWith;.
27b90 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
27ba0 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
27bb0 20 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 20 20   pPrior);.      
27bc0 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20  pPrior->pWith = 
27bd0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
27be0 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
27bf0 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
27c00 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sel);.    }.    
27c10 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
27c20 70 57 69 74 68 3b 0a 0a 20 20 20 20 66 6f 72 28  pWith;..    for(
27c30 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66  pLeft=pSel; pLef
27c40 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74  t->pPrior; pLeft
27c50 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b  =pLeft->pPrior);
27c60 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c  .    pEList = pL
27c70 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  eft->pEList;.   
27c80 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73   if( pCte->pCols
27c90 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45   ){.      if( pE
27ca0 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
27cb0 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f  nExpr!=pCte->pCo
27cc0 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  ls->nExpr ){.   
27cd0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
27ce0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
27cf0 62 6c 65 20 25 73 20 68 61 73 20 25 64 20 76 61  ble %s has %d va
27d00 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75  lues for %d colu
27d10 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  mns",.          
27d20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70    pCte->zName, p
27d30 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43  EList->nExpr, pC
27d40 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72  te->pCols->nExpr
27d50 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
27d60 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
27d70 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
27d80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
27d90 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
27da0 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73     }.      pELis
27db0 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b  t = pCte->pCols;
27dc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
27dd0 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
27de0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
27df0 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43  EList, &pTab->nC
27e00 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29  ol, &pTab->aCol)
27e10 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
27e20 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
27e30 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c   if( pSel->selFl
27e40 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
27e50 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ve ){.        pC
27e60 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 6d  te->zCteErr = "m
27e70 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73 69 76  ultiple recursiv
27e80 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20 25 73  e references: %s
27e90 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
27ea0 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43          pCte->zC
27eb0 74 65 45 72 72 20 3d 20 22 72 65 63 75 72 73 69  teErr = "recursi
27ec0 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20  ve reference in 
27ed0 61 20 73 75 62 71 75 65 72 79 3a 20 25 73 22 3b  a subquery: %s";
27ee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
27ef0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
27f00 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b  (pWalker, pSel);
27f10 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74 65 2d  .    }.    pCte-
27f20 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20  >zCteErr = 0;.  
27f30 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
27f40 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20  = pSavedWith;.  
27f50 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
27f60 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
27f70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27f80 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49  OMIT_CTE./*.** I
27f90 66 20 74 68 65 20 53 45 4c 45 43 54 20 70 61 73  f the SELECT pas
27fa0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
27fb0 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61  d argument has a
27fc0 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57 49 54  n associated WIT
27fd0 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f  H .** clause, po
27fe0 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73 74  p it from the st
27ff0 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70 61  ack stored as pa
28000 72 74 20 6f 66 20 74 68 65 20 50 61 72 73 65 20  rt of the Parse 
28010 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
28020 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
28030 73 65 64 20 61 73 20 74 68 65 20 78 53 65 6c 65  sed as the xSele
28040 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63 61  ctCallback2() ca
28050 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c  llback by.** sql
28060 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
28070 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20  () when walking 
28080 61 20 53 45 4c 45 43 54 20 74 72 65 65 20 74 6f  a SELECT tree to
28090 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a   resolve table.*
280a0 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68 65  * names and othe
280b0 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  r FROM clause el
280c0 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74  ements. .*/.stat
280d0 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50 6f  ic void selectPo
280e0 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57  pWith(Walker *pW
280f0 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
28100 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
28110 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
28120 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49  arse;.  if( OK_I
28130 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70 50  F_ALWAYS_TRUE(pP
28140 61 72 73 65 2d 3e 70 57 69 74 68 29 20 26 26 20  arse->pWith) && 
28150 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a  p->pPrior==0 ){.
28160 20 20 20 20 57 69 74 68 20 2a 70 57 69 74 68 20      With *pWith 
28170 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28  = findRightmost(
28180 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 69  p)->pWith;.    i
28190 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b 0a 20  f( pWith!=0 ){. 
281a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
281b0 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74  rse->pWith==pWit
281c0 68 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  h );.      pPars
281d0 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
281e0 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 7d 0a  ->pOuter;.    }.
281f0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66    }.}.#else.#def
28200 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74  ine selectPopWit
28210 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  h 0.#endif../*.*
28220 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
28230 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62  s a Walker callb
28240 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69  ack for "expandi
28250 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ng" a SELECT sta
28260 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61  tement..** "Expa
28270 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20  nding" means to 
28280 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  do the following
28290 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
282a0 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63  Make sure VDBE c
282b0 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
282c0 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
282d0 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20   to every.**    
282e0 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20       element of 
282f0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
28300 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46  .**.**    (2)  F
28310 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c  ill in the pTabL
28320 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69  ist->a[].pTab fi
28330 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c  elds in the SrcL
28340 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20  ist that .**    
28350 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f       defines FRO
28360 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20  M clause.  When 
28370 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20  views appear in 
28380 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  the FROM clause,
28390 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c  .**         fill
283a0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
283b0 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  Select with a co
283c0 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
283d0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
283e0 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65        that imple
283f0 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20  ments the view. 
28400 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
28410 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45  of the view's SE
28420 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
28430 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61  statement so tha
28440 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20  t we can freely 
28450 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65  modify or delete
28460 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a   that statement.
28470 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f  **         witho
28480 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75  ut worrying abou
28490 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65  t messing up the
284a0 20 70 65 72 73 69 73 74 65 6e 74 20 72 65 70 72   persistent repr
284b0 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20  esentation.**   
284c0 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65        of the vie
284d0 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20  w..**.**    (3) 
284e0 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68   Add terms to th
284f0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
28500 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68  o accommodate th
28510 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
28520 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20  d.**         on 
28530 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e  joins and the ON
28540 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
28550 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a  e of joins..**.*
28560 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74  *    (4)  Scan t
28570 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
28580 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
28590 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f   set (pEList) lo
285a0 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oking.**        
285b0 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f   for instances o
285c0 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74  f the "*" operat
285d0 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e  or or the TABLE.
285e0 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20  * operator..**  
285f0 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c         If found,
28600 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22   expand each "*"
28610 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
28620 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62  umn in every tab
28630 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e  le.**         an
28640 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20  d TABLE.* to be 
28650 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
28660 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61  TABLE..**.*/.sta
28670 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78  tic int selectEx
28680 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70  pander(Walker *p
28690 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
286a0 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
286b0 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
286c0 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20  Parse;.  int i, 
286d0 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20  j, k;.  SrcList 
286e0 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70  *pTabList;.  Exp
286f0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
28700 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
28710 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73  item *pFrom;.  s
28720 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
28730 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
28740 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70  *pE, *pRight, *p
28750 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46  Expr;.  u16 selF
28760 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
28770 67 73 3b 0a 20 20 75 33 32 20 65 6c 69 73 74 46  gs;.  u32 elistF
28780 6c 61 67 73 20 3d 20 30 3b 0a 0a 20 20 70 2d 3e  lags = 0;..  p->
28790 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45  selFlags |= SF_E
287a0 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64  xpanded;.  if( d
287b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
287c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
287d0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  RC_Abort;.  }.  
287e0 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21  assert( p->pSrc!
287f0 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 73 65 6c  =0 );.  if( (sel
28800 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e  Flags & SF_Expan
28810 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ded)!=0 ){.    r
28820 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
28830 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20  .  }.  pTabList 
28840 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
28850 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
28860 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68 50 75  .  sqlite3WithPu
28870 73 68 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 57  sh(pParse, p->pW
28880 69 74 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d  ith, 0);..  /* M
28890 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20  ake sure cursor 
288a0 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
288b0 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  n assigned to al
288c0 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a  l entries in.  *
288d0 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
288e0 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
288f0 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
28900 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
28910 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
28920 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b  arse, pTabList);
28930 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
28940 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64  very table named
28950 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
28960 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63  use of the selec
28970 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  t.  If.  ** an e
28980 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
28990 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62   clause is a sub
289a0 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66  query instead of
289b0 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
289c0 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61  ,.  ** then crea
289d0 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  te a transient t
289e0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
289f0 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73  o describe the s
28a00 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  ubquery..  */.  
28a10 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
28a20 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
28a30 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
28a40 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
28a50 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
28a60 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
28a70 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 3d  >fg.isRecursive=
28a80 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61  =0 || pFrom->pTa
28a90 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b!=0 );.    if( 
28aa0 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75  pFrom->fg.isRecu
28ab0 72 73 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65  rsive ) continue
28ac0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
28ad0 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
28ae0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28af0 4d 49 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20  MIT_CTE.    if( 
28b00 77 69 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b  withExpand(pWalk
28b10 65 72 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74  er, pFrom) ) ret
28b20 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
28b30 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54     if( pFrom->pT
28b40 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e  ab ) {} else.#en
28b50 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f  dif.    if( pFro
28b60 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23  m->zName==0 ){.#
28b70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28b80 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
28b90 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
28ba0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
28bb0 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
28bc0 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
28bd0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
28be0 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73  LECT */.      as
28bf0 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b  sert( pSel!=0 );
28c00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
28c10 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
28c20 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
28c30 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
28c40 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29 20 72 65  lker, pSel) ) re
28c50 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
28c60 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
28c70 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
28c80 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
28c90 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
28ca0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
28cb0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
28cc0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70  C_Abort;.      p
28cd0 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31  Tab->nTabRef = 1
28ce0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f  ;.      if( pFro
28cf0 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
28d00 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
28d10 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
28d20 75 70 28 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41  up(db, pFrom->zA
28d30 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lias);.      }el
28d40 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62  se{.        pTab
28d50 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
28d60 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 75  3MPrintf(db, "su
28d70 62 71 75 65 72 79 5f 25 70 22 2c 20 28 76 6f 69  bquery_%p", (voi
28d80 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20  d*)pTab);.      
28d90 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  }.      while( p
28da0 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70  Sel->pPrior ){ p
28db0 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
28dc0 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69  or; }.      sqli
28dd0 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
28de0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
28df0 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61  Sel->pEList,&pTa
28e00 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61  b->nCol,&pTab->a
28e10 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Col);.      pTab
28e20 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
28e30 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f      pTab->nRowLo
28e40 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
28e50 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
28e60 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
28e70 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  );.      pTab->t
28e80 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70  abFlags |= TF_Ep
28e90 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a  hemeral;.#endif.
28ea0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28eb0 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
28ec0 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
28ed0 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
28ee0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
28ef0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
28f00 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
28f10 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
28f20 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
28f30 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
28f40 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20  e, 0, pFrom);.  
28f50 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
28f60 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
28f70 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  rt;.      if( pT
28f80 61 62 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66  ab->nTabRef>=0xf
28f90 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73  fff ){.        s
28fa0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
28fb0 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
28fc0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c   references to \
28fd0 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35  "%s\": max 65535
28fe0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
28ff0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
29000 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
29010 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
29020 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
29030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61       }.      pTa
29040 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20  b->nTabRef++;.  
29050 20 20 20 20 69 66 28 20 21 49 73 56 69 72 74 75      if( !IsVirtu
29060 61 6c 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e  al(pTab) && cann
29070 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61  otBeFunction(pPa
29080 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20  rse, pFrom) ){. 
29090 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
290a0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
290b0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
290c0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
290d0 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c  || !defined (SQL
290e0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
290f0 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28  TABLE).      if(
29100 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
29110 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
29120 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36  t ){.        i16
29130 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69   nCol;.        i
29140 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  f( sqlite3ViewGe
29150 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
29160 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74  rse, pTab) ) ret
29170 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
29180 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
29190 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  From->pSelect==0
291a0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f   );.        pFro
291b0 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
291c0 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
291d0 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c  , pTab->pSelect,
291e0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
291f0 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d  ite3SelectSetNam
29200 65 28 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  e(pFrom->pSelect
29210 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
29220 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70          nCol = p
29230 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
29240 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20     pTab->nCol = 
29250 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  -1;.        sqli
29260 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
29270 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53  alker, pFrom->pS
29280 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
29290 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  pTab->nCol = nCo
292a0 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  l;.      }.#endi
292b0 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
292c0 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  Locate the index
292d0 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e   named by the IN
292e0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
292f0 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
29300 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
29310 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73  edByLookup(pPars
29320 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
29330 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
29340 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ort;.    }.  }..
29350 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
29360 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
29370 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
29380 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
29390 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
293a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
293b0 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
293c0 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  in(pParse, p) ){
293d0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
293e0 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Abort;.  }..  /*
293f0 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
29400 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
29410 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
29420 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
29430 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
29440 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
29450 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
29460 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
29470 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
29480 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
29490 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
294a0 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
294b0 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
294c0 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
294d0 20 54 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70 65   TK_ASTERISK ope
294e0 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
294f0 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
29500 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20   in the column. 
29510 20 2a 2a 20 6c 69 73 74 2e 20 20 54 68 65 20 66   ** list.  The f
29520 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
29530 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
29540 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b   the TK_ASTERISK
29550 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
29560 73 20 61 6e 64 20 65 78 70 61 6e 64 20 65 61 63  s and expand eac
29570 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
29580 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
29590 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62   in.  ** all tab
295a0 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
295b0 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
295c0 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
295d0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
295e0 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
295f0 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
29600 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
29610 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
29620 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
29630 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74  .    pE = pEList
29640 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
29650 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
29660 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65 61  _ASTERISK ) brea
29670 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  k;.    assert( p
29680 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
29690 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29   pE->pRight!=0 )
296a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
296b0 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
296c0 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26  (pE->pLeft!=0 &&
296d0 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
296e0 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66  TK_ID) );.    if
296f0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
29700 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   && pE->pRight->
29710 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20  op==TK_ASTERISK 
29720 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 65 6c 69  ) break;.    eli
29730 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66  stFlags |= pE->f
29740 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lags;.  }.  if( 
29750 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
29760 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
29770 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
29780 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
29790 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
297a0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
297b0 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
297c0 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
297d0 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
297e0 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
297f0 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
29800 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
29810 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
29820 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
29830 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
29840 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
29850 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
29860 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
29870 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  w = 0;.    int f
29880 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64  lags = pParse->d
29890 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e  b->flags;.    in
298a0 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66  t longNames = (f
298b0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
298c0 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20  llColNames)!=0. 
298d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298e0 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26       && (flags &
298f0 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
29900 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20  Names)==0;..    
29910 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
29920 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
29930 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e        pE = a[k].
29940 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6c 69  pExpr;.      eli
29950 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66  stFlags |= pE->f
29960 6c 61 67 73 3b 0a 20 20 20 20 20 20 70 52 69 67  lags;.      pRig
29970 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b  ht = pE->pRight;
29980 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29990 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
299a0 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
299b0 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
299c0 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20  TK_ASTERISK.    
299d0 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54     && (pE->op!=T
299e0 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d  K_DOT || pRight-
299f0 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op!=TK_ASTERISK
29a00 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
29a10 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
29a20 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
29a30 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
29a40 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
29a50 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
29a60 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
29a70 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
29a80 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b  Parse, pNew, a[k
29a90 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
29aa0 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
29ab0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
29ac0 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
29ad0 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
29ae0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e;.          pNe
29af0 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
29b00 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d  -1].zSpan = a[k]
29b10 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20  .zSpan;.        
29b20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
29b30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
29b40 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20  .zSpan = 0;.    
29b50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b      }.        a[
29b60 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  k].pExpr = 0;.  
29b70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29b80 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
29b90 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
29ba0 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
29bb0 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
29bc0 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
29bd0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
29be0 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
29bf0 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
29c00 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
29c10 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
29c20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30  char *zTName = 0
29c30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20  ;       /* text 
29c40 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
29c50 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
29c60 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pE->op==TK_DOT )
29c70 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
29c80 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30  rt( pE->pLeft!=0
29c90 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
29ca0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
29cb0 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74  operty(pE->pLeft
29cc0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
29cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  ;.          zTNa
29ce0 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  me = pE->pLeft->
29cf0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
29d00 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
29d10 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
29d20 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
29d30 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
29d40 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  From++){.       
29d50 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
29d60 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
29d70 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
29d80 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSub = pFrom->pS
29d90 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20  elect;.         
29da0 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
29db0 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b  = pFrom->zAlias;
29dc0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
29dd0 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61   char *zSchemaNa
29de0 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
29df0 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
29e00 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
29e10 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
29e20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
29e30 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
29e40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29e50 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
29e60 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
29e70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
29e80 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e  ub==0 || (pSub->
29e90 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
29ea0 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a  stedFrom)==0 ){.
29eb0 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
29ec0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
29ed0 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
29ee0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
29ef0 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29  TName, zTabName)
29f00 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
29f10 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
29f20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
29f30 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73           iDb = s
29f40 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
29f50 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
29f60 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
29f70 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20      zSchemaName 
29f80 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61  = iDb>=0 ? db->a
29f90 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
29fa0 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20   : "*";.        
29fb0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f    }.          fo
29fc0 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
29fd0 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
29fe0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
29ff0 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
2a000 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
2a010 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
2a020 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f  name;  /* The co
2a030 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
2a040 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  me */.          
2a050 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b    char *zToFree;
2a060 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73     /* Malloced s
2a070 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73  tring that needs
2a080 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
2a090 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65              Toke
2a0a0 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20  n sColname;  /* 
2a0b0 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  Computed column 
2a0c0 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20  name as a token 
2a0d0 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  */..            
2a0e0 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b  assert( zName );
2a0f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2a100 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a   zTName && pSub.
2a110 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
2a120 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e  sqlite3MatchSpan
2a130 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73  Name(pSub->pELis
2a140 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30  t->a[j].zSpan, 0
2a150 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a  , zTName, 0)==0.
2a160 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
2a170 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
2a180 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2a190 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
2a1a0 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e    /* If a column
2a1b0 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68   is marked as 'h
2a1c0 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20  idden', omit it 
2a1d0 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65  from the expande
2a1e0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
2a1f0 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74   result-set list
2a200 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45   unless the SELE
2a210 43 54 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e  CT has the SF_In
2a220 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20  cludeHidden.    
2a230 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73          ** bit s
2a240 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  et..            
2a250 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
2a260 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
2a270 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64  & SF_IncludeHidd
2a280 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  en)==0.         
2a290 20 20 20 20 26 26 20 49 73 48 69 64 64 65 6e 43      && IsHiddenC
2a2a0 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
2a2b0 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20  l[j]) .         
2a2c0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2a2d0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2a2e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a2f0 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65          tableSee
2a300 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  n = 1;..        
2a310 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a      if( i>0 && z
2a320 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  TName==0 ){.    
2a330 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
2a340 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  From->fg.jointyp
2a350 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
2a360 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
2a370 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f     && tableAndCo
2a380 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69  lumnIndex(pTabLi
2a390 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c  st, i, zName, 0,
2a3a0 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   0).            
2a3b0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
2a3c0 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
2a3d0 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
2a3e0 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
2a3f0 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
2a400 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
2a410 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  ble to the right
2a420 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
2a430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a440 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2a450 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a460 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2a470 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
2a480 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e  From->pUsing, zN
2a490 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
2a4a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2a4b0 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
2a4c0 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
2a4d0 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
2a4e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a4f0 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
2a500 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
2a510 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
2a520 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a530 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2a540 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a550 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a560 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
2a570 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
2a580 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  _ID, zName);.   
2a590 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
2a5a0 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  e = zName;.     
2a5b0 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
2a5c0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
2a5d0 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  if( longNames ||
2a5e0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
2a5f0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
2a600 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a     Expr *pLeft;.
2a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
2a620 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
2a630 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61  r(db, TK_ID, zTa
2a640 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
2a650 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
2a660 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
2a670 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
2a680 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
2a690 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63           if( zSc
2a6a0 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20  hemaName ){.    
2a6b0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
2a6c0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
2a6d0 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65  db, TK_ID, zSche
2a6e0 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  maName);.       
2a6f0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
2a700 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2a710 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
2a720 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  eft, pExpr);.   
2a730 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2a740 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
2a750 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
2a760 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
2a770 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
2a780 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
2a790 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
2a7a0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
2a7b0 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
2a7c0 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
2a7d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a7e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a7f0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
2a800 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
2a810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a820 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
2a830 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
2a840 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
2a850 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
2a860 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49     sqlite3TokenI
2a870 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a  nit(&sColname, z
2a880 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
2a890 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2a8a0 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
2a8b0 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c  rse, pNew, &sCol
2a8c0 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
2a8d0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
2a8e0 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
2a8f0 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21   SF_NestedFrom)!
2a900 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2a910 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
2a920 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26  ist_item *pX = &
2a930 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
2a940 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  xpr-1];.        
2a950 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20 29        if( pSub )
2a960 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2a970 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
2a980 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
2a990 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
2a9a0 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[j].zSpan);.   
2a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2a9c0 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
2a9d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
2a9e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a9f0 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
2aa00 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d  zSpan = sqlite3M
2aa10 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
2aa20 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  s.%s",.         
2aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa50 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a    zSchemaName, z
2aa60 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d  TabName, zColnam
2aa70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2aa80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
2aa90 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
2aaa0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2aab0 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
2aac0 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a  bSpanIsTab = 1;.
2aad0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2aae0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2aaf0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46  3DbFree(db, zToF
2ab00 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
2ab10 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2ab20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
2ab30 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
2ab40 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
2ab50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2ab60 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2ab70 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
2ab80 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
2ab90 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2aba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2abb0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2abc0 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
2abd0 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
2abe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2abf0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2ac00 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2ac10 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2ac20 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
2ac30 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
2ac40 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  }.  if( p->pELis
2ac50 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  t ){.    if( p->
2ac60 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62  pEList->nExpr>db
2ac70 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
2ac80 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
2ac90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
2aca0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2acb0 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
2acc0 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29   in result set")
2acd0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
2ace0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
2acf0 20 20 20 20 69 66 28 20 28 65 6c 69 73 74 46 6c      if( (elistFl
2ad00 61 67 73 20 26 20 28 45 50 5f 48 61 73 46 75 6e  ags & (EP_HasFun
2ad10 63 7c 45 50 5f 53 75 62 71 75 65 72 79 29 29 21  c|EP_Subquery))!
2ad20 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =0 ){.      p->s
2ad30 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f  elFlags |= SF_Co
2ad40 6d 70 6c 65 78 52 65 73 75 6c 74 3b 0a 20 20 20  mplexResult;.   
2ad50 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2ad60 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2ad70 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75  ./*.** No-op rou
2ad80 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72  tine for the par
2ad90 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a  se-tree walker..
2ada0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
2adb0 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 57  routine is the W
2adc0 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
2add0 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73  ack then express
2ade0 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65  ion trees.** are
2adf0 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20   walked without 
2ae00 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e  any actions bein
2ae10 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20  g taken at each 
2ae20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c  node.  Presumabl
2ae30 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  y,.** when this 
2ae40 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
2ae50 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72  for Walker.xExpr
2ae60 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a  Callback then .*
2ae70 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  * Walker.xSelect
2ae80 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20  Callback is set 
2ae90 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
2aea0 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79  useful for every
2aeb0 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e   .** subquery in
2aec0 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65   the parser tree
2aed0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2aee0 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c  ExprWalkNoop(Wal
2aef0 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78  ker *NotUsed, Ex
2af00 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20  pr *NotUsed2){. 
2af10 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2af20 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
2af30 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
2af40 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2af50 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75  ./*.** No-op rou
2af60 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72  tine for the par
2af70 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 20 66  se-tree walker f
2af80 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
2af90 65 6e 74 73 2e 0a 2a 2a 20 73 75 62 71 75 65 72  ents..** subquer
2afa0 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20  y in the parser 
2afb0 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tree..*/.int sql
2afc0 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f  ite3SelectWalkNo
2afd0 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  op(Walker *NotUs
2afe0 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  ed, Select *NotU
2aff0 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
2b000 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
2b010 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
2b020 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2b030 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  inue;.}..#if SQL
2b040 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
2b050 41 6c 77 61 79 73 20 61 73 73 65 72 74 2e 20 20  Always assert.  
2b060 54 68 69 73 20 78 53 65 6c 65 63 74 43 61 6c 6c  This xSelectCall
2b070 62 61 63 6b 32 20 69 6d 70 6c 65 6d 65 6e 74 61  back2 implementa
2b080 74 69 6f 6e 20 70 72 6f 76 65 73 20 74 68 61 74  tion proves that
2b090 20 74 68 65 0a 2a 2a 20 78 53 65 6c 65 63 74 43   the.** xSelectC
2b0a0 61 6c 6c 62 61 63 6b 32 20 69 73 20 6e 65 76 65  allback2 is neve
2b0b0 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 76 6f  r invoked..*/.vo
2b0c0 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
2b0d0 57 61 6c 6b 41 73 73 65 72 74 32 28 57 61 6c 6b  WalkAssert2(Walk
2b0e0 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c  er *NotUsed, Sel
2b0f0 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  ect *NotUsed2){.
2b100 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2b110 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
2b120 55 73 65 64 32 29 3b 0a 20 20 61 73 73 65 72 74  Used2);.  assert
2b130 28 20 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ( 0 );.}.#endif.
2b140 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2b150 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20 53  ne "expands" a S
2b160 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
2b170 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
2b180 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f  ubqueries..** Fo
2b190 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
2b1a0 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74  ormation on what
2b1b0 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78   it means to "ex
2b1c0 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a  pand" a SELECT.*
2b1d0 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65  * statement, see
2b1e0 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
2b1f0 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64  the selectExpand
2b200 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b   worker callback
2b210 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78   above..**.** Ex
2b220 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54  panding a SELECT
2b230 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68   statement is th
2b240 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e 20  e first step in 
2b250 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20  processing a.** 
2b260 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2b270 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  .  The SELECT st
2b280 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  atement must be 
2b290 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a  expanded before.
2b2a0 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  ** name resoluti
2b2b0 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  on is performed.
2b2c0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69  .**.** If anythi
2b2d0 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61  ng goes wrong, a
2b2e0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2b2f0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2b300 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63  pParse..** The c
2b310 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
2b320 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20 70  can detect the p
2b330 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e  roblem by lookin
2b340 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72  g at pParse->nEr
2b350 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72  r.** and/or pPar
2b360 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
2b370 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iled..*/.static 
2b380 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
2b390 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a  ctExpand(Parse *
2b3a0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2b3b0 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b  pSelect){.  Walk
2b3c0 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43  er w;.  w.xExprC
2b3d0 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
2b3e0 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  3ExprWalkNoop;. 
2b3f0 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
2b400 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f  se;.  if( OK_IF_
2b410 41 4c 57 41 59 53 5f 54 52 55 45 28 70 50 61 72  ALWAYS_TRUE(pPar
2b420 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 29  se->hasCompound)
2b430 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63   ){.    w.xSelec
2b440 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76  tCallback = conv
2b450 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
2b460 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20  tToSubquery;.   
2b470 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2b480 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ck2 = 0;.    sql
2b490 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
2b4a0 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  w, pSelect);.  }
2b4b0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2b4c0 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70  back = selectExp
2b4d0 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65  ander;.  w.xSele
2b4e0 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65  ctCallback2 = se
2b4f0 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 73  lectPopWith;.  s
2b500 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
2b510 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d  (&w, pSelect);.}
2b520 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
2b530 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
2b540 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
2b550 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
2b560 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20  llback callback 
2b570 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53  for the sqlite3S
2b580 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a  electTypeInfo().
2b590 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  ** interface..**
2b5a0 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f  .** For each FRO
2b5b0 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
2b5c0 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54  y, add Column.zT
2b5d0 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a  ype and Column.z
2b5e0 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  Coll.** informat
2b5f0 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ion to the Table
2b600 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2b610 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
2b620 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20  esult set.** of 
2b630 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a  that subquery..*
2b640 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
2b650 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
2b660 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
2b670 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73  ult set was cons
2b680 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65  tructed.** by se
2b690 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62  lectExpander() b
2b6a0 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ut the type and 
2b6b0 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
2b6c0 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65  ation was omitte
2b6d0 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69  d.** at that poi
2b6e0 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74  nt because ident
2b6f0 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79  ifiers had not y
2b700 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  et been resolved
2b710 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
2b720 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
2b730 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65  er identifier re
2b740 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
2b750 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
2b760 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
2b770 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  fo(Walker *pWalk
2b780 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
2b790 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
2b7a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c  .  int i;.  SrcL
2b7b0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
2b7c0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2b7d0 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20  item *pFrom;..  
2b7e0 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
2b7f0 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
2b800 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  d );.  assert( (
2b810 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2b820 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30  _HasTypeInfo)==0
2b830 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   );.  p->selFlag
2b840 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49  s |= SF_HasTypeI
2b850 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20  nfo;.  pParse = 
2b860 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
2b870 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
2b880 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >pSrc;.  for(i=0
2b890 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
2b8a0 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
2b8b0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
2b8c0 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
2b8d0 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
2b8e0 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
2b8f0 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
2b900 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
2b910 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
2b920 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
2b930 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
2b940 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2b950 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
2b960 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
2b970 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
2b980 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20  lect;.      if( 
2b990 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pSel ){.        
2b9a0 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
2b9b0 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65  ior ) pSel = pSe
2b9c0 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  l->pPrior;.     
2b9d0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2b9e0 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
2b9f0 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
2ba00 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20  , pTab, pSel);. 
2ba10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2ba20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
2ba30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
2ba40 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64  dds datatype and
2ba50 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
2ba60 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nce information 
2ba70 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20  to.** the Table 
2ba80 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c  structures of al
2ba90 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
2baa0 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a  bqueries in a.**
2bab0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2bac0 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69  t..**.** Use thi
2bad0 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  s routine after 
2bae0 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
2baf0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2bb00 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
2bb10 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a  TypeInfo(Parse *
2bb20 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2bb30 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65  pSelect){.#ifnde
2bb40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
2bb50 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20  BQUERY.  Walker 
2bb60 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  w;.  w.xSelectCa
2bb70 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
2bb80 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a  SelectWalkNoop;.
2bb90 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2bba0 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64  ack2 = selectAdd
2bbb0 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
2bbc0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
2bbd0 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ack = sqlite3Exp
2bbe0 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
2bbf0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2bc00 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
2bc10 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
2bc20 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
2bc30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2bc40 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54  sets up a SELECT
2bc50 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70   statement for p
2bc60 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a  rocessing.  The.
2bc70 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
2bc80 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a  accomplished:.**
2bc90 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20  .**     *  VDBE 
2bca0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61  Cursor numbers a
2bcb0 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  re assigned to a
2bcc0 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74  ll FROM-clause t
2bcd0 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  erms..**     *  
2bce0 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  Ephemeral Table 
2bcf0 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
2bd00 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d  ted for all FROM
2bd10 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
2bd20 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e  es..**     *  ON
2bd30 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
2bd40 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69  es are shifted i
2bd50 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d  nto WHERE statem
2bd60 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57  ents.**     *  W
2bd70 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64  ildcards "*" and
2bd80 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65   "TABLE.*" in re
2bd90 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78  sult sets are ex
2bda0 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a  panded..**     *
2bdb0 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e    Identifiers in
2bdc0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20   expression are 
2bdd0 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65  matched to table
2bde0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
2bdf0 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72  utine acts recur
2be00 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75  sively on all su
2be10 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20  bqueries within 
2be20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
2be30 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
2be40 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a  tPrep(.  Parse *
2be50 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2be60 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
2be70 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
2be80 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
2be90 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
2bea0 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
2beb0 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65  coded. */.  Name
2bec0 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
2bed0 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65  C  /* Name conte
2bee0 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72  xt for container
2bef0 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
2bf00 20 70 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p!=0 || pParse-
2bf10 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2bf20 64 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  d );.  if( pPars
2bf30 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
2bf40 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
2bf50 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
2bf60 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
2bf70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
2bf80 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
2bf90 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69  (pParse, p);.  i
2bfa0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2bfb0 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
2bfc0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
2bfd0 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52  turn;.  sqlite3R
2bfe0 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65  esolveSelectName
2bff0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75  s(pParse, p, pOu
2c000 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50  terNC);.  if( pP
2c010 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50  arse->nErr || pP
2c020 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
2c030 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
2c040 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
2c050 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72  AddTypeInfo(pPar
2c060 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  se, p);.}../*.**
2c070 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65   Reset the aggre
2c080 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
2c090 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72  ..**.** The aggr
2c0a0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
2c0b0 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65  r is a set of me
2c0c0 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20  mory cells that 
2c0d0 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64  hold.** intermed
2c0e0 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69  iate results whi
2c0f0 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61  le calculating a
2c100 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68  n aggregate.  Th
2c110 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  is.** routine ge
2c120 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61  nerates code tha
2c130 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69  t stores NULLs i
2c140 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d  n all of those m
2c150 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a  emory.** cells..
2c160 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
2c170 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
2c180 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
2c190 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
2c1a0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
2c1b0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
2c1c0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
2c1d0 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
2c1e0 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20  unc;.  int nReg 
2c1f0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  = pAggInfo->nFun
2c200 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  c + pAggInfo->nC
2c210 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65  olumn;.  if( nRe
2c220 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23  g==0 ) return;.#
2c230 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2c240 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
2c250 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20  hat all AggInfo 
2c260 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77 69  registers are wi
2c270 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73  thin the range s
2c280 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a  pecified by.  **
2c290 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e   AggInfo.mnReg..
2c2a0 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f  AggInfo.mxReg */
2c2b0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d  .  assert( nReg=
2c2c0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
2c2d0 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  -pAggInfo->mnReg
2c2e0 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  +1 );.  for(i=0;
2c2f0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   i<pAggInfo->nCo
2c300 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
2c310 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
2c320 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d  ->aCol[i].iMem>=
2c330 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
2c340 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
2c350 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
2c360 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  em<=pAggInfo->mx
2c370 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  Reg );.  }.  for
2c380 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
2c390 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  ->nFunc; i++){. 
2c3a0 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49     assert( pAggI
2c3b0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d  nfo->aFunc[i].iM
2c3c0 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  em>=pAggInfo->mn
2c3d0 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
2c3e0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2c3f0 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66  i].iMem<=pAggInf
2c400 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a  o->mxReg );.  }.
2c410 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
2c420 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2c430 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e  _Null, 0, pAggIn
2c440 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49  fo->mnReg, pAggI
2c450 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66  nfo->mxReg);.  f
2c460 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66  or(pFunc=pAggInf
2c470 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69  o->aFunc, i=0; i
2c480 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2c490 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b  ; i++, pFunc++){
2c4a0 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
2c4b0 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
2c4c0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
2c4d0 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
2c4e0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2c4f0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2c500 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2c510 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
2c520 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
2c530 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  E->x.pList->nExp
2c540 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r!=1 ){.        
2c550 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2c560 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
2c570 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73  T aggregates mus
2c580 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
2c590 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ne ".           
2c5a0 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20  "argument");.   
2c5b0 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
2c5c0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
2c5d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c5e0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
2c5f0 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
2c600 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
2c610 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c   pE->x.pList, 0,
2c620 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
2c630 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2c640 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
2c650 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  al, pFunc->iDist
2c660 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  inct, 0, 0,.    
2c670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c680 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
2c690 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
2c6a0 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
2c6b0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
2c6c0 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67  nvoke the OP_Agg
2c6d0 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20  Finalize opcode 
2c6e0 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67  for every aggreg
2c6f0 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
2c700 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  in the AggInfo s
2c710 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
2c720 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a  tic void finaliz
2c730 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61  eAggFunctions(Pa
2c740 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
2c750 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
2c760 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
2c770 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
2c780 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
2c790 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
2c7a0 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
2c7b0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
2c7c0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2c7d0 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
2c7e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
2c7f0 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
2c800 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
2c810 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2c820 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
2c830 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2c840 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2c850 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67  AddOp2(v, OP_Agg
2c860 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c  Final, pF->iMem,
2c870 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
2c880 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20  nExpr : 0);.    
2c890 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
2c8a0 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63  dP4(v, pF->pFunc
2c8b0 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
2c8c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
2c8d0 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
2c8e0 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
2c8f0 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
2c900 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
2c910 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
2c920 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
2c930 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
2c940 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
2c950 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
2c960 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
2c970 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
2c980 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
2c990 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d  ;.  int regHit =
2c9a0 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69   0;.  int addrHi
2c9b0 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72  tTest = 0;.  str
2c9c0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
2c9d0 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41   *pF;.  struct A
2c9e0 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a  ggInfo_col *pC;.
2c9f0 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
2ca00 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66  ectMode = 1;.  f
2ca10 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
2ca20 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
2ca30 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
2ca40 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69  ++, pF++){.    i
2ca50 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74  nt nArg;.    int
2ca60 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20   addrNext = 0;. 
2ca70 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20     int regAgg;. 
2ca80 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
2ca90 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
2caa0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
2cab0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2cac0 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
2cad0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
2cae0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
2caf0 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  ){.      nArg = 
2cb00 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
2cb10 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c      regAgg = sql
2cb20 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
2cb30 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a  (pParse, nArg);.
2cb40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2cb50 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
2cb60 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67  arse, pList, reg
2cb70 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45  Agg, 0, SQLITE_E
2cb80 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65  CEL_DUP);.    }e
2cb90 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  lse{.      nArg 
2cba0 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67  = 0;.      regAg
2cbb0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 0;.    }.   
2cbc0 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e   if( pF->iDistin
2cbd0 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ct>=0 ){.      a
2cbe0 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65  ddrNext = sqlite
2cbf0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2cc00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2cc10 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f  e( nArg==0 );  /
2cc20 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  * Error conditio
2cc30 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  n */.      testc
2cc40 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b 20 20  ase( nArg>1 );  
2cc50 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f   /* Also an erro
2cc60 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 44  r */.      codeD
2cc70 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
2cc80 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61  pF->iDistinct, a
2cc90 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41  ddrNext, 1, regA
2cca0 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gg);.    }.    i
2ccb0 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75  f( pF->pFunc->fu
2ccc0 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
2ccd0 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
2cce0 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
2ccf0 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
2cd00 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2cd10 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
2cd20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
2cd30 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
2cd40 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21  =0 );  /* pList!
2cd50 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20  =0 if pF->pFunc 
2cd60 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a  has NEEDCOLL */.
2cd70 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
2cd80 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21  Item=pList->a; !
2cd90 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b  pColl && j<nArg;
2cda0 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
2cdb0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
2cdc0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
2cdd0 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
2cde0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
2cdf0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  }.      if( !pCo
2ce00 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
2ce10 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
2ce20 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
2ce30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2ce40 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67  egHit==0 && pAgg
2ce50 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
2ce60 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b  or ) regHit = ++
2ce70 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2ce80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ce90 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
2cea0 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20  Seq, regHit, 0, 
2ceb0 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
2cec0 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
2ced0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2cee0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2cef0 5f 41 67 67 53 74 65 70 30 2c 20 30 2c 20 72 65  _AggStep0, 0, re
2cf00 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b  gAgg, pF->iMem);
2cf10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2cf20 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e  AppendP4(v, pF->
2cf30 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
2cf40 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
2cf50 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
2cf60 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  u8)nArg);.    sq
2cf70 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
2cf80 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
2cf90 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
2cfa0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  g);.    sqlite3R
2cfb0 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
2cfc0 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
2cfd0 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61  nArg);.    if( a
2cfe0 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ddrNext ){.     
2cff0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2d000 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
2d010 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Next);.      sql
2d020 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2d030 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
2d040 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  }.  }..  /* Befo
2d050 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68  re populating th
2d060 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
2d070 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74  gisters, clear t
2d080 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
2d090 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
2d0a0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72   if any of the r
2d0b0 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76  equired column v
2d0c0 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61 64  alues are alread
2d0d0 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20  y present .  ** 
2d0e0 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73 71  in registers, sq
2d0f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20  lite3ExprCode() 
2d100 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79  may use OP_SCopy
2d110 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c   to copy the val
2d120 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69  ue.  ** to pC->i
2d130 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20  Mem. But by the 
2d140 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69  time the value i
2d150 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67  s used, the orig
2d160 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20  inal register.  
2d170 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ** may have been
2d180 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74   used, invalidat
2d190 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ing the underlyi
2d1a0 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e  ng buffer holdin
2d1b0 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20  g the.  ** text 
2d1c0 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53  or blob value. S
2d1d0 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33  ee ticket [88303
2d1e0 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  4dcb5]..  **.  *
2d1f0 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69  * Another soluti
2d200 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63  on would be to c
2d210 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f  hange the OP_SCo
2d220 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20  py used to copy 
2d230 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75  cached.  ** valu
2d240 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79  es to an OP_Copy
2d250 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67  ..  */.  if( reg
2d260 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48  Hit ){.    addrH
2d270 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  itTest = sqlite3
2d280 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2d290 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64  _If, regHit); Vd
2d2a0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2d2b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
2d2c0 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
2d2d0 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  e);.  for(i=0, p
2d2e0 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  C=pAggInfo->aCol
2d2f0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41  ; i<pAggInfo->nA
2d300 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c  ccumulator; i++,
2d310 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   pC++){.    sqli
2d320 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
2d330 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70  se, pC->pExpr, p
2d340 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  C->iMem);.  }.  
2d350 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
2d360 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Mode = 0;.  sqli
2d370 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2d380 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  r(pParse);.  if(
2d390 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a   addrHitTest ){.
2d3a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2d3b0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48  umpHere(v, addrH
2d3c0 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  itTest);.  }.}..
2d3d0 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
2d3e0 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  le OP_Explain in
2d3f0 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
2d400 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e   VDBE to explain
2d410 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75   a simple.** cou
2d420 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45  nt(*) query ("SE
2d430 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2d440 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69  OM pTab")..*/.#i
2d450 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2d460 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63  T_EXPLAIN.static
2d470 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d   void explainSim
2d480 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73  pleCount(.  Pars
2d490 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2d4a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2d4b0 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
2d4c0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
2d4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4e0 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
2d4f0 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e   queried */.  In
2d500 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
2d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d520 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f   Index used to o
2d530 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72  ptimize scan, or
2d540 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66   NULL */.){.  if
2d550 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
2d560 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  n==2 ){.    int 
2d570 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d  bCover = (pIdx!=
2d580 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70  0 && (HasRowid(p
2d590 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61  Tab) || !IsPrima
2d5a0 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
2d5b0 29 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  ));.    char *zE
2d5c0 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  qp = sqlite3MPri
2d5d0 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
2d5e0 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73  "SCAN TABLE %s%s
2d5f0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
2d600 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
2d610 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49    bCover ? " USI
2d620 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
2d630 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20  X " : "",.      
2d640 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d    bCover ? pIdx-
2d650 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20  >zName : "".    
2d660 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2d670 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20  beAddOp4(.      
2d680 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c    pParse->pVdbe,
2d690 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
2d6a0 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
2d6b0 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44  0, 0, zEqp, P4_D
2d6c0 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20  YNAMIC.    );.  
2d6d0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
2d6e0 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  ne explainSimple
2d6f0 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e  Count(a,b,c).#en
2d700 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  dif../*.** sqlit
2d710 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61 6c  e3WalkExpr() cal
2d720 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 68 61  lback used by ha
2d730 76 69 6e 67 54 6f 57 68 65 72 65 28 29 2e 0a 2a  vingToWhere()..*
2d740 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 64 65  *.** If the node
2d750 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 63   passed to the c
2d760 61 6c 6c 62 61 63 6b 20 69 73 20 61 20 54 4b 5f  allback is a TK_
2d770 41 4e 44 20 6e 6f 64 65 2c 20 72 65 74 75 72 6e  AND node, return
2d780 20 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74 69 6e 75   .** WRC_Continu
2d790 65 20 74 6f 20 74 65 6c 6c 20 73 71 6c 69 74 65  e to tell sqlite
2d7a0 33 57 61 6c 6b 45 78 70 72 28 29 20 74 6f 20 69  3WalkExpr() to i
2d7b0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 63  terate through c
2d7c0 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a  hild nodes..**.*
2d7d0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
2d7e0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 2e 20 49  urn WRC_Prune. I
2d7f0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c 73  n this case, als
2d800 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 0a  o check if the .
2d810 2a 2a 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f  ** sub-expressio
2d820 6e 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 72  n matches the cr
2d830 69 74 65 72 69 61 20 66 6f 72 20 62 65 69 6e 67  iteria for being
2d840 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 57 48   moved to the WH
2d850 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 49  ERE.** clause. I
2d860 66 20 73 6f 2c 20 61 64 64 20 69 74 20 74 6f 20  f so, add it to 
2d870 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2d880 20 61 6e 64 20 72 65 70 6c 61 63 65 20 74 68 65   and replace the
2d890 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e 0a   sub-expression.
2d8a0 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 48 41  ** within the HA
2d8b0 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20  VING expression 
2d8c0 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20  with a constant 
2d8d0 22 31 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  "1"..*/.static i
2d8e0 6e 74 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65  nt havingToWhere
2d8f0 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a 70  ExprCb(Walker *p
2d900 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
2d910 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70  xpr){.  if( pExp
2d920 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20 29 7b  r->op!=TK_AND ){
2d930 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20  .    Select *pS 
2d940 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65  = pWalker->u.pSe
2d950 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20 73 71  lect;.    if( sq
2d960 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
2d970 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 70 57 61  antOrGroupBy(pWa
2d980 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 45  lker->pParse, pE
2d990 78 70 72 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42  xpr, pS->pGroupB
2d9a0 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  y) ){.      sqli
2d9b0 74 65 33 20 2a 64 62 20 3d 20 70 57 61 6c 6b 65  te3 *db = pWalke
2d9c0 72 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  r->pParse->db;. 
2d9d0 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
2d9e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
2d9f0 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  oc(db, TK_INTEGE
2da00 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f  R, &sqlite3IntTo
2da10 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 20  kens[1], 0);.   
2da20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
2da30 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 57 68         Expr *pWh
2da40 65 72 65 20 3d 20 70 53 2d 3e 70 57 68 65 72 65  ere = pS->pWhere
2da50 3b 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 45  ;.        SWAP(E
2da60 78 70 72 2c 20 2a 70 4e 65 77 2c 20 2a 70 45 78  xpr, *pNew, *pEx
2da70 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  pr);.        pNe
2da80 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  w = sqlite3ExprA
2da90 6e 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70  nd(db, pWhere, p
2daa0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 53  New);.        pS
2dab0 2d 3e 70 57 68 65 72 65 20 3d 20 70 4e 65 77 3b  ->pWhere = pNew;
2dac0 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72  .        pWalker
2dad0 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ->eCode = 1;.   
2dae0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
2daf0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2db00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2db10 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2db20 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 6c  *.** Transfer el
2db30 69 67 69 62 6c 65 20 74 65 72 6d 73 20 66 72 6f  igible terms fro
2db40 6d 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61  m the HAVING cla
2db50 75 73 65 20 6f 66 20 61 20 71 75 65 72 79 2c 20  use of a query, 
2db60 77 68 69 63 68 20 69 73 0a 2a 2a 20 70 72 6f 63  which is.** proc
2db70 65 73 73 65 64 20 61 66 74 65 72 20 67 72 6f 75  essed after grou
2db80 70 69 6e 67 2c 20 74 6f 20 74 68 65 20 57 48 45  ping, to the WHE
2db90 52 45 20 63 6c 61 75 73 65 2c 20 77 68 69 63 68  RE clause, which
2dba0 20 69 73 20 70 72 6f 63 65 73 73 65 64 20 62 65   is processed be
2dbb0 66 6f 72 65 0a 2a 2a 20 67 72 6f 75 70 69 6e 67  fore.** grouping
2dbc0 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  . For example, t
2dbd0 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
2dbe0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2dbf0 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20 61  <tables> WHERE a
2dc00 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48 41  =? GROUP BY b HA
2dc10 56 49 4e 47 20 62 3d 3f 20 41 4e 44 20 63 3d 3f  VING b=? AND c=?
2dc20 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 20 72 65  .**.** can be re
2dc30 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
2dc40 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
2dc50 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45  M <tables> WHERE
2dc60 20 61 3d 3f 20 41 4e 44 20 62 3d 3f 20 47 52 4f   a=? AND b=? GRO
2dc70 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 63  UP BY b HAVING c
2dc80 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20 74 65 72 6d 20  =?.**.** A term 
2dc90 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 65 78  of the HAVING ex
2dca0 70 72 65 73 73 69 6f 6e 20 69 73 20 65 6c 69 67  pression is elig
2dcb0 69 62 6c 65 20 66 6f 72 20 74 72 61 6e 73 66 65  ible for transfe
2dcc0 72 20 69 66 20 69 74 20 63 6f 6e 73 69 73 74 73  r if it consists
2dcd0 0a 2a 2a 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  .** entirely of 
2dce0 63 6f 6e 73 74 61 6e 74 73 20 61 6e 64 20 65 78  constants and ex
2dcf0 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
2dd00 72 65 20 61 6c 73 6f 20 47 52 4f 55 50 20 42 59  re also GROUP BY
2dd10 20 74 65 72 6d 73 20 74 68 61 74 0a 2a 2a 20 75   terms that.** u
2dd20 73 65 20 74 68 65 20 22 42 49 4e 41 52 59 22 20  se the "BINARY" 
2dd30 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
2dd40 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ce..*/.static vo
2dd50 69 64 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65  id havingToWhere
2dd60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2dd70 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 57 61  Select *p){.  Wa
2dd80 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20  lker sWalker;.  
2dd90 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b 65 72 2c  memset(&sWalker,
2dda0 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 61 6c 6b   0, sizeof(sWalk
2ddb0 65 72 29 29 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  er));.  sWalker.
2ddc0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
2ddd0 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72  .  sWalker.xExpr
2dde0 43 61 6c 6c 62 61 63 6b 20 3d 20 68 61 76 69 6e  Callback = havin
2ddf0 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 3b 0a  gToWhereExprCb;.
2de00 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70 53 65 6c    sWalker.u.pSel
2de10 65 63 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74  ect = p;.  sqlit
2de20 65 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c  e3WalkExpr(&sWal
2de30 6b 65 72 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  ker, p->pHaving)
2de40 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
2de50 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
2de60 73 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 26 26  sWalker.eCode &&
2de70 20 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54   (sqlite3SelectT
2de80 72 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30  race & 0x100)!=0
2de90 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
2dea0 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
2deb0 2c 70 2c 28 22 4d 6f 76 65 20 48 41 56 49 4e 47  ,p,("Move HAVING
2dec0 20 74 65 72 6d 73 20 69 6e 74 6f 20 57 48 45 52   terms into WHER
2ded0 45 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  E:\n"));.    sql
2dee0 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2def0 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
2df00 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
2df10 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2df20 20 74 68 65 20 70 54 68 69 73 20 65 6e 74 72 79   the pThis entry
2df30 20 6f 66 20 70 54 61 62 4c 69 73 74 20 69 73 20   of pTabList is 
2df40 61 20 73 65 6c 66 2d 6a 6f 69 6e 20 6f 66 20 61  a self-join of a
2df50 20 70 72 69 6f 72 20 76 69 65 77 2e 0a 2a 2a 20   prior view..** 
2df60 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 72  If it is, then r
2df70 65 74 75 72 6e 20 74 68 65 20 53 72 63 4c 69 73  eturn the SrcLis
2df80 74 5f 69 74 65 6d 20 66 6f 72 20 74 68 65 20 70  t_item for the p
2df90 72 69 6f 72 20 76 69 65 77 2e 20 20 49 66 20 69  rior view.  If i
2dfa0 74 20 69 73 20 6e 6f 74 2c 0a 2a 2a 20 74 68 65  t is not,.** the
2dfb0 6e 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  n return 0..*/.s
2dfc0 74 61 74 69 63 20 73 74 72 75 63 74 20 53 72 63  tatic struct Src
2dfd0 4c 69 73 74 5f 69 74 65 6d 20 2a 69 73 53 65 6c  List_item *isSel
2dfe0 66 4a 6f 69 6e 56 69 65 77 28 0a 20 20 53 72 63  fJoinView(.  Src
2dff0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
2e000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
2e010 72 63 68 20 66 6f 72 20 73 65 6c 66 2d 6a 6f 69  rch for self-joi
2e020 6e 73 20 69 6e 20 74 68 69 73 20 46 52 4f 4d 20  ns in this FROM 
2e030 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
2e040 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2e050 2a 70 54 68 69 73 20 20 20 2f 2a 20 53 65 61 72  *pThis   /* Sear
2e060 63 68 20 66 6f 72 20 70 72 69 6f 72 20 72 65 66  ch for prior ref
2e070 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 73  erence to this s
2e080 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20  ubquery */.){.  
2e090 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2e0a0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f  tem *pItem;.  fo
2e0b0 72 28 70 49 74 65 6d 20 3d 20 70 54 61 62 4c 69  r(pItem = pTabLi
2e0c0 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 54 68  st->a; pItem<pTh
2e0d0 69 73 3b 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  is; pItem++){.  
2e0e0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
2e0f0 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  lect==0 ) contin
2e100 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ue;.    if( pIte
2e110 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
2e120 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ne ) continue;. 
2e130 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e     if( pItem->zN
2e140 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ame==0 ) continu
2e150 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
2e160 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65 6d  e3_stricmp(pItem
2e170 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20 70 54 68  ->zDatabase, pTh
2e180 69 73 2d 3e 7a 44 61 74 61 62 61 73 65 29 21 3d  is->zDatabase)!=
2e190 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2e1a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
2e1b0 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61  ricmp(pItem->zNa
2e1c0 6d 65 2c 20 70 54 68 69 73 2d 3e 7a 4e 61 6d 65  me, pThis->zName
2e1d0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
2e1e0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2e1f0 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 0a  ExprCompare(0, .
2e200 20 20 20 20 20 20 20 20 20 20 70 54 68 69 73 2d            pThis-
2e210 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65  >pSelect->pWhere
2e220 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
2e230 2d 3e 70 57 68 65 72 65 2c 20 2d 31 29 20 0a 20  ->pWhere, -1) . 
2e240 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54     ){.      /* T
2e250 68 65 20 76 69 65 77 20 77 61 73 20 6d 6f 64 69  he view was modi
2e260 66 69 65 64 20 62 79 20 73 6f 6d 65 20 6f 74 68  fied by some oth
2e270 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  er optimization 
2e280 73 75 63 68 20 61 73 0a 20 20 20 20 20 20 2a 2a  such as.      **
2e290 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
2e2a0 72 6d 73 28 29 20 2a 2f 0a 20 20 20 20 20 20 63  rms() */.      c
2e2b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
2e2c0 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 3b     return pItem;
2e2d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2e2e0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
2e2f0 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50  E_COUNTOFVIEW_OP
2e300 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  TIMIZATION./*.**
2e310 20 41 74 74 65 6d 70 74 20 74 6f 20 74 72 61 6e   Attempt to tran
2e320 73 66 6f 72 6d 20 61 20 71 75 65 72 79 20 6f 66  sform a query of
2e330 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
2e340 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
2e350 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  *) FROM (SELECT 
2e360 78 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  x FROM t1 UNION 
2e370 41 4c 4c 20 53 45 4c 45 43 54 20 79 20 46 52 4f  ALL SELECT y FRO
2e380 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74 6f  M t2).**.** Into
2e390 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
2e3a0 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
2e3b0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 29  ount(*) FROM t1)
2e3c0 2b 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  +(SELECT count(*
2e3d0 29 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a  ) FROM t2).**.**
2e3e0 20 54 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74   The transformat
2e3f0 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69  ion only works i
2e400 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
2e410 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
2e420 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20  .**.**   *  The 
2e430 73 75 62 71 75 65 72 79 20 69 73 20 61 20 55 4e  subquery is a UN
2e440 49 4f 4e 20 41 4c 4c 20 6f 66 20 74 77 6f 20 6f  ION ALL of two o
2e450 72 20 6d 6f 72 65 20 74 65 72 6d 73 0a 2a 2a 20  r more terms.** 
2e460 20 20 2a 20 20 54 68 65 72 65 20 69 73 20 6e 6f    *  There is no
2e470 20 57 48 45 52 45 20 6f 72 20 47 52 4f 55 50 20   WHERE or GROUP 
2e480 42 59 20 6f 72 20 48 41 56 49 4e 47 20 63 6c 61  BY or HAVING cla
2e490 75 73 65 73 20 6f 6e 20 74 68 65 20 73 75 62 71  uses on the subq
2e4a0 75 65 72 69 65 73 0a 2a 2a 20 20 20 2a 20 20 54  ueries.**   *  T
2e4b0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
2e4c0 73 20 61 20 73 69 6d 70 6c 65 20 63 6f 75 6e 74  s a simple count
2e4d0 28 2a 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  (*).**.** Return
2e4e0 20 54 52 55 45 20 69 66 20 74 68 65 20 6f 70 74   TRUE if the opt
2e4f0 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 6e 64  imization is und
2e500 65 72 74 61 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74  ertaken..*/.stat
2e510 69 63 20 69 6e 74 20 63 6f 75 6e 74 4f 66 56 69  ic int countOfVi
2e520 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 50  ewOptimization(P
2e530 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
2e540 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65  lect *p){.  Sele
2e550 63 74 20 2a 70 53 75 62 2c 20 2a 70 50 72 69 6f  ct *pSub, *pPrio
2e560 72 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  r;.  Expr *pExpr
2e570 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 75 6e 74  ;.  Expr *pCount
2e580 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
2e590 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
2e5a0 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
2e5b0 74 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  te)==0 ) return 
2e5c0 30 3b 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  0;   /* This is 
2e5d0 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a  an aggregate */.
2e5e0 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
2e5f0 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
2e600 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
2e610 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 72 65      /* Single re
2e620 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  sult column */. 
2e630 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   pExpr = p->pELi
2e640 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
2e650 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
2e660 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
2e670 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2e680 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 69 73      /* Result is
2e690 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f   an aggregate */
2e6a0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
2e6b0 74 72 69 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e  tricmp(pExpr->u.
2e6c0 7a 54 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29 20  zToken,"count") 
2e6d0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
2e6e0 49 73 20 63 6f 75 6e 74 28 29 20 2a 2f 0a 20 20  Is count() */.  
2e6f0 69 66 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  if( pExpr->x.pLi
2e700 73 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st!=0 ) return 0
2e710 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e720 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 75    /* Must be cou
2e730 6e 74 28 2a 29 20 2a 2f 0a 20 20 69 66 28 20 70  nt(*) */.  if( p
2e740 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ->pSrc->nSrc!=1 
2e750 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
2e760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e770 4f 6e 65 20 74 61 62 6c 65 20 69 6e 20 46 52 4f  One table in FRO
2e780 4d 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70  M  */.  pSub = p
2e790 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
2e7a0 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 53 75 62  lect;.  if( pSub
2e7b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
2e7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e7d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2e7e0 20 46 52 4f 4d 20 69 73 20 61 20 73 75 62 71 75   FROM is a subqu
2e7f0 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ery */.  if( pSu
2e800 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72  b->pPrior==0 ) r
2e810 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
2e820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
2e830 73 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64  st be a compound
2e840 20 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20   ry */.  do{.   
2e850 20 69 66 28 20 70 53 75 62 2d 3e 6f 70 21 3d 54   if( pSub->op!=T
2e860 4b 5f 41 4c 4c 20 26 26 20 70 53 75 62 2d 3e 70  K_ALL && pSub->p
2e870 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30  Prior ) return 0
2e880 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 55 4e  ;  /* Must be UN
2e890 49 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20 20 69  ION ALL */.    i
2e8a0 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20  f( pSub->pWhere 
2e8b0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
2e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e8d0 20 2f 2a 20 4e 6f 20 57 48 45 52 45 20 63 6c 61   /* No WHERE cla
2e8e0 75 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  use */.    if( p
2e8f0 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
2e900 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 20 72  SF_Aggregate ) r
2e910 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20  eturn 0;     /* 
2e920 4e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  Not an aggregate
2e930 20 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70   */.    pSub = p
2e940 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 20 20 20  Sub->pPrior;    
2e950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70            /* Rep
2e970 65 61 74 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e  eat over compoun
2e980 64 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 70  d */.  }while( p
2e990 53 75 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Sub );..  /* If 
2e9a0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
2e9b0 69 6e 74 20 74 68 65 6e 20 69 74 20 69 73 20 4f  int then it is O
2e9c0 4b 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65  K to perform the
2e9d0 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
2e9e0 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  */..  db = pPars
2e9f0 65 2d 3e 64 62 3b 0a 20 20 70 43 6f 75 6e 74 20  e->db;.  pCount 
2ea00 3d 20 70 45 78 70 72 3b 0a 20 20 70 45 78 70 72  = pExpr;.  pExpr
2ea10 20 3d 20 30 3b 0a 20 20 70 53 75 62 20 3d 20 70   = 0;.  pSub = p
2ea20 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
2ea30 6c 65 63 74 3b 0a 20 20 70 2d 3e 70 53 72 63 2d  lect;.  p->pSrc-
2ea40 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20  >a[0].pSelect = 
2ea50 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  0;.  sqlite3SrcL
2ea60 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
2ea70 3e 70 53 72 63 29 3b 0a 20 20 70 2d 3e 70 53 72  >pSrc);.  p->pSr
2ea80 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
2ea90 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
2eaa0 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 2d 3e 70  db, sizeof(*p->p
2eab0 53 72 63 29 29 3b 0a 20 20 77 68 69 6c 65 28 20  Src));.  while( 
2eac0 70 53 75 62 20 29 7b 0a 20 20 20 20 45 78 70 72  pSub ){.    Expr
2ead0 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 70 50 72   *pTerm;.    pPr
2eae0 69 6f 72 20 3d 20 70 53 75 62 2d 3e 70 50 72 69  ior = pSub->pPri
2eaf0 6f 72 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 50  or;.    pSub->pP
2eb00 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 53  rior = 0;.    pS
2eb10 75 62 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ub->pNext = 0;. 
2eb20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67     pSub->selFlag
2eb30 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74  s |= SF_Aggregat
2eb40 65 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73 65 6c  e;.    pSub->sel
2eb50 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d  Flags &= ~SF_Com
2eb60 70 6f 75 6e 64 3b 0a 20 20 20 20 70 53 75 62 2d  pound;.    pSub-
2eb70 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b  >nSelectRow = 0;
2eb80 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2eb90 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2eba0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
2ebb0 20 20 70 54 65 72 6d 20 3d 20 70 50 72 69 6f 72    pTerm = pPrior
2ebc0 20 3f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   ? sqlite3ExprDu
2ebd0 70 28 64 62 2c 20 70 43 6f 75 6e 74 2c 20 30 29  p(db, pCount, 0)
2ebe0 20 3a 20 70 43 6f 75 6e 74 3b 0a 20 20 20 20 70   : pCount;.    p
2ebf0 53 75 62 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  Sub->pEList = sq
2ec00 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
2ec10 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 70  end(pParse, 0, p
2ec20 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d  Term);.    pTerm
2ec30 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2ec40 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43  pParse, TK_SELEC
2ec50 54 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  T, 0, 0);.    sq
2ec60 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65 6c  lite3PExprAddSel
2ec70 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 65 72  ect(pParse, pTer
2ec80 6d 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 69 66  m, pSub);.    if
2ec90 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
2eca0 20 20 20 20 70 45 78 70 72 20 3d 20 70 54 65 72      pExpr = pTer
2ecb0 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  m;.    }else{.  
2ecc0 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
2ecd0 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2ece0 20 54 4b 5f 50 4c 55 53 2c 20 70 54 65 72 6d 2c   TK_PLUS, pTerm,
2ecf0 20 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20   pExpr);.    }. 
2ed00 20 20 20 70 53 75 62 20 3d 20 70 50 72 69 6f 72     pSub = pPrior
2ed10 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 45 4c 69 73  ;.  }.  p->pELis
2ed20 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20  t->a[0].pExpr = 
2ed30 70 45 78 70 72 3b 0a 20 20 70 2d 3e 73 65 6c 46  pExpr;.  p->selF
2ed40 6c 61 67 73 20 26 3d 20 7e 53 46 5f 41 67 67 72  lags &= ~SF_Aggr
2ed50 65 67 61 74 65 3b 0a 0a 23 69 66 20 53 45 4c 45  egate;..#if SELE
2ed60 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
2ed70 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2ed80 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
2ed90 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
2eda0 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
2edb0 2c 70 2c 28 22 41 66 74 65 72 20 63 6f 75 6e 74  ,p,("After count
2edc0 2d 6f 66 2d 76 69 65 77 20 6f 70 74 69 6d 69 7a  -of-view optimiz
2edd0 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20  ation:\n"));.   
2ede0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2edf0 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2ee00 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
2ee10 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
2ee20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54   /* SQLITE_COUNT
2ee30 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54  OFVIEW_OPTIMIZAT
2ee40 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65  ION */../*.** Ge
2ee50 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
2ee60 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
2ee70 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68  ment given in th
2ee80 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a  e p argument.  .
2ee90 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
2eea0 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 61  s are returned a
2eeb0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
2eec0 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
2eed0 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d  ture..** See com
2eee0 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49  ments in sqliteI
2eef0 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72  nt.h for further
2ef00 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
2ef10 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2ef20 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
2ef30 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
2ef40 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
2ef50 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
2ef60 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
2ef70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
2ef80 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
2ef90 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
2efa0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
2efb0 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
2efc0 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
2efd0 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
2efe0 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
2eff0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
2f000 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
2f010 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
2f020 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
2f030 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2f040 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
2f050 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
2f060 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
2f070 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
2f080 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
2f090 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ded. */.  Select
2f0a0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
2f0b0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
2f0c0 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65  ith the query re
2f0d0 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
2f0e0 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
2f0f0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2f100 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
2f110 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
2f120 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d    /* Return from
2f130 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2f140 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a  in() */.  Vdbe *
2f150 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
2f160 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
2f170 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f  machine under co
2f180 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
2f190 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20  int isAgg;      
2f1a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2f1b0 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
2f1c0 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
2f1d0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2f1e0 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c  EList = 0;  /* L
2f1f0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
2f200 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
2f210 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
2f220 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
2f230 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
2f240 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
2f250 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
2f260 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2f270 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
2f280 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
2f290 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
2f2a0 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
2f2b0 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
2f2c0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
2f2d0 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20   *pHaving;      
2f2e0 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47     /* The HAVING
2f2f0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
2f300 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72   NULL */.  int r
2f310 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  c = 1;          
2f320 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
2f330 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66  turn from this f
2f340 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73  unction */.  Dis
2f350 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e  tinctCtx sDistin
2f360 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68  ct; /* Info on h
2f370 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44  ow to code the D
2f380 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
2f390 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f  */.  SortCtx sSo
2f3a0 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rt;         /* I
2f3b0 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f  nfo on how to co
2f3c0 64 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  de the ORDER BY 
2f3d0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49  clause */.  AggI
2f3e0 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20  nfo sAggInfo;   
2f3f0 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
2f400 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67  n used by aggreg
2f410 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  ate queries */. 
2f420 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20   int iEnd;      
2f430 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
2f440 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66  ss of the end of
2f450 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
2f460 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
2f470 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
2f480 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2f490 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  n */.  ExprList 
2f4a0 2a 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 20  *pMinMaxOrderBy 
2f4b0 3d 20 30 3b 20 20 2f 2a 20 41 64 64 65 64 20 4f  = 0;  /* Added O
2f4c0 52 44 45 52 20 42 59 20 66 6f 72 20 6d 69 6e 2f  RDER BY for min/
2f4d0 6d 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  max queries */. 
2f4e0 20 75 38 20 6d 69 6e 4d 61 78 46 6c 61 67 3b 20   u8 minMaxFlag; 
2f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f500 2f 2a 20 46 6c 61 67 20 66 6f 72 20 6d 69 6e 2f  /* Flag for min/
2f510 6d 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a 0a  max queries */..
2f520 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2f530 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e  MIT_EXPLAIN.  in
2f540 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  t iRestoreSelect
2f550 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  Id = pParse->iSe
2f560 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65  lectId;.  pParse
2f570 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50  ->iSelectId = pP
2f580 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
2f590 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  tId++;.#endif.. 
2f5a0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
2f5b0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
2f5c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2f5d0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
2f5e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
2f5f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
2f600 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
2f610 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
2f620 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
2f630 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65  eturn 1;.  memse
2f640 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20  t(&sAggInfo, 0, 
2f650 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29  sizeof(sAggInfo)
2f660 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
2f670 43 45 5f 45 4e 41 42 4c 45 44 0a 23 69 66 6e 64  CE_ENABLED.#ifnd
2f680 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
2f690 58 50 4c 41 49 4e 0a 20 20 70 2d 3e 69 53 65 6c  XPLAIN.  p->iSel
2f6a0 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  ectId = pParse->
2f6b0 69 53 65 6c 65 63 74 49 64 3b 0a 23 65 6e 64 69  iSelectId;.#endi
2f6c0 66 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  f.  SELECTTRACE(
2f6d0 31 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 62 65  1,pParse,p, ("be
2f6e0 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c  gin processing:\
2f6f0 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  n", pParse->iSel
2f700 65 63 74 49 64 29 29 3b 0a 20 20 69 66 28 20 73  ectId));.  if( s
2f710 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
2f720 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
2f730 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2f740 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2f750 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
2f760 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2f770 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2f780 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46  eDest!=SRT_DistF
2f790 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ifo );.  assert(
2f7a0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
2f7b0 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
2f7c0 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61  =SRT_Fifo );.  a
2f7d0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2f7e0 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2f7f0 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 51  eDest!=SRT_DistQ
2f800 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74  ueue );.  assert
2f810 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
2f820 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2f830 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20  !=SRT_Queue );. 
2f840 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
2f850 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
2f860 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74      assert(pDest
2f870 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69  ->eDest==SRT_Exi
2f880 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  sts || pDest->eD
2f890 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c  est==SRT_Union |
2f8a0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  | .           pD
2f8b0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2f8c0 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d  Except || pDest-
2f8d0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63  >eDest==SRT_Disc
2f8e0 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ard ||.         
2f8f0 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
2f900 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44  SRT_Queue  || pD
2f910 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2f920 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20  DistFifo ||.    
2f930 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
2f940 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
2f950 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ue || pDest->eDe
2f960 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20  st==SRT_Fifo);. 
2f970 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42     /* If ORDER B
2f980 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65  Y makes no diffe
2f990 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74  rence in the out
2f9a0 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72  put then neither
2f9b0 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53   does.    ** DIS
2f9c0 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20  TINCT so it can 
2f9d0 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20  be removed too. 
2f9e0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
2f9f0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
2fa00 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
2fa10 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
2fa20 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   0;.    p->selFl
2fa30 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
2fa40 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nct;.  }.  sqlit
2fa50 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
2fa60 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65  rse, p, 0);.  me
2fa70 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30 2c 20  mset(&sSort, 0, 
2fa80 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a  sizeof(sSort));.
2fa90 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2faa0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
2fab0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
2fac0 70 53 72 63 3b 0a 20 20 69 66 28 20 70 50 61 72  pSrc;.  if( pPar
2fad0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
2fae0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
2faf0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
2fb00 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  end;.  }.  asser
2fb10 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
2fb20 29 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d  );.  isAgg = (p-
2fb30 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
2fb40 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 23 69  ggregate)!=0;.#i
2fb50 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
2fb60 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
2fb70 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
2fb80 20 30 78 31 30 34 20 29 7b 0a 20 20 20 20 53 45   0x104 ){.    SE
2fb90 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 34 2c  LECTTRACE(0x104,
2fba0 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74 65  pParse,p, ("afte
2fbb0 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
2fbc0 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  n:\n"));.    sql
2fbd0 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2fbe0 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
2fbf0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
2fc00 74 20 61 20 70 6f 69 6e 74 65 72 20 74 68 65 20  t a pointer the 
2fc10 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74  VDBE under const
2fc20 72 75 63 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74  ruction, allocat
2fc30 69 6e 67 20 61 20 6e 65 77 20 56 44 42 45 20 69  ing a new VDBE i
2fc40 66 20 6f 6e 65 0a 20 20 2a 2a 20 64 6f 65 73 20  f one.  ** does 
2fc50 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
2fc60 74 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  t */.  v = sqlit
2fc70 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
2fc80 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
2fc90 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2fca0 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
2fcb0 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
2fcc0 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
2fcd0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
2fce0 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e, p);.  }..  /*
2fcf0 20 54 72 79 20 74 6f 20 76 61 72 69 6f 75 73 20   Try to various 
2fd00 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 28 66  optimizations (f
2fd10 6c 61 74 74 65 6e 69 6e 67 20 73 75 62 71 75 65  lattening subque
2fd20 72 69 65 73 2c 20 61 6e 64 20 73 74 72 65 6e 67  ries, and streng
2fd30 74 68 0a 20 20 2a 2a 20 72 65 64 75 63 74 69 6f  th.  ** reductio
2fd40 6e 20 6f 66 20 6a 6f 69 6e 20 6f 70 65 72 61 74  n of join operat
2fd50 6f 72 73 29 20 69 6e 20 74 68 65 20 46 52 4f 4d  ors) in the FROM
2fd60 20 63 6c 61 75 73 65 20 75 70 20 69 6e 74 6f 20   clause up into 
2fd70 74 68 65 20 6d 61 69 6e 20 71 75 65 72 79 0a 20  the main query. 
2fd80 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
2fd90 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
2fda0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
2fdb0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
2fdc0 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20  IEW).  for(i=0; 
2fdd0 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c  !p->pPrior && i<
2fde0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
2fdf0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
2fe00 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2fe10 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
2fe20 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65  ->a[i];.    Sele
2fe30 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d  ct *pSub = pItem
2fe40 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 54  ->pSelect;.    T
2fe50 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74  able *pTab = pIt
2fe60 65 6d 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 2f  em->pTab;..    /
2fe70 2a 20 43 6f 6e 76 65 72 74 20 4c 45 46 54 20 4a  * Convert LEFT J
2fe80 4f 49 4e 20 69 6e 74 6f 20 4a 4f 49 4e 20 69 66  OIN into JOIN if
2fe90 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73   there are terms
2fea0 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
2feb0 62 6c 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ble.    ** of th
2fec0 65 20 4c 45 46 54 20 4a 4f 49 4e 20 75 73 65 64  e LEFT JOIN used
2fed0 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
2fee0 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ause..    */.   
2fef0 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e   if( (pItem->fg.
2ff00 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
2ff10 46 54 29 21 3d 30 0a 20 20 20 20 20 26 26 20 73  FT)!=0.     && s
2ff20 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
2ff30 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 70 2d 3e 70  sNonNullRow(p->p
2ff40 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43  Where, pItem->iC
2ff50 75 72 73 6f 72 29 0a 20 20 20 20 20 26 26 20 4f  ursor).     && O
2ff60 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
2ff70 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 69  ed(db, SQLITE_Si
2ff80 6d 70 6c 69 66 79 4a 6f 69 6e 29 0a 20 20 20 20  mplifyJoin).    
2ff90 29 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  ){.      SELECTT
2ffa0 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
2ffb0 65 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  e,p,.           
2ffc0 20 20 20 20 20 28 22 4c 45 46 54 2d 4a 4f 49 4e       ("LEFT-JOIN
2ffd0 20 73 69 6d 70 6c 69 66 69 65 73 20 74 6f 20 4a   simplifies to J
2ffe0 4f 49 4e 20 6f 6e 20 74 65 72 6d 20 25 64 5c 6e  OIN on term %d\n
2fff0 22 2c 69 29 29 3b 0a 20 20 20 20 20 20 70 49 74  ",i));.      pIt
30000 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
30010 26 3d 20 7e 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  &= ~(JT_LEFT|JT_
30020 4f 55 54 45 52 29 3b 0a 20 20 20 20 20 20 75 6e  OUTER);.      un
30030 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70  setJoinExpr(p->p
30040 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43  Where, pItem->iC
30050 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  ursor);.    }.. 
30060 20 20 20 2f 2a 20 4e 6f 20 66 75 74 68 65 72 20     /* No futher 
30070 61 63 74 69 6f 6e 20 69 66 20 74 68 69 73 20 74  action if this t
30080 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  erm of the FROM 
30090 63 6c 61 75 73 65 20 69 73 20 6e 6f 20 61 20 73  clause is no a s
300a0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 69  ubquery */.    i
300b0 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e  f( pSub==0 ) con
300c0 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43  tinue;..    /* C
300d0 61 74 63 68 20 6d 69 73 6d 61 74 63 68 20 69 6e  atch mismatch in
300e0 20 74 68 65 20 64 65 63 6c 61 72 65 64 20 63 6f   the declared co
300f0 6c 75 6d 6e 73 20 6f 66 20 61 20 76 69 65 77 20  lumns of a view 
30100 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
30110 66 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73  f.    ** columns
30120 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 6f   in the SELECT o
30130 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 20  n the RHS */.   
30140 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21   if( pTab->nCol!
30150 3d 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e  =pSub->pEList->n
30160 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71  Expr ){.      sq
30170 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
30180 61 72 73 65 2c 20 22 65 78 70 65 63 74 65 64 20  arse, "expected 
30190 25 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27  %d columns for '
301a0 25 73 27 20 62 75 74 20 67 6f 74 20 25 64 22 2c  %s' but got %d",
301b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
301c0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f         pTab->nCo
301d0 6c 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  l, pTab->zName, 
301e0 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSub->pEList->nE
301f0 78 70 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  xpr);.      goto
30200 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
30210 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f   }..    /* Do no
30220 74 20 74 72 79 20 74 6f 20 66 6c 61 74 74 65 6e  t try to flatten
30230 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 73 75   an aggregate su
30240 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20  bquery..    **. 
30250 20 20 20 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67     ** Flattening
30260 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 73 75   an aggregate su
30270 62 71 75 65 72 79 20 69 73 20 6f 6e 6c 79 20 70  bquery is only p
30280 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20 6f  ossible if the o
30290 75 74 65 72 20 71 75 65 72 79 0a 20 20 20 20 2a  uter query.    *
302a0 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  * is not a join.
302b0 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 75 74    But if the out
302c0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
302d0 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65  a join, then the
302e0 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a   subquery.    **
302f0 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65   will be impleme
30300 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75  nted as a co-rou
30310 74 69 6e 65 20 61 6e 64 20 74 68 65 72 65 20 69  tine and there i
30320 73 20 6e 6f 20 61 64 76 61 6e 74 61 67 65 20 74  s no advantage t
30330 6f 0a 20 20 20 20 2a 2a 20 66 6c 61 74 74 65 6e  o.    ** flatten
30340 69 6e 67 20 69 6e 20 74 68 61 74 20 63 61 73 65  ing in that case
30350 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
30360 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
30370 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
30380 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
30390 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
303a0 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
303b0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
303c0 6f 75 74 65 72 20 71 75 65 72 79 20 63 6f 6e 74  outer query cont
303d0 61 69 6e 73 20 61 20 22 63 6f 6d 70 6c 65 78 22  ains a "complex"
303e0 20 72 65 73 75 6c 74 20 73 65 74 20 28 74 68 61   result set (tha
303f0 74 20 69 73 2c 0a 20 20 20 20 2a 2a 20 69 66 20  t is,.    ** if 
30400 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
30410 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
30420 79 20 75 73 65 73 20 66 75 6e 63 74 69 6f 6e 73  y uses functions
30430 20 6f 72 20 73 75 62 71 75 65 72 69 65 73 29 0a   or subqueries).
30440 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68      ** and if th
30450 65 20 73 75 62 71 75 65 72 79 20 63 6f 6e 74 61  e subquery conta
30460 69 6e 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ins an ORDER BY 
30470 63 6c 61 75 73 65 20 61 6e 64 20 69 66 0a 20 20  clause and if.  
30480 20 20 2a 2a 20 69 74 20 77 69 6c 6c 20 62 65 20    ** it will be 
30490 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
304a0 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 74 68 65   co-routine, the
304b0 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e  n do not flatten
304c0 2e 20 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 72  .  This.    ** r
304d0 65 73 74 72 69 63 74 69 6f 6e 20 61 6c 6c 6f 77  estriction allow
304e0 73 20 53 51 4c 20 63 6f 6e 73 74 72 75 63 74 73  s SQL constructs
304f0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
30500 2a 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43  **.    **  SELEC
30510 54 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63  T expensive_func
30520 74 69 6f 6e 28 78 29 0a 20 20 20 20 2a 2a 20 20  tion(x).    **  
30530 20 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78    FROM (SELECT x
30540 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20   FROM tab ORDER 
30550 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a  BY y LIMIT 10);.
30560 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
30570 65 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63  e expensive_func
30580 74 69 6f 6e 28 29 20 69 73 20 6f 6e 6c 79 20 63  tion() is only c
30590 6f 6d 70 75 74 65 64 20 6f 6e 20 74 68 65 20 31  omputed on the 1
305a0 30 20 72 6f 77 73 20 74 68 61 74 0a 20 20 20 20  0 rows that.    
305b0 2a 2a 20 61 72 65 20 6f 75 74 70 75 74 2c 20 72  ** are output, r
305c0 61 74 68 65 72 20 74 68 61 6e 20 65 76 65 72 79  ather than every
305d0 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c   row of the tabl
305e0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
305f0 20 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   The requirement
30600 20 74 68 61 74 20 74 68 65 20 6f 75 74 65 72 20   that the outer 
30610 71 75 65 72 79 20 68 61 76 65 20 61 20 63 6f 6d  query have a com
30620 70 6c 65 78 20 72 65 73 75 6c 74 20 73 65 74 0a  plex result set.
30630 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 74 68 61      ** means tha
30640 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 64 6f 65  t flattening doe
30650 73 20 6f 63 63 75 72 20 6f 6e 20 73 69 6d 70 6c  s occur on simpl
30660 65 72 20 53 51 4c 20 63 6f 6e 73 74 72 61 69 6e  er SQL constrain
30670 74 73 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a  ts without.    *
30680 2a 20 74 68 65 20 65 78 70 65 6e 73 69 76 65 5f  * the expensive_
30690 66 75 6e 63 74 69 6f 6e 28 29 20 6c 69 6b 65 3a  function() like:
306a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
306b0 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53  SELECT x FROM (S
306c0 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
306d0 20 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49   ORDER BY y LIMI
306e0 54 20 31 30 29 3b 0a 20 20 20 20 2a 2f 0a 20 20  T 10);.    */.  
306f0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64    if( pSub->pOrd
30700 65 72 42 79 21 3d 30 0a 20 20 20 20 20 26 26 20  erBy!=0.     && 
30710 69 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d  i==0.     && (p-
30720 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43  >selFlags & SF_C
30730 6f 6d 70 6c 65 78 52 65 73 75 6c 74 29 21 3d 30  omplexResult)!=0
30740 0a 20 20 20 20 20 26 26 20 28 70 54 61 62 4c 69  .     && (pTabLi
30750 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20  st->nSrc==1.    
30760 20 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73       || (pTabLis
30770 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74  t->a[1].fg.joint
30780 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  ype&(JT_LEFT|JT_
30790 43 52 4f 53 53 29 29 21 3d 30 29 0a 20 20 20 20  CROSS))!=0).    
307a0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
307b0 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  e;.    }..    if
307c0 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  ( flattenSubquer
307d0 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20  y(pParse, p, i, 
307e0 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20  isAgg) ){.      
307f0 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79  /* This subquery
30800 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64   can be absorbed
30810 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74   into its parent
30820 2e 20 2a 2f 0a 20 20 20 20 20 20 69 20 3d 20 2d  . */.      i = -
30830 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  1;.    }.    pTa
30840 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
30850 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
30860 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
30870 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
30880 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f   if( !IgnorableO
30890 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
308a0 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72  .      sSort.pOr
308b0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
308c0 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  rBy;.    }.  }.#
308d0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
308e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
308f0 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20  UND_SELECT.  /* 
30900 48 61 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e 64 20  Handle compound 
30910 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
30920 73 20 75 73 69 6e 67 20 74 68 65 20 73 65 70 61  s using the sepa
30930 72 61 74 65 20 6d 75 6c 74 69 53 65 6c 65 63 74  rate multiSelect
30940 28 29 0a 20 20 2a 2a 20 70 72 6f 63 65 64 75 72  ().  ** procedur
30950 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  e..  */.  if( p-
30960 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72  >pPrior ){.    r
30970 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  c = multiSelect(
30980 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
30990 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
309a0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 53  CE_ENABLED.    S
309b0 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 2c 70  ELECTTRACE(0x1,p
309c0 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f  Parse,p,("end co
309d0 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72  mpound-select pr
309e0 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20  ocessing\n"));. 
309f0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69     if( pParse->i
30a00 53 65 6c 65 63 74 49 64 3d 3d 30 20 26 26 20 28  SelectId==0 && (
30a10 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
30a20 63 65 20 26 20 30 78 32 30 30 30 29 21 3d 30 20  ce & 0x2000)!=0 
30a30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
30a40 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
30a50 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  , p, 0);.    }.#
30a60 65 6e 64 69 66 0a 20 20 20 20 65 78 70 6c 61 69  endif.    explai
30a70 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50 61 72  nSetInteger(pPar
30a80 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69  se->iSelectId, i
30a90 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29  RestoreSelectId)
30aa0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
30ab0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
30ac0 2a 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20  * For each term 
30ad0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
30ae0 73 65 2c 20 64 6f 20 74 77 6f 20 74 68 69 6e 67  se, do two thing
30af0 73 3a 0a 20 20 2a 2a 20 28 31 29 20 41 75 74 68  s:.  ** (1) Auth
30b00 6f 72 69 7a 65 64 20 75 6e 72 65 66 65 72 65 6e  orized unreferen
30b10 63 65 64 20 74 61 62 6c 65 73 0a 20 20 2a 2a 20  ced tables.  ** 
30b20 28 32 29 20 47 65 6e 65 72 61 74 65 20 63 6f 64  (2) Generate cod
30b30 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
30b40 65 72 69 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72  eries.  */.  for
30b50 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
30b60 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
30b70 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
30b80 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
30b90 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a  pTabList->a[i];.
30ba0 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
30bb0 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  est;.    Select 
30bc0 2a 70 53 75 62 3b 0a 23 69 66 20 21 64 65 66 69  *pSub;.#if !defi
30bd0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
30be0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
30bf0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
30c00 54 5f 56 49 45 57 29 0a 20 20 20 20 63 6f 6e 73  T_VIEW).    cons
30c10 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
30c20 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69  thContext;.#endi
30c30 66 0a 0a 20 20 20 20 2f 2a 20 49 73 73 75 65 20  f..    /* Issue 
30c40 53 51 4c 49 54 45 5f 52 45 41 44 20 61 75 74 68  SQLITE_READ auth
30c50 6f 72 69 7a 61 74 69 6f 6e 73 20 77 69 74 68 20  orizations with 
30c60 61 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61  a fake column na
30c70 6d 65 20 66 6f 72 20 61 6e 79 0a 20 20 20 20 2a  me for any.    *
30c80 2a 20 74 61 62 6c 65 73 20 74 68 61 74 20 61 72  * tables that ar
30c90 65 20 72 65 66 65 72 65 6e 63 65 64 20 62 75 74  e referenced but
30ca0 20 66 72 6f 6d 20 77 68 69 63 68 20 6e 6f 20 76   from which no v
30cb0 61 6c 75 65 73 20 61 72 65 20 65 78 74 72 61 63  alues are extrac
30cc0 74 65 64 2e 0a 20 20 20 20 2a 2a 20 45 78 61 6d  ted..    ** Exam
30cd0 70 6c 65 73 20 6f 66 20 77 68 65 72 65 20 74 68  ples of where th
30ce0 65 73 65 20 6b 69 6e 64 73 20 6f 66 20 6e 75 6c  ese kinds of nul
30cf0 6c 20 53 51 4c 49 54 45 5f 52 45 41 44 20 61 75  l SQLITE_READ au
30d00 74 68 6f 72 69 7a 61 74 69 6f 6e 73 0a 20 20 20  thorizations.   
30d10 20 2a 2a 20 77 6f 75 6c 64 20 6f 63 63 75 72 3a   ** would occur:
30d20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
30d30 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
30d40 2a 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d  *) FROM t1;   --
30d50 20 53 51 4c 49 54 45 5f 52 45 41 44 20 74 31 2e   SQLITE_READ t1.
30d60 22 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45  "".    **     SE
30d70 4c 45 43 54 20 74 31 2e 2a 20 46 52 4f 4d 20 74  LECT t1.* FROM t
30d80 31 2c 20 74 32 3b 20 20 20 2d 2d 20 53 51 4c 49  1, t2;   -- SQLI
30d90 54 45 5f 52 45 41 44 20 74 32 2e 22 22 0a 20 20  TE_READ t2."".  
30da0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
30db0 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  fake column name
30dc0 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
30dd0 69 6e 67 2e 20 20 49 74 20 69 73 20 70 6f 73 73  ing.  It is poss
30de0 69 62 6c 65 20 66 6f 72 20 61 20 74 61 62 6c 65  ible for a table
30df0 20 74 6f 0a 20 20 20 20 2a 2a 20 68 61 76 65 20   to.    ** have 
30e00 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 62  a column named b
30e10 79 20 74 68 65 20 65 6d 70 74 79 20 73 74 72 69  y the empty stri
30e20 6e 67 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73  ng, in which cas
30e30 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  e there is no wa
30e40 79 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 74  y to.    ** dist
30e50 69 6e 67 75 69 73 68 20 62 65 74 77 65 65 6e 20  inguish between 
30e60 61 6e 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20  an unreferenced 
30e70 74 61 62 6c 65 20 61 6e 64 20 61 6e 20 61 63 74  table and an act
30e80 75 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ual reference to
30e90 20 74 68 65 0a 20 20 20 20 2a 2a 20 22 22 20 63   the.    ** "" c
30ea0 6f 6c 75 6d 6e 2e 20 54 68 65 20 6f 72 69 67 69  olumn. The origi
30eb0 6e 61 6c 20 64 65 73 69 67 6e 20 77 61 73 20 66  nal design was f
30ec0 6f 72 20 74 68 65 20 66 61 6b 65 20 63 6f 6c 75  or the fake colu
30ed0 6d 6e 20 6e 61 6d 65 20 74 6f 20 62 65 20 61 20  mn name to be a 
30ee0 4e 55 4c 4c 2c 0a 20 20 20 20 2a 2a 20 77 68 69  NULL,.    ** whi
30ef0 63 68 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 6d  ch would be unam
30f00 62 69 67 75 6f 75 73 2e 20 20 42 75 74 20 6c 65  biguous.  But le
30f10 67 61 63 79 20 61 75 74 68 6f 72 69 7a 61 74 69  gacy authorizati
30f20 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 20 6d 69 67  on callbacks mig
30f30 68 74 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65  ht.    ** assume
30f40 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
30f50 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64   is non-NULL and
30f60 20 73 65 67 66 61 75 6c 74 2e 20 20 54 68 65 20   segfault.  The 
30f70 75 73 65 20 6f 66 20 61 6e 20 65 6d 70 74 79 0a  use of an empty.
30f80 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 20 66 6f      ** string fo
30f90 72 20 74 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d  r the fake colum
30fa0 6e 20 6e 61 6d 65 20 73 65 65 6d 73 20 73 61 66  n name seems saf
30fb0 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
30fc0 66 28 20 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  f( pItem->colUse
30fd0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  d==0 ){.      sq
30fe0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
30ff0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45  Parse, SQLITE_RE
31000 41 44 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  AD, pItem->zName
31010 2c 20 22 22 2c 20 70 49 74 65 6d 2d 3e 7a 44 61  , "", pItem->zDa
31020 74 61 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 0a  tabase);.    }..
31030 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
31040 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
31050 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
31060 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
31070 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
31080 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
31090 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
310a0 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20   FROM clause.   
310b0 20 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70   */.    pSub = p
310c0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Item->pSelect;. 
310d0 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29     if( pSub==0 )
310e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
310f0 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65  /* Sometimes the
31100 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71   code for a subq
31110 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e  uery will be gen
31120 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e  erated more than
31130 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66  .    ** once, if
31140 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
31150 20 70 61 72 74 20 6f 66 20 74 68 65 20 57 48 45   part of the WHE
31160 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c  RE clause in a L
31170 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a  EFT JOIN,.    **
31180 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49   for example.  I
31190 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20  n that case, do 
311a0 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20 74  not regenerate t
311b0 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66  he code to manif
311c0 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65  est.    ** a vie
311d0 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74  w or the co-rout
311e0 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ine to implement
311f0 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 66 69   a view.  The fi
31200 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20  rst instance.   
31210 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e   ** is sufficien
31220 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73 75  t, though the su
31230 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69  broutine to mani
31240 66 65 73 74 20 74 68 65 20 76 69 65 77 20 64 6f  fest the view do
31250 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74  es need.    ** t
31260 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61  o be invoked aga
31270 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  in. */.    if( p
31280 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
31290 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  b ){.      if( p
312a0 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
312b0 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20  utine==0 ){.    
312c0 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 72 6f      /* The subro
312d0 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6e 69 66  utine that manif
312e0 65 73 74 73 20 74 68 65 20 76 69 65 77 20 6d 69  ests the view mi
312f0 67 68 74 20 62 65 20 61 20 6f 6e 65 2d 74 69 6d  ght be a one-tim
31300 65 20 72 6f 75 74 69 6e 65 2c 0a 20 20 20 20 20  e routine,.     
31310 20 20 20 2a 2a 20 6f 72 20 69 74 20 6d 69 67 68     ** or it migh
31320 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 72  t need to be rer
31330 75 6e 20 6f 6e 20 65 61 63 68 20 69 74 65 72 61  un on each itera
31340 74 69 6f 6e 20 62 65 63 61 75 73 65 20 69 74 0a  tion because it.
31350 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 63 6f 64          ** encod
31360 65 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  es a correlated 
31370 73 75 62 71 75 65 72 79 2e 20 2a 2f 0a 20 20 20  subquery. */.   
31380 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
31390 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
313a0 76 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  v, pItem->addrFi
313b0 6c 6c 53 75 62 29 2d 3e 6f 70 63 6f 64 65 3d 3d  llSub)->opcode==
313c0 4f 50 5f 4f 6e 63 65 20 29 3b 0a 20 20 20 20 20  OP_Once );.     
313d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
313e0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
313f0 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
31400 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  rn, pItem->addrF
31410 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 7d  illSub);.      }
31420 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
31430 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
31440 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e  ncrement Parse.n
31450 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65  Height by the he
31460 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67  ight of the larg
31470 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  est expression. 
31480 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72     ** tree refer
31490 72 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20  red to by this, 
314a0 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63  the parent selec
314b0 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c  t. The child sel
314c0 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63  ect.    ** may c
314d0 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f  ontain expressio
314e0 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f  n trees of at mo
314f0 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54  st.    ** (SQLIT
31500 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
31510 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20  -Parse.nHeight) 
31520 68 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20  height. This is 
31530 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72  a bit.    ** mor
31540 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74  e conservative t
31550 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62  han necessary, b
31560 75 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74  ut much easier t
31570 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20  han enforcing.  
31580 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69    ** an exact li
31590 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mit..    */.    
315a0 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
315b0 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  += sqlite3Select
315c0 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a  ExprHeight(p);..
315d0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 6f 70 69      /* Make copi
315e0 65 73 20 6f 66 20 63 6f 6e 73 74 61 6e 74 20 57  es of constant W
315f0 48 45 52 45 2d 63 6c 61 75 73 65 20 74 65 72 6d  HERE-clause term
31600 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  s in the outer q
31610 75 65 72 79 20 64 6f 77 6e 0a 20 20 20 20 2a 2a  uery down.    **
31620 20 69 6e 73 69 64 65 20 74 68 65 20 73 75 62 71   inside the subq
31630 75 65 72 79 2e 20 20 54 68 69 73 20 63 61 6e 20  uery.  This can 
31640 68 65 6c 70 20 74 68 65 20 73 75 62 71 75 65 72  help the subquer
31650 79 20 74 6f 20 72 75 6e 20 6d 6f 72 65 20 65 66  y to run more ef
31660 66 69 63 69 65 6e 74 6c 79 2e 0a 20 20 20 20 2a  ficiently..    *
31670 2f 0a 20 20 20 20 69 66 28 20 4f 70 74 69 6d 69  /.    if( Optimi
31680 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
31690 2c 20 53 51 4c 49 54 45 5f 50 75 73 68 44 6f 77  , SQLITE_PushDow
316a0 6e 29 0a 20 20 20 20 20 26 26 20 70 75 73 68 44  n).     && pushD
316b0 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50  ownWhereTerms(pP
316c0 61 72 73 65 2c 20 70 53 75 62 2c 20 70 2d 3e 70  arse, pSub, p->p
316d0 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43  Where, pItem->iC
316e0 75 72 73 6f 72 2c 0a 20 20 20 20 20 20 20 20 20  ursor,.         
316f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31700 20 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69    (pItem->fg.joi
31710 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
31720 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 23 69 66  )!=0).    ){.#if
31730 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
31740 42 4c 45 44 0a 20 20 20 20 20 20 69 66 28 20 73  BLED.      if( s
31750 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
31760 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
31770 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
31780 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
31790 28 22 41 66 74 65 72 20 57 48 45 52 45 2d 63 6c  ("After WHERE-cl
317a0 61 75 73 65 20 70 75 73 68 2d 64 6f 77 6e 3a 5c  ause push-down:\
317b0 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  n"));.        sq
317c0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
317d0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
317e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
317f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 53 45   }else{.      SE
31800 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
31810 70 50 61 72 73 65 2c 70 2c 28 22 50 75 73 68 2d  pParse,p,("Push-
31820 64 6f 77 6e 20 6e 6f 74 20 70 6f 73 73 69 62 6c  down not possibl
31830 65 5c 6e 22 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  e\n"));.    }.. 
31840 20 20 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e     zSavedAuthCon
31850 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a  text = pParse->z
31860 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20  AuthContext;.   
31870 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
31880 6e 74 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a  ntext = pItem->z
31890 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  Name;..    /* Ge
318a0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 69  nerate code to i
318b0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 75 62  mplement the sub
318c0 71 75 65 72 79 0a 20 20 20 20 2a 2a 0a 20 20 20  query.    **.   
318d0 20 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   ** The subquery
318e0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
318f0 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  as a co-routine 
31900 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
31910 69 73 0a 20 20 20 20 2a 2a 20 67 75 61 72 61 6e  is.    ** guaran
31920 74 65 65 64 20 74 6f 20 62 65 20 74 68 65 20 6f  teed to be the o
31930 75 74 65 72 20 6c 6f 6f 70 20 28 73 6f 20 74 68  uter loop (so th
31940 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 6e  at it does not n
31950 65 65 64 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eed to be.    **
31960 20 63 6f 6d 70 75 74 65 64 20 6d 6f 72 65 20 74   computed more t
31970 68 61 6e 20 6f 6e 63 65 29 0a 20 20 20 20 2a 2a  han once).    **
31980 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 41 72  .    ** TODO: Ar
31990 65 20 74 68 65 72 65 20 6f 74 68 65 72 20 72 65  e there other re
319a0 61 73 6f 6e 73 20 62 65 73 69 64 65 20 28 31 29  asons beside (1)
319b0 20 74 6f 20 75 73 65 20 61 20 63 6f 2d 72 6f 75   to use a co-rou
319c0 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 6d 70 6c  tine.    ** impl
319d0 65 6d 65 6e 74 61 74 69 6f 6e 3f 0a 20 20 20 20  ementation?.    
319e0 2a 2f 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 0a  */.    if( i==0.
319f0 20 20 20 20 20 26 26 20 28 70 54 61 62 4c 69 73       && (pTabLis
31a00 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20  t->nSrc==1.     
31a10 20 20 20 20 20 20 20 7c 7c 20 28 70 54 61 62 4c         || (pTabL
31a20 69 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69  ist->a[1].fg.joi
31a30 6e 74 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a  ntype&(JT_LEFT|J
31a40 54 5f 43 52 4f 53 53 29 29 21 3d 30 29 20 20 2f  T_CROSS))!=0)  /
31a50 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 29 7b 0a  * (1) */.    ){.
31a60 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65        /* Impleme
31a70 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  nt a co-routine 
31a80 74 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e  that will return
31a90 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
31aa0 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
31ab0 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68    ** set on each
31ac0 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20   invocation..   
31ad0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
31ae0 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
31af0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
31b00 28 76 29 2b 31 3b 0a 20 20 20 20 20 0a 20 20 20  (v)+1;.     .   
31b10 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74     pItem->regRet
31b20 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
31b30 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
31b40 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
31b50 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
31b60 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  e, pItem->regRet
31b70 75 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70 29  urn, 0, addrTop)
31b80 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
31b90 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
31ba0 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
31bb0 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ));.      pItem-
31bc0 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 61  >addrFillSub = a
31bd0 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73 71  ddrTop;.      sq
31be0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
31bf0 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43  nit(&dest, SRT_C
31c00 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d  oroutine, pItem-
31c10 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
31c20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
31c30 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c  eger(pItem->iSel
31c40 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73  ectId, (u8)pPars
31c50 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
31c60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
31c70 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
31c80 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  Sub, &dest);.   
31c90 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e     pItem->pTab->
31ca0 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75  nRowLogEst = pSu
31cb0 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  b->nSelectRow;. 
31cc0 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 76       pItem->fg.v
31cd0 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b  iaCoroutine = 1;
31ce0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
31cf0 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e 69  gResult = dest.i
31d00 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Sdst;.      sqli
31d10 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
31d20 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d 3e 72 65  ine(v, pItem->re
31d30 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
31d40 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
31d50 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d 31  ere(v, addrTop-1
31d60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
31d70 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
31d80 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  e(pParse);.    }
31d90 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47  else{.      /* G
31da0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
31db0 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 66  tine that will f
31dc0 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ill an ephemeral
31dd0 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20 20   table with.    
31de0 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74    ** the content
31df0 20 6f 66 20 74 68 69 73 20 73 75 62 71 75 65 72   of this subquer
31e00 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  y.  pItem->addrF
31e10 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e  illSub will poin
31e20 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  t.      ** to th
31e30 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
31e40 20 67 65 6e 65 72 61 74 65 64 20 73 75 62 72 6f   generated subro
31e50 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72  utine.  pItem->r
31e60 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20 2a  egReturn.      *
31e70 2a 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20  * is a register 
31e80 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c  allocated to hol
31e90 64 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  d the subroutine
31ea0 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 0a   return address.
31eb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
31ec0 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20  nt topAddr;.    
31ed0 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d    int onceAddr =
31ee0 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65   0;.      int re
31ef0 74 41 64 64 72 3b 0a 20 20 20 20 20 20 73 74 72  tAddr;.      str
31f00 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
31f10 20 2a 70 50 72 69 6f 72 3b 0a 0a 20 20 20 20 20   *pPrior;..     
31f20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
31f30 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29  addrFillSub==0 )
31f40 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
31f50 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
31f60 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
31f70 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74   topAddr = sqlit
31f80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
31f90 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
31fa0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
31fb0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61  ;.      pItem->a
31fc0 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70  ddrFillSub = top
31fd0 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20 69 66  Addr+1;.      if
31fe0 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f  ( pItem->fg.isCo
31ff0 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20  rrelated==0 ){. 
32000 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
32010 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
32020 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64 20   correlated and 
32030 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  if we are not in
32040 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20 20  side of.        
32050 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74 68  ** a trigger, th
32060 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  en we only need 
32070 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76  to compute the v
32080 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62 71  alue of the subq
32090 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  uery.        ** 
320a0 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  once. */.       
320b0 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69   onceAddr = sqli
320c0 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
320d0 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43   OP_Once); VdbeC
320e0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
320f0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
32100 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
32110 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d   \"%s\"", pItem-
32120 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
32130 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32140 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d       VdbeNoopCom
32150 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
32160 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
32170 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
32180 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e));.      }.   
32190 20 20 20 70 50 72 69 6f 72 20 3d 20 69 73 53 65     pPrior = isSe
321a0 6c 66 4a 6f 69 6e 56 69 65 77 28 70 54 61 62 4c  lfJoinView(pTabL
321b0 69 73 74 2c 20 70 49 74 65 6d 29 3b 0a 20 20 20  ist, pItem);.   
321c0 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 7b     if( pPrior ){
321d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
321e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
321f0 5f 4f 70 65 6e 44 75 70 2c 20 70 49 74 65 6d 2d  _OpenDup, pItem-
32200 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 69 6f 72  >iCursor, pPrior
32210 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
32220 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
32230 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65  teger(pItem->iSe
32240 6c 65 63 74 49 64 2c 20 70 50 72 69 6f 72 2d 3e  lectId, pPrior->
32250 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  iSelectId);.    
32260 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
32270 6f 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29  or->pSelect!=0 )
32280 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e  ;.        pSub->
32290 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72  nSelectRow = pPr
322a0 69 6f 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 6e 53  ior->pSelect->nS
322b0 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
322c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
322d0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
322e0 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
322f0 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d  EphemTab, pItem-
32300 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
32310 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
32320 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c  eger(pItem->iSel
32330 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73  ectId, (u8)pPars
32340 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
32350 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
32360 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
32370 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
32380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74       }.      pIt
32390 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  em->pTab->nRowLo
323a0 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65  gEst = pSub->nSe
323b0 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69  lectRow;.      i
323c0 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20 73 71  f( onceAddr ) sq
323d0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
323e0 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a  e(v, onceAddr);.
323f0 20 20 20 20 20 20 72 65 74 41 64 64 72 20 3d 20        retAddr = 
32400 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
32410 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
32420 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
32430 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
32440 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73  ment((v, "end %s
32450 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
32460 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
32470 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
32480 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c 20 72  P1(v, topAddr, r
32490 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73  etAddr);.      s
324a0 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
324b0 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b  egCache(pParse);
324c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
324d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
324e0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
324f0 64 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  d;.    pParse->n
32500 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65  Height -= sqlite
32510 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
32520 74 28 70 29 3b 0a 20 20 20 20 70 50 61 72 73 65  t(p);.    pParse
32530 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
32540 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65   zSavedAuthConte
32550 78 74 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  xt;.#endif.  }..
32560 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 65 6c 65    /* Various ele
32570 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 53 45 4c  ments of the SEL
32580 45 43 54 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  ECT copied into 
32590 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20  local variables 
325a0 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76 65 6e 69  for.  ** conveni
325b0 65 6e 63 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74  ence */.  pEList
325c0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
325d0 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
325e0 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d  re;.  pGroupBy =
325f0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
32600 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
32610 76 69 6e 67 3b 0a 20 20 73 44 69 73 74 69 6e 63  ving;.  sDistinc
32620 74 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73  t.isTnct = (p->s
32630 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
32640 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 20  tinct)!=0;..#if 
32650 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
32660 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
32670 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
32680 78 34 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45  x400 ){.    SELE
32690 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70 50  CTTRACE(0x400,pP
326a0 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 61  arse,p,("After a
326b0 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 61  ll FROM-clause a
326c0 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20  nalysis:\n"));. 
326d0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
326e0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
326f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
32700 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 55  ifdef SQLITE_COU
32710 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a  NTOFVIEW_OPTIMIZ
32720 41 54 49 4f 4e 0a 20 20 69 66 28 20 4f 70 74 69  ATION.  if( Opti
32730 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
32740 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79  db, SQLITE_Query
32750 46 6c 61 74 74 65 6e 65 72 7c 53 51 4c 49 54 45  Flattener|SQLITE
32760 5f 43 6f 75 6e 74 4f 66 56 69 65 77 29 0a 20 20  _CountOfView).  
32770 20 26 26 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f   && countOfViewO
32780 70 74 69 6d 69 7a 61 74 69 6f 6e 28 70 50 61 72  ptimization(pPar
32790 73 65 2c 20 70 29 0a 20 20 29 7b 0a 20 20 20 20  se, p).  ){.    
327a0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
327b0 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
327c0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 45 4c 69  ct_end;.    pELi
327d0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
327e0 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
327f0 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  ->pSrc;.  }.#end
32800 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  if..  /* If the 
32810 71 75 65 72 79 20 69 73 20 44 49 53 54 49 4e 43  query is DISTINC
32820 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  T with an ORDER 
32830 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e  BY but is not an
32840 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20   aggregate, and 
32850 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c  .  ** if the sel
32860 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20  ect-list is the 
32870 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45  same as the ORDE
32880 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20  R BY list, then 
32890 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20  this query.  ** 
328a0 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e  can be rewritten
328b0 20 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20   as a GROUP BY. 
328c0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
328d0 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
328e0 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49      SELECT DISTI
328f0 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  NCT xyz FROM ...
32900 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20   ORDER BY xyz.  
32910 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73  **.  ** is trans
32920 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a  formed to:.  **.
32930 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
32940 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f  xyz FROM ... GRO
32950 55 50 20 42 59 20 78 79 7a 20 4f 52 44 45 52 20  UP BY xyz ORDER 
32960 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a  BY xyz.  **.  **
32970 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   The second form
32980 20 69 73 20 70 72 65 66 65 72 72 65 64 20 61 73   is preferred as
32990 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20   a single index 
329a0 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65 29 20  (or temp-table) 
329b0 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75 73 65  may be .  ** use
329c0 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 4f  d for both the O
329d0 52 44 45 52 20 42 59 20 61 6e 64 20 44 49 53 54  RDER BY and DIST
329e0 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e 67 2e  INCT processing.
329f0 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a   As originally .
32a00 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 68 65    ** written the
32a10 20 71 75 65 72 79 20 6d 75 73 74 20 75 73 65 20   query must use 
32a20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72  a temp-table for
32a30 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   at least one of
32a40 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a   the ORDER .  **
32a50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
32a60 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f  , and an index o
32a70 72 20 73 65 70 61 72 61 74 65 20 74 65 6d 70 2d  r separate temp-
32a80 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6f 74  table for the ot
32a90 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  her..  */.  if( 
32aa0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
32ab0 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
32ac0 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
32ad0 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26 20 73  istinct .   && s
32ae0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
32af0 6d 70 61 72 65 28 73 53 6f 72 74 2e 70 4f 72 64  mpare(sSort.pOrd
32b00 65 72 42 79 2c 20 70 45 4c 69 73 74 2c 20 2d 31  erBy, pEList, -1
32b10 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d  )==0.  ){.    p-
32b20 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
32b30 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70  _Distinct;.    p
32b40 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
32b50 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
32b60 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
32b70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 2f  EList, 0);.    /
32b80 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65 76  * Notice that ev
32b90 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44 69  en thought SF_Di
32ba0 73 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e 20  stinct has been 
32bb0 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e  cleared from p->
32bc0 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a  selFlags,.    **
32bd0 20 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e 69   the sDistinct.i
32be0 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20 73  sTnct is still s
32bf0 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54 6e  et.  Hence, isTn
32c00 63 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  ct represents th
32c10 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61  e.    ** origina
32c20 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68 65  l setting of the
32c30 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c 61   SF_Distinct fla
32c40 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72 65  g, not the curre
32c50 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20  nt setting */.  
32c60 20 20 61 73 73 65 72 74 28 20 73 44 69 73 74 69    assert( sDisti
32c70 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 0a 23  nct.isTnct );..#
32c80 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
32c90 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73  NABLED.    if( s
32ca0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
32cb0 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20  e & 0x400 ){.   
32cc0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
32cd0 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x400,pParse,p,("
32ce0 54 72 61 6e 73 66 6f 72 6d 20 44 49 53 54 49 4e  Transform DISTIN
32cf0 43 54 20 69 6e 74 6f 20 47 52 4f 55 50 20 42 59  CT into GROUP BY
32d00 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 73 71  :\n"));.      sq
32d10 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
32d20 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
32d30 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
32d40 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
32d50 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
32d60 75 73 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65  use, then create
32d70 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
32d80 64 65 78 20 74 6f 0a 20 20 2a 2a 20 64 6f 20 74  dex to.  ** do t
32d90 68 65 20 73 6f 72 74 69 6e 67 2e 20 20 42 75 74  he sorting.  But
32da0 20 74 68 69 73 20 73 6f 72 74 69 6e 67 20 65 70   this sorting ep
32db0 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 6d 69  hemeral index mi
32dc0 67 68 74 20 65 6e 64 20 75 70 0a 20 20 2a 2a 20  ght end up.  ** 
32dd0 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20  being unused if 
32de0 74 68 65 20 64 61 74 61 20 63 61 6e 20 62 65 20  the data can be 
32df0 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65  extracted in pre
32e00 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 20  -sorted order.. 
32e10 20 2a 2a 20 49 66 20 74 68 61 74 20 69 73 20 74   ** If that is t
32e20 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
32e30 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
32e40 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  al instruction w
32e50 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 68 61 6e  ill be.  ** chan
32e60 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  ged to an OP_Noo
32e70 70 20 6f 6e 63 65 20 77 65 20 66 69 67 75 72 65  p once we figure
32e80 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f   out that the so
32e90 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 0a 20  rting index is. 
32ea0 20 2a 2a 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20   ** not needed. 
32eb0 20 54 68 65 20 73 53 6f 72 74 2e 61 64 64 72 53   The sSort.addrS
32ec0 6f 72 74 49 6e 64 65 78 20 76 61 72 69 61 62 6c  ortIndex variabl
32ed0 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63  e is used to fac
32ee0 69 6c 69 74 61 74 65 0a 20 20 2a 2a 20 74 68 61  ilitate.  ** tha
32ef0 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20  t change..  */. 
32f00 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65   if( sSort.pOrde
32f10 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
32f20 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
32f30 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
32f40 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
32f50 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 70  (pParse, sSort.p
32f60 4f 72 64 65 72 42 79 2c 20 30 2c 20 70 45 4c 69  OrderBy, 0, pELi
32f70 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
32f80 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 20 3d  sSort.iECursor =
32f90 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
32fa0 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53  .    sSort.addrS
32fb0 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20  ortIndex =.     
32fc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
32fd0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
32fe0 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20  emeral,.        
32ff0 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72    sSort.iECursor
33000 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
33010 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c 69 73 74  ->nExpr+1+pEList
33020 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20 20 20 20  ->nExpr, 0,.    
33030 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
33040 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
33050 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c  O.      );.  }el
33060 73 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64  se{.    sSort.ad
33070 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31  drSortIndex = -1
33080 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
33090 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73  he output is des
330a0 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70  tined for a temp
330b0 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65  orary table, ope
330c0 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20  n that table..  
330d0 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  */.  if( pDest->
330e0 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
330f0 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
33100 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
33110 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
33120 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
33130 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
33140 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
33150 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a  the limiter..  *
33160 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74  /.  iEnd = sqlit
33170 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
33180 76 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65  v);.  if( (p->se
33190 6c 46 6c 61 67 73 20 26 20 53 46 5f 46 69 78 65  lFlags & SF_Fixe
331a0 64 4c 69 6d 69 74 29 3d 3d 30 20 29 7b 0a 20 20  dLimit)==0 ){.  
331b0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
331c0 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62 69 6c  = 320;  /* 4 bil
331d0 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20 7d  lion rows */.  }
331e0 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
331f0 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
33200 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66 28   p, iEnd);.  if(
33210 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26   p->iLimit==0 &&
33220 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
33230 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73  ndex>=0 ){.    s
33240 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
33250 4f 70 63 6f 64 65 28 76 2c 20 73 53 6f 72 74 2e  Opcode(v, sSort.
33260 61 64 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 4f  addrSortIndex, O
33270 50 5f 53 6f 72 74 65 72 4f 70 65 6e 29 3b 0a 20  P_SorterOpen);. 
33280 20 20 20 73 53 6f 72 74 2e 73 6f 72 74 46 6c 61     sSort.sortFla
33290 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41 47 5f 55  gs |= SORTFLAG_U
332a0 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20  seSorter;.  }.. 
332b0 20 2f 2a 20 4f 70 65 6e 20 61 6e 20 65 70 68 65   /* Open an ephe
332c0 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 20 75  meral index to u
332d0 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
332e0 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
332f0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
33300 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b  & SF_Distinct ){
33310 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74  .    sDistinct.t
33320 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  abTnct = pParse-
33330 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69  >nTab++;.    sDi
33340 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74 20  stinct.addrTnct 
33350 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
33360 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
33370 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
33380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33390 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e        sDistinct.
333a0 74 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20  tabTnct, 0, 0,. 
333b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
333c0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
333d0 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  r*)keyInfoFromEx
333e0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
333f0 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20  ->pEList,0,0),. 
33400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33410 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b              P4_K
33420 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c  EYINFO);.    sql
33430 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
33440 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  (v, BTREE_UNORDE
33450 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69  RED);.    sDisti
33460 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
33470 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
33480 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73  NORDERED;.  }els
33490 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  e{.    sDistinct
334a0 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45  .eTnctType = WHE
334b0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
334c0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73  ;.  }..  if( !is
334d0 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d  Agg && pGroupBy=
334e0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  =0 ){.    /* No 
334f0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
33500 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50  ons and no GROUP
33510 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
33520 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
33530 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73   = (sDistinct.is
33540 54 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e  Tnct ? WHERE_WAN
33550 54 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b  T_DISTINCT : 0);
33560 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 48 45  .    assert( WHE
33570 52 45 5f 55 53 45 5f 4c 49 4d 49 54 3d 3d 53 46  RE_USE_LIMIT==SF
33580 5f 46 69 78 65 64 4c 69 6d 69 74 20 29 3b 0a 20  _FixedLimit );. 
33590 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d     wctrlFlags |=
335a0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
335b0 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a 0a 20  F_FixedLimit;.. 
335c0 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20     /* Begin the 
335d0 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a  database scan. *
335e0 2f 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  /.    SELECTTRAC
335f0 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 57  E(1,pParse,p,("W
33600 68 65 72 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a  hereBegin\n"));.
33610 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
33620 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
33630 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
33640 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74 2e 70   pWhere, sSort.p
33650 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
33660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33670 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73          p->pELis
33680 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 70  t, wctrlFlags, p
33690 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
336a0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
336b0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
336c0 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  nd;.    if( sqli
336d0 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
336e0 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c  wCount(pWInfo) <
336f0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29   p->nSelectRow )
33700 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  {.      p->nSele
33710 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 57  ctRow = sqlite3W
33720 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75  hereOutputRowCou
33730 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nt(pWInfo);.    
33740 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73 74 69  }.    if( sDisti
33750 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 73 71  nct.isTnct && sq
33760 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
33770 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a  inct(pWInfo) ){.
33780 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e        sDistinct.
33790 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71 6c 69  eTnctType = sqli
337a0 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e  te3WhereIsDistin
337b0 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  ct(pWInfo);.    
337c0 7d 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e  }.    if( sSort.
337d0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
337e0 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d    sSort.nOBSat =
337f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f   sqlite3WhereIsO
33800 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a  rdered(pWInfo);.
33810 20 20 20 20 20 20 73 53 6f 72 74 2e 62 4f 72 64        sSort.bOrd
33820 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20  eredInnerLoop = 
33830 73 71 6c 69 74 65 33 57 68 65 72 65 4f 72 64 65  sqlite3WhereOrde
33840 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 28 70 57 49  redInnerLoop(pWI
33850 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
33860 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53  sSort.nOBSat==sS
33870 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ort.pOrderBy->nE
33880 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
33890 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
338a0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
338b0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74  ..    /* If sort
338c0 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77  ing index that w
338d0 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
338e0 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68  prior OP_OpenEph
338f0 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69  emeral .    ** i
33900 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64  nstruction ended
33910 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65   up not being ne
33920 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67  eded, then chang
33930 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
33940 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  emeral.    ** in
33950 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20  to an OP_Noop.. 
33960 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 53     */.    if( sS
33970 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
33980 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70 4f  x>=0 && sSort.pO
33990 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
339a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
339b0 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53  angeToNoop(v, sS
339c0 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
339d0 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  x);.    }..    /
339e0 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
339f0 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a  rd inner loop. *
33a00 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
33a10 3e 70 45 4c 69 73 74 3d 3d 70 45 4c 69 73 74 20  >pEList==pEList 
33a20 29 3b 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  );.    selectInn
33a30 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
33a40 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73  , -1, &sSort, &s
33a50 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  Distinct, pDest,
33a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33a70 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
33a80 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70  eContinueLabel(p
33a90 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20  WInfo),.        
33aa0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
33ab0 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62  te3WhereBreakLab
33ac0 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20  el(pWInfo));..  
33ad0 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
33ae0 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
33af0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
33b00 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
33b10 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fo);.  }else{.  
33b20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77    /* This case w
33b30 68 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 20  hen there exist 
33b40 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
33b50 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42  ons or a GROUP B
33b60 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  Y clause.    ** 
33b70 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e  or both */.    N
33b80 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
33b90 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
33ba0 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  xt for processin
33bb0 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f  g aggregate info
33bc0 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  rmation */.    i
33bd0 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20  nt iAMem;       
33be0 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
33bf0 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72  address for stor
33c00 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55  ing current GROU
33c10 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
33c20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iBMem;          
33c30 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
33c40 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75  ress for previou
33c50 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  s GROUP BY */.  
33c60 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20    int iUseFlag; 
33c70 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64        /* Mem add
33c80 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61  ress holding fla
33c90 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  g indicating tha
33ca0 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20  t at least.     
33cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33cc0 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66     ** one row of
33cd0 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   the input to th
33ce0 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73  e aggregator has
33cf0 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20   been.          
33d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
33d10 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
33d20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67    int iAbortFlag
33d30 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64  ;     /* Mem add
33d40 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65  ress which cause
33d50 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66  s query abort if
33d60 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20   positive */.   
33d70 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74   int groupBySort
33d80 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d  ;    /* Rows com
33d90 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e  e from source in
33da0 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20   GROUP BY order 
33db0 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45  */.    int addrE
33dc0 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  nd;        /* En
33dd0 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20  d of processing 
33de0 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20  for this SELECT 
33df0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50  */.    int sortP
33e00 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73  Tab = 0;   /* Ps
33e10 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74  eudotable used t
33e20 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67  o decode sorting
33e30 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20   results */.    
33e40 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b  int sortOut = 0;
33e50 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65      /* Output re
33e60 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20  gister from the 
33e70 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  sorter */.    in
33e80 74 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30  t orderByGrp = 0
33e90 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65  ; /* True if the
33ea0 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52   GROUP BY and OR
33eb0 44 45 52 20 42 59 20 61 72 65 20 74 68 65 20 73  DER BY are the s
33ec0 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  ame */..    /* R
33ed0 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c  emove any and al
33ee0 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77 65 65  l aliases betwee
33ef0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
33f00 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
33f10 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
33f20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
33f30 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
33f40 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20    int k;        
33f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f60 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
33f70 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
33f80 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
33f90 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f  Item;  /* For lo
33fa0 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65  oping over expre
33fb0 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20  ssion in a list 
33fc0 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  */..      for(k=
33fd0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
33fe0 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73  , pItem=p->pELis
33ff0 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  t->a; k>0; k--, 
34000 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
34010 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
34020 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
34030 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72  .      for(k=pGr
34040 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49  oupBy->nExpr, pI
34050 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b  tem=pGroupBy->a;
34060 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d   k>0; k--, pItem
34070 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  ++){.        pIt
34080 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d  em->u.x.iAlias =
34090 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
340a0 20 20 61 73 73 65 72 74 28 20 36 36 3d 3d 73 71    assert( 66==sq
340b0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29  lite3LogEst(100)
340c0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
340d0 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 36 36 20 29  >nSelectRow>66 )
340e0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
340f0 20 36 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   66;.    }else{.
34100 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d        assert( 0=
34110 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
34120 29 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  ) );.      p->nS
34130 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20  electRow = 0;.  
34140 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
34150 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47  here is both a G
34160 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f  ROUP BY and an O
34170 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
34180 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20 20 20  nd they are.    
34190 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68  ** identical, th
341a0 65 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73  en it may be pos
341b0 73 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65  sible to disable
341c0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
341d0 61 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20  ause .    ** on 
341e0 74 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74  the grounds that
341f0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 77 69   the GROUP BY wi
34200 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74  ll cause element
34210 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20  s to come out . 
34220 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72     ** in the cor
34230 72 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61  rect order. It a
34240 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68  lso may not - th
34250 65 20 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74  e GROUP BY might
34260 20 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61   use a.    ** da
34270 74 61 62 61 73 65 20 69 6e 64 65 78 20 74 68 61  tabase index tha
34280 74 20 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f  t causes rows to
34290 20 62 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65   be grouped toge
342a0 74 68 65 72 20 61 73 20 72 65 71 75 69 72 65 64  ther as required
342b0 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20  .    ** but not 
342c0 61 63 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e  actually sorted.
342d0 20 45 69 74 68 65 72 20 77 61 79 2c 20 72 65 63   Either way, rec
342e0 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
342f0 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44  t the.    ** ORD
34300 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20  ER BY and GROUP 
34310 42 59 20 63 6c 61 75 73 65 73 20 61 72 65 20 74  BY clauses are t
34320 68 65 20 73 61 6d 65 20 62 79 20 73 65 74 74 69  he same by setti
34330 6e 67 20 74 68 65 20 6f 72 64 65 72 42 79 47 72  ng the orderByGr
34340 70 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  p.    ** variabl
34350 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  e.  */.    if( s
34360 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
34370 6d 70 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20  mpare(pGroupBy, 
34380 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
34390 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
343a0 6f 72 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a  orderByGrp = 1;.
343b0 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43      }. .    /* C
343c0 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f  reate a label to
343d0 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65   jump to when we
343e0 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74   want to abort t
343f0 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  he query */.    
34400 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65  addrEnd = sqlite
34410 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
34420 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65  );..    /* Conve
34430 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  rt TK_COLUMN nod
34440 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  es into TK_AGG_C
34450 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65  OLUMN and make e
34460 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a  ntries in.    **
34470 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c   sAggInfo for al
34480 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  l TK_AGG_FUNCTIO
34490 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65  N nodes in expre
344a0 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20  ssions of the.  
344b0 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
344c0 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ement..    */.  
344d0 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
344e0 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
344f0 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
34500 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43   pParse;.    sNC
34510 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
34520 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 75 4e  List;.    sNC.uN
34530 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41  C.pAggInfo = &sA
34540 67 67 49 6e 66 6f 3b 0a 20 20 20 20 56 56 41 5f  ggInfo;.    VVA_
34550 4f 4e 4c 59 28 20 73 4e 43 2e 6e 63 46 6c 61 67  ONLY( sNC.ncFlag
34560 73 20 3d 20 4e 43 5f 55 41 67 67 49 6e 66 6f 3b  s = NC_UAggInfo;
34570 20 29 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   ).    sAggInfo.
34580 6d 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  mnReg = pParse->
34590 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67  nMem+1;.    sAgg
345a0 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
345b0 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f  umn = pGroupBy ?
345c0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
345d0 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e   : 0;.    sAggIn
345e0 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  fo.pGroupBy = pG
345f0 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69  roupBy;.    sqli
34600 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
34610 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69  gList(&sNC, pELi
34620 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
34630 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
34640 73 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70  st(&sNC, sSort.p
34650 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66  OrderBy);.    if
34660 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
34670 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
34680 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
34690 74 28 20 70 57 68 65 72 65 3d 3d 70 2d 3e 70 57  t( pWhere==p->pW
346a0 68 65 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20  here );.        
346b0 61 73 73 65 72 74 28 20 70 48 61 76 69 6e 67 3d  assert( pHaving=
346c0 3d 70 2d 3e 70 48 61 76 69 6e 67 20 29 3b 0a 20  =p->pHaving );. 
346d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
346e0 47 72 6f 75 70 42 79 3d 3d 70 2d 3e 70 47 72 6f  GroupBy==p->pGro
346f0 75 70 42 79 20 29 3b 0a 20 20 20 20 20 20 20 20  upBy );.        
34700 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28 70 50  havingToWhere(pP
34710 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
34720 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
34730 68 65 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  here;.      }.  
34740 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
34750 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
34760 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b  (&sNC, pHaving);
34770 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
34780 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  nfo.nAccumulator
34790 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   = sAggInfo.nCol
347a0 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  umn;.    if( p->
347b0 70 47 72 6f 75 70 42 79 3d 3d 30 20 26 26 20 70  pGroupBy==0 && p
347c0 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 26 26 20  ->pHaving==0 && 
347d0 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3d 3d  sAggInfo.nFunc==
347e0 31 20 29 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61  1 ){.      minMa
347f0 78 46 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75  xFlag = minMaxQu
34800 65 72 79 28 64 62 2c 20 73 41 67 67 49 6e 66 6f  ery(db, sAggInfo
34810 2e 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 2c  .aFunc[0].pExpr,
34820 20 26 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79   &pMinMaxOrderBy
34830 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
34840 20 20 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d      minMaxFlag =
34850 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
34860 4f 52 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20  ORMAL;.    }.   
34870 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
34880 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29  Info.nFunc; i++)
34890 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
348a0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
348b0 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b  (sAggInfo.aFunc[
348c0 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  i].pExpr, EP_xIs
348d0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
348e0 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20   sNC.ncFlags |= 
348f0 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20  NC_InAggFunc;.  
34900 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
34910 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
34920 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  NC, sAggInfo.aFu
34930 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70  nc[i].pExpr->x.p
34940 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43  List);.      sNC
34950 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f  .ncFlags &= ~NC_
34960 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d  InAggFunc;.    }
34970 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78  .    sAggInfo.mx
34980 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
34990 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  em;.    if( db->
349a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
349b0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
349c0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
349d0 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20  ENABLED.    if( 
349e0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
349f0 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
34a00 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
34a10 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
34a20 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  400,pParse,p,("A
34a30 66 74 65 72 20 61 67 67 72 65 67 61 74 65 20 61  fter aggregate a
34a40 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20  nalysis:\n"));. 
34a50 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
34a60 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
34a70 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   0);.      for(i
34a80 69 3d 30 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f  i=0; ii<sAggInfo
34a90 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b  .nColumn; ii++){
34aa0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34ab0 44 65 62 75 67 50 72 69 6e 74 66 28 22 61 67 67  DebugPrintf("agg
34ac0 2d 63 6f 6c 75 6d 6e 5b 25 64 5d 20 69 4d 65 6d  -column[%d] iMem
34ad0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
34ae0 20 20 20 20 69 69 2c 20 73 41 67 67 49 6e 66 6f      ii, sAggInfo
34af0 2e 61 43 6f 6c 5b 69 69 5d 2e 69 4d 65 6d 29 3b  .aCol[ii].iMem);
34b00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34b10 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c 20  TreeViewExpr(0, 
34b20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69  sAggInfo.aCol[ii
34b30 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
34b40 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
34b50 69 3d 30 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f  i=0; ii<sAggInfo
34b60 2e 6e 46 75 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20  .nFunc; ii++){. 
34b70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
34b80 62 75 67 50 72 69 6e 74 66 28 22 61 67 67 2d 66  bugPrintf("agg-f
34b90 75 6e 63 5b 25 64 5d 3a 20 69 4d 65 6d 3d 25 64  unc[%d]: iMem=%d
34ba0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
34bb0 20 69 69 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46   ii, sAggInfo.aF
34bc0 75 6e 63 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20  unc[ii].iMem);. 
34bd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
34be0 65 65 56 69 65 77 45 78 70 72 28 30 2c 20 73 41  eeViewExpr(0, sA
34bf0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d  ggInfo.aFunc[ii]
34c00 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
34c10 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
34c20 0a 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73  ...    /* Proces
34c30 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
34c40 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42  tes with GROUP B
34c50 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72  Y is very differ
34c60 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d  ent and.    ** m
34c70 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  uch more complex
34c80 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73   than aggregates
34c90 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50   without a GROUP
34ca0 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   BY..    */.    
34cb0 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
34cc0 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
34cd0 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79  KeyInfo;  /* Key
34ce0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
34cf0 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79  for the group by
34d00 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
34d10 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
34d20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63       /* A-vs-B c
34d30 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20  omparision jump 
34d40 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
34d50 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20  rOutputRow;  /* 
34d60 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74  Start of subrout
34d70 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
34d80 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f   a result row */
34d90 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75  .      int regOu
34da0 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65  tputRow;   /* Re
34db0 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
34dc0 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74  ister for output
34dd0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
34de0 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74       int addrSet
34df0 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20  Abort;   /* Set 
34e00 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61  the abort flag a
34e10 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20  nd return */.   
34e20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66     int addrTopOf
34e30 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66  Loop;  /* Top of
34e40 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20   the input loop 
34e50 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
34e60 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20  rSortingIdx; /* 
34e70 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
34e80 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72  eral for the sor
34e90 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ting index */.  
34ea0 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65      int addrRese
34eb0 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f  t;      /* Subro
34ec0 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74  utine for resett
34ed0 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
34ee0 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tor */.      int
34ef0 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20   regReset;      
34f00 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
34f10 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
34f20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65  reset subroutine
34f30 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   */..      /* If
34f40 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55   there is a GROU
34f50 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d  P BY clause we m
34f60 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74  ight need a sort
34f70 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20  ing index to.   
34f80 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20     ** implement 
34f90 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68  it.  Allocate th
34fa0 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  at sorting index
34fb0 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72   now.  If it tur
34fc0 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20  ns out.      ** 
34fd0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e  that we do not n
34fe0 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c  eed it after all
34ff0 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f  , the OP_SorterO
35000 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  pen instruction.
35010 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
35020 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
35030 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20  a Noop.  .      
35040 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66  */.      sAggInf
35050 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70  o.sortingIdx = p
35060 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
35070 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
35080 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
35090 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ist(pParse, pGro
350a0 75 70 42 79 2c 20 30 2c 20 73 41 67 67 49 6e 66  upBy, 0, sAggInf
350b0 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  o.nColumn);.    
350c0 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78    addrSortingIdx
350d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
350e0 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp4(v, OP_Sorte
350f0 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20  rOpen, .        
35100 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
35110 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e  ngIdx, sAggInfo.
35120 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20  nSortingColumn, 
35130 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63  .          0, (c
35140 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
35150 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20  4_KEYINFO);..   
35160 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
35170 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
35180 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20  s used by GROUP 
35190 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f  BY aggregate pro
351a0 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f  cessing.      */
351b0 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20  .      iUseFlag 
351c0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
351d0 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c  ;.      iAbortFl
351e0 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
351f0 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75  Mem;.      regOu
35200 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72  tputRow = ++pPar
35210 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
35220 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
35230 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
35240 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72  abel(v);.      r
35250 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72  egReset = ++pPar
35260 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
35270 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69  addrReset = sqli
35280 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
35290 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d  (v);.      iAMem
352a0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
352b0 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
352c0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
352d0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
352e0 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65    iBMem = pParse
352f0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
35300 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
35310 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
35320 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
35330 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
35340 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62  _Integer, 0, iAb
35350 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
35360 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
35370 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61  "clear abort fla
35380 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
35390 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
353a0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
353b0 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
353c0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
353d0 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d   "indicate accum
353e0 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b  ulator empty"));
353f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
35400 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
35410 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69  ull, 0, iAMem, i
35420 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e  AMem+pGroupBy->n
35430 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20  Expr-1);..      
35440 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20  /* Begin a loop 
35450 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
35460 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77  t all source row
35470 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  s in GROUP BY or
35480 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  der..      ** Th
35490 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65  is might involve
354a0 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f   two separate lo
354b0 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53  ops with an OP_S
354c0 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20  ort in between, 
354d0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d  or.      ** it m
354e0 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65  ight be a single
354f0 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20   loop that uses 
35500 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72  an index to extr
35510 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  act information.
35520 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
35530 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62  right order to b
35540 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20  egin with..     
35550 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
35560 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
35570 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
35580 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
35590 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
355a0 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68  (1,pParse,p,("Wh
355b0 65 72 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20  ereBegin\n"));. 
355c0 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
355d0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
355e0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
355f0 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70  , pWhere, pGroup
35600 42 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  By, 0,.         
35610 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 7c   WHERE_GROUPBY |
35620 20 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20 57   (orderByGrp ? W
35630 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
35640 20 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20 29   : 0), 0.      )
35650 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
35660 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
35670 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69  ect_end;.      i
35680 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  f( sqlite3WhereI
35690 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
356a0 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  ==pGroupBy->nExp
356b0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  r ){.        /* 
356c0 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73  The optimizer is
356d0 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72   able to deliver
356e0 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62   rows in group b
356f0 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20  y order so.     
35700 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20     ** we do not 
35710 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54  have to sort.  T
35720 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
35730 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ral table will b
35740 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e  e.        ** can
35750 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63  celled later bec
35760 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65  ause we still ne
35770 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b  ed to use the pK
35780 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a  eyInfo.        *
35790 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  /.        groupB
357a0 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  ySort = 0;.     
357b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
357c0 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69  /* Rows are comi
357d0 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65  ng out in undete
357e0 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57  rmined order.  W
357f0 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20  e have to push. 
35800 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72         ** each r
35810 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e  ow into a sortin
35820 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61  g index, termina
35830 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f  te the first loo
35840 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  p,.        ** th
35850 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65  en loop over the
35860 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
35870 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
35880 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20  he output.      
35890 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f    ** in sorted o
358a0 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a  rder.        */.
358b0 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42          int regB
358c0 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ase;.        int
358d0 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20   regRecord;.    
358e0 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
358f0 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70        int nGroup
35900 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70  By;..        exp
35910 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
35920 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
35930 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73     (sDistinct.is
35940 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  Tnct && (p->selF
35950 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74  lags&SF_Distinct
35960 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20  )==0) ?.        
35970 20 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53              "DIS
35980 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20  TINCT" : "GROUP 
35990 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67  BY");..        g
359a0 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a  roupBySort = 1;.
359b0 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79          nGroupBy
359c0 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   = pGroupBy->nEx
359d0 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  pr;.        nCol
359e0 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20   = nGroupBy;.   
359f0 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
35a00 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  y;.        for(i
35a10 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
35a20 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
35a30 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67          if( sAgg
35a40 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f  Info.aCol[i].iSo
35a50 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
35a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f  .            nCo
35a70 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  l++;.           
35a80 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
35a90 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
35aa0 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71      regBase = sq
35ab0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
35ac0 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b  e(pParse, nCol);
35ad0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35ae0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
35af0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
35b00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
35b10 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
35b20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73  pGroupBy, regBas
35b30 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
35b40 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a    j = nGroupBy;.
35b50 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
35b60 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
35b70 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
35b80 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
35b90 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
35ba0 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69  &sAggInfo.aCol[i
35bb0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
35bc0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
35bd0 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
35be0 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
35bf0 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20  j + regBase;.   
35c00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
35c10 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
35c20 6e 54 6f 52 65 67 28 70 50 61 72 73 65 2c 20 0a  nToReg(pParse, .
35c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
35c50 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d  Col->pTab, pCol-
35c60 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e  >iColumn, pCol->
35c70 69 54 61 62 6c 65 2c 20 72 31 29 3b 0a 20 20 20  iTable, r1);.   
35c80 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
35c90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35ca0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52    }.        regR
35cb0 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
35cc0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
35cd0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
35ce0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
35cf0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
35d00 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65  egBase, nCol, re
35d10 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
35d20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
35d30 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
35d40 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f  Insert, sAggInfo
35d50 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67  .sortingIdx, reg
35d60 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
35d70 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
35d80 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
35d90 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
35da0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
35db0 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
35dc0 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  e, regBase, nCol
35dd0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
35de0 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
35df0 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  o);.        sAgg
35e00 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50  Info.sortingIdxP
35e10 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d  Tab = sortPTab =
35e20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
35e30 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74  .        sortOut
35e40 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
35e50 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
35e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
35e70 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
35e80 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54  enPseudo, sortPT
35e90 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f  ab, sortOut, nCo
35ea0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
35eb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
35ec0 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
35ed0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
35ee0 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  Idx, addrEnd);. 
35ef0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
35f00 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59  nt((v, "GROUP BY
35f10 20 73 6f 72 74 22 29 29 3b 20 56 64 62 65 43 6f   sort")); VdbeCo
35f20 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
35f30 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53     sAggInfo.useS
35f40 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20  ortingIdx = 1;. 
35f50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
35f60 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
35f70 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a  rse);..      }..
35f80 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
35f90 69 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f 72 61  index or tempora
35fa0 72 79 20 74 61 62 6c 65 20 75 73 65 64 20 62 79  ry table used by
35fb0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 73 6f   the GROUP BY so
35fc0 72 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  rt.      ** will
35fd0 20 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c 69 76   naturally deliv
35fe0 65 72 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  er rows in the o
35ff0 72 64 65 72 20 72 65 71 75 69 72 65 64 20 62 79  rder required by
36000 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
36010 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63      ** clause, c
36020 61 6e 63 65 6c 20 74 68 65 20 65 70 68 65 6d 65  ancel the epheme
36030 72 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e 20 63  ral table open c
36040 6f 64 65 64 20 65 61 72 6c 69 65 72 2e 0a 20 20  oded earlier..  
36050 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
36060 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
36070 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f  ization - the co
36080 72 72 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f  rrect answer sho
36090 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61 72  uld result regar
360a0 64 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20  dless..      ** 
360b0 55 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47  Use the SQLITE_G
360c0 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67  roupByOrder flag
360d0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53   with SQLITE_TES
360e0 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20  TCTRL_OPTIMIZER 
360f0 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 73  to .      ** dis
36100 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d 69  able this optimi
36110 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74 69  zation for testi
36120 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f  ng purposes.  */
36130 0a 20 20 20 20 20 20 69 66 28 20 6f 72 64 65 72  .      if( order
36140 42 79 47 72 70 20 26 26 20 4f 70 74 69 6d 69 7a  ByGrp && Optimiz
36150 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
36160 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
36170 72 64 65 72 29 20 0a 20 20 20 20 20 20 20 26 26  rder) .       &&
36180 20 28 67 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c   (groupBySort ||
36190 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 53   sqlite3WhereIsS
361a0 6f 72 74 65 64 28 70 57 49 6e 66 6f 29 29 0a 20  orted(pWInfo)). 
361b0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
361c0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
361d0 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
361e0 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
361f0 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64  oop(v, sSort.add
36200 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20  rSortIndex);.   
36210 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45     }..      /* E
36220 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72  valuate the curr
36230 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
36240 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20  ms and store in 
36250 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20  b0, b1, b2....  
36260 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65      ** (b0 is me
36270 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42  mory location iB
36280 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d  Mem+0, b1 is iBM
36290 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72  em+1, and so for
362a0 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  th).      ** The
362b0 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75  n compare the cu
362c0 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
362d0 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65  erms against the
362e0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a   GROUP BY terms.
362f0 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
36300 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63  e previous row c
36310 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
36320 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e  in a0, a1, a2...
36330 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
36340 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20  addrTopOfLoop = 
36350 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
36360 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
36370 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
36380 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
36390 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
363a0 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
363b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
363c0 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44  p3(v, OP_SorterD
363d0 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ata, sAggInfo.so
363e0 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20  rtingIdx,.      
363f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36400 20 20 20 20 73 6f 72 74 4f 75 74 2c 20 73 6f 72      sortOut, sor
36410 74 50 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a  tPTab);.      }.
36420 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
36430 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
36440 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
36450 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
36460 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
36470 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
36480 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72  , OP_Column, sor
36490 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b  tPTab, j, iBMem+
364a0 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  j);.        }els
364b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  e{.          sAg
364c0 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65  gInfo.directMode
364d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
364e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
364f0 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
36500 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42  ->a[j].pExpr, iB
36510 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
36520 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
36530 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
36540 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
36550 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70   iAMem, iBMem, p
36560 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a  GroupBy->nExpr,.
36570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36580 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
36590 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
365a0 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34  ef(pKeyInfo), P4
365b0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
365c0 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
365d0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
365e0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
365f0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
36600 50 5f 4a 75 6d 70 2c 20 61 64 64 72 31 2b 31 2c  P_Jump, addr1+1,
36610 20 30 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64   0, addr1+1); Vd
36620 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
36630 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
36640 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73  e code that runs
36650 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52   whenever the GR
36660 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a  OUP BY changes..
36670 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73        ** Changes
36680 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59   in the GROUP BY
36690 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79   are detected by
366a0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f   the previous co
366b0 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63  de.      ** bloc
366c0 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72  k.  If there wer
366d0 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68  e no changes, th
366e0 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70  is block is skip
366f0 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ped..      **.  
36700 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65      ** This code
36710 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20   copies current 
36720 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69  group by terms i
36730 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20  n b0,b1,b2,.... 
36740 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20       ** over to 
36750 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68  a0,a1,a2.  It th
36760 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74  en calls the out
36770 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  put subroutine. 
36780 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
36790 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65  ts the aggregate
367a0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
367b0 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72  isters in prepar
367c0 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66  ation.      ** f
367d0 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55  or the next GROU
367e0 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20  P BY batch..    
367f0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
36800 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
36810 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41  Parse, iBMem, iA
36820 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Mem, pGroupBy->n
36830 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
36840 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
36850 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
36860 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
36870 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
36880 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
36890 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22  "output one row"
368a0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
368b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
368c0 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46  P_IfPos, iAbortF
368d0 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 20 56  lag, addrEnd); V
368e0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
368f0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
36900 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f  t((v, "check abo
36910 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
36920 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
36930 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
36940 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
36950 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  eset);.      Vdb
36960 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
36970 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22  set accumulator"
36980 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ));..      /* Up
36990 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61  date the aggrega
369a0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20  te accumulators 
369b0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
369c0 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tent of.      **
369d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
369e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
369f0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
36a00 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
36a10 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
36a20 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
36a30 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
36a40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
36a50 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
36a60 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 1, iUseFlag);.
36a70 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
36a80 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
36a90 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61  data in accumula
36aa0 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
36ab0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
36ac0 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  p.      */.     
36ad0 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
36ae0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
36af0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
36b00 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20   OP_SorterNext, 
36b10 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
36b20 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f  Idx, addrTopOfLo
36b30 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  op);.        Vdb
36b40 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
36b50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36b60 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
36b70 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
36b80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
36b90 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
36ba0 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a  ddrSortingIdx);.
36bb0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
36bc0 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e  * Output the fin
36bd0 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  al row of result
36be0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
36bf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
36c00 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
36c10 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
36c20 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
36c30 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
36c40 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c  v, "output final
36c50 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20   row"));..      
36c60 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65  /* Jump over the
36c70 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20   subroutines.   
36c80 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
36c90 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
36ca0 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20  ddrEnd);..      
36cb0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
36cc0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
36cd0 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72  tputs a single r
36ce0 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
36cf0 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20  .      ** set.  
36d00 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  This subroutine 
36d10 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74  first looks at t
36d20 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66  he iUseFlag.  If
36d30 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20   iUseFlag.      
36d40 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ** is less than 
36d50 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
36d60 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
36d70 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
36d80 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
36d90 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66  ocessing calls f
36da0 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  or the query to 
36db0 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72  abort, this subr
36dc0 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
36dd0 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69  increments the i
36de0 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79  AbortFlag memory
36df0 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65   location before
36e00 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20   returning in.  
36e10 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20      ** order to 
36e20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65  signal the calle
36e30 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20  r to abort..    
36e40 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53    */.      addrS
36e50 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65  etAbort = sqlite
36e60 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
36e70 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
36e80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
36e90 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
36ea0 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
36eb0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
36ec0 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61  , "set abort fla
36ed0 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
36ee0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
36ef0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
36f00 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
36f10 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
36f20 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
36f30 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
36f40 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
36f50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
36f60 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
36f70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
36f80 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
36f90 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72  , iUseFlag, addr
36fa0 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20  OutputRow+2);.  
36fb0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
36fc0 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
36fd0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75  omment((v, "Grou
36fe0 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
36ff0 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74  ator entry point
37000 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
37010 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
37020 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
37030 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
37040 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
37050 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
37060 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
37070 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
37080 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
37090 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
370a0 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  +1, SQLITE_JUMPI
370b0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65  FNULL);.      se
370c0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
370d0 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53  arse, p, -1, &sS
370e0 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ort,.           
370f0 20 20 20 20 20 20 20 20 20 20 20 26 73 44 69 73             &sDis
37100 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
37110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37120 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
37130 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72  w+1, addrSetAbor
37140 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
37150 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
37160 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
37170 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
37180 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
37190 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75  end groupby resu
371a0 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b  lt generator"));
371b0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
371c0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
371d0 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74   that will reset
371e0 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63   the group-by ac
371f0 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20  cumulator.      
37200 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
37210 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
37220 28 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  (v, addrReset);.
37230 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
37240 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
37250 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
37260 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37270 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
37280 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20   regReset);.    
37290 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66   .    } /* endif
372a0 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69   pGroupBy.  Begi
372b0 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
372c0 69 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55  ies without GROU
372d0 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73  P BY: */.    els
372e0 65 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e {.#ifndef SQLI
372f0 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
37300 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  NT.      Table *
37310 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
37320 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65  (pTab = isSimple
37330 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e  Count(p, &sAggIn
37340 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  fo))!=0 ){.     
37350 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c     /* If isSimpl
37360 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73  eCount() returns
37370 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
37380 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c  Table structure,
37390 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
373a0 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
373b0 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
373c0 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  m:.        **.  
373d0 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
373e0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
373f0 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a  <tbl>.        **
37400 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72  .        ** wher
37410 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
37420 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72  cture returned r
37430 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20  epresents table 
37440 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a  <tbl>..        *
37450 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
37460 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  s statement is s
37470 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74  o common that it
37480 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70   is optimized sp
37490 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20  ecially. The.   
374a0 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74       ** OP_Count
374b0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
374c0 65 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20  executed either 
374d0 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61  on the intkey ta
374e0 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  ble that.       
374f0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
37500 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20   data for table 
37510 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20  <tbl> or on one 
37520 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20  of its indexes. 
37530 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  It.        ** is
37540 20 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75   better to execu
37550 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20  te the op on an 
37560 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65  index, as indexe
37570 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20  s are almost.   
37580 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
37590 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73  pread across les
375a0 73 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65  s pages than the
375b0 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ir corresponding
375c0 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20   tables..       
375d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
375e0 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69  t int iDb = sqli
375f0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
37600 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
37610 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
37620 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
37630 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Csr = pParse->nT
37640 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72  ab++;     /* Cur
37650 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72  sor to scan b-tr
37660 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e  ee */.        In
37670 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
37680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37690 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
376a0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
376b0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
376c0 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Info = 0;       
376d0 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e          /* Keyin
376e0 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69  fo for scanned i
376f0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
37700 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30  Index *pBest = 0
37710 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37720 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64       /* Best ind
37730 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20  ex found so far 
37740 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
37750 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75  Root = pTab->tnu
37760 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
37770 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
37780 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a  scanned b-tree *
37790 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  /..        sqlit
377a0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
377b0 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
377c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
377d0 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
377e0 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
377f0 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
37800 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  e);..        /* 
37810 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69  Search for the i
37820 6e 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68  ndex that has th
37830 65 20 6c 6f 77 65 73 74 20 73 63 61 6e 20 63 6f  e lowest scan co
37840 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  st..        **. 
37850 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 31 2d         ** (2011-
37860 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f  04-15) Do not do
37870 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20   a full scan of 
37880 61 6e 20 75 6e 6f 72 64 65 72 65 64 20 69 6e 64  an unordered ind
37890 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ex..        **. 
378a0 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 33 2d         ** (2013-
378b0 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f  10-03) Do not co
378c0 75 6e 74 20 74 68 65 20 65 6e 74 72 69 65 73 20  unt the entries 
378d0 69 6e 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64  in a partial ind
378e0 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ex..        **. 
378f0 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61         ** In pra
37900 63 74 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66  ctice the KeyInf
37910 6f 20 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c  o structure will
37920 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74   not be used. It
37930 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20   is only .      
37940 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b    ** passed to k
37950 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20  eep OP_OpenRead 
37960 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a  happy..        *
37970 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 48  /.        if( !H
37980 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
37990 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pBest = sqlite3P
379a0 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
379b0 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  Tab);.        fo
379c0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
379d0 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
379e0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
379f0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
37a00 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a  ->bUnordered==0.
37a10 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49             && pI
37a20 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61  dx->szIdxRow<pTa
37a30 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20 20 20  b->szTabRow.    
37a40 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e         && pIdx->
37a50 70 50 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30  pPartIdxWhere==0
37a60 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
37a70 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e  !pBest || pIdx->
37a80 73 7a 49 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e  szIdxRow<pBest->
37a90 73 7a 49 64 78 52 6f 77 29 0a 20 20 20 20 20 20  szIdxRow).      
37aa0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
37ab0 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b     pBest = pIdx;
37ac0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
37ad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
37ae0 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20  f( pBest ){.    
37af0 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42        iRoot = pB
37b00 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  est->tnum;.     
37b10 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
37b20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
37b30 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 42  Index(pParse, pB
37b40 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  est);.        }.
37b50 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  .        /* Open
37b60 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
37b70 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74 68 65  sor, execute the
37b80 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65   OP_Count, close
37b90 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a   the cursor. */.
37ba0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
37bb0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
37bc0 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73  OP_OpenRead, iCs
37bd0 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31  r, iRoot, iDb, 1
37be0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
37bf0 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
37c00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37c10 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
37c20 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f  (char *)pKeyInfo
37c30 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
37c40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
37c50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37c60 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20  p2(v, OP_Count, 
37c70 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61  iCsr, sAggInfo.a
37c80 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20  Func[0].iMem);. 
37c90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
37ca0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
37cb0 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20  lose, iCsr);.   
37cc0 20 20 20 20 20 65 78 70 6c 61 69 6e 53 69 6d 70       explainSimp
37cd0 6c 65 43 6f 75 6e 74 28 70 50 61 72 73 65 2c 20  leCount(pParse, 
37ce0 70 54 61 62 2c 20 70 42 65 73 74 29 3b 0a 20 20  pTab, pBest);.  
37cf0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
37d00 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
37d10 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20  BTREECOUNT */.  
37d20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a      {.        /*
37d30 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20   This case runs 
37d40 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  if the aggregate
37d50 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59   has no GROUP BY
37d60 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20   clause.  The.  
37d70 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
37d80 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70  ing is much simp
37d90 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20  ler since there 
37da0 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  is only a single
37db0 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20   row.        ** 
37dc0 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20  of output..     
37dd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
37de0 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
37df0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  y==0 );.        
37e00 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
37e10 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
37e20 66 6f 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  fo);..        /*
37e30 20 49 66 20 74 68 69 73 20 71 75 65 72 79 20 69   If this query i
37e40 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
37e50 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70  r the min/max op
37e60 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 68 65 6e  timization, then
37e70 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 69 6e 4d  .        ** minM
37e80 61 78 46 6c 61 67 20 77 69 6c 6c 20 68 61 76 65  axFlag will have
37e90 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
37ea0 20 73 65 74 20 74 6f 20 65 69 74 68 65 72 0a 20   set to either. 
37eb0 20 20 20 20 20 20 20 2a 2a 20 57 48 45 52 45 5f         ** WHERE_
37ec0 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57  ORDERBY_MIN or W
37ed0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
37ee0 20 61 6e 64 20 70 4d 69 6e 4d 61 78 4f 72 64 65   and pMinMaxOrde
37ef0 72 42 79 20 77 69 6c 6c 0a 20 20 20 20 20 20 20  rBy will.       
37f00 20 2a 2a 20 62 65 20 61 6e 20 61 70 70 72 6f 70   ** be an approp
37f10 72 69 61 74 65 20 4f 52 44 45 52 20 42 59 20 65  riate ORDER BY e
37f20 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 68  xpression for th
37f30 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  e optimization..
37f40 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
37f50 20 20 20 61 73 73 65 72 74 28 20 6d 69 6e 4d 61     assert( minMa
37f60 78 46 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44  xFlag==WHERE_ORD
37f70 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 7c 7c 20 70  ERBY_NORMAL || p
37f80 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 21 3d 30  MinMaxOrderBy!=0
37f90 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
37fa0 72 74 28 20 70 4d 69 6e 4d 61 78 4f 72 64 65 72  rt( pMinMaxOrder
37fb0 42 79 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78  By==0 || pMinMax
37fc0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
37fd0 31 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 53 45  1 );..        SE
37fe0 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
37ff0 73 65 2c 70 2c 28 22 57 68 65 72 65 42 65 67 69  se,p,("WhereBegi
38000 6e 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  n\n"));.        
38010 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
38020 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
38030 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
38040 65 72 65 2c 20 70 4d 69 6e 4d 61 78 4f 72 64 65  ere, pMinMaxOrde
38050 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rBy,.           
38060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38070 20 20 20 20 20 20 20 20 30 2c 20 6d 69 6e 4d 61          0, minMa
38080 78 46 6c 61 67 2c 20 30 29 3b 0a 20 20 20 20 20  xFlag, 0);.     
38090 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
380a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
380b0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
380c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
380d0 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
380e0 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
380f0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  Info);.        i
38100 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  f( sqlite3WhereI
38110 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
38120 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
38130 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
38140 76 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  v, sqlite3WhereB
38150 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f  reakLabel(pWInfo
38160 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  ));.          Vd
38170 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
38180 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20  s() by index",. 
38190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
381a0 6d 69 6e 4d 61 78 46 6c 61 67 3d 3d 57 48 45 52  minMaxFlag==WHER
381b0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d  E_ORDERBY_MIN?"m
381c0 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20  in":"max")));.  
381d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
381e0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
381f0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
38200 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
38210 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
38220 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
38230 7d 0a 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70  }..      sSort.p
38240 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
38250 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
38260 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
38270 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20  aving, addrEnd, 
38280 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
38290 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74  L);.      select
382a0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
382b0 2c 20 70 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a  , p, -1, 0, 0, .
382c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
382d0 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64        pDest, add
382e0 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a  rEnd, addrEnd);.
382f0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
38300 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
38310 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  l(v, addrEnd);. 
38320 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66     .  } /* endif
38330 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
38340 20 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69 73 74   */..  if( sDist
38350 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d  inct.eTnctType==
38360 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
38370 4e 4f 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20  NORDERED ){.    
38380 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
38390 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
383a0 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  CT");.  }..  /* 
383b0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
383c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
383d0 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  then we need to 
383e0 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73  sort the results
383f0 0a 20 20 2a 2a 20 61 6e 64 20