/ Hex Artifact Content
Login

Artifact f8ce94703bd9a4058202d1858c3bf0041a7e3badf58e545ffe3b6500823cd50f:


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 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
4f60: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
4f70: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61  akeRecord, regBa
4f80: 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65  se+nOBSat, nBase
4f90: 2d 6e 4f 42 53 61 74 2c 20 72 65 67 52 65 63 6f  -nOBSat, regReco
4fa0: 72 64 29 3b 0a 20 20 69 66 28 20 6e 4f 42 53 61  rd);.  if( nOBSa
4fb0: 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  t>0 ){.    int r
4fc0: 65 67 50 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20  egPrevKey;   /* 
4fd0: 54 68 65 20 66 69 72 73 74 20 6e 4f 42 53 61 74  The first nOBSat
4fe0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
4ff0: 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a  previous row */.
5000: 20 20 20 20 69 6e 74 20 61 64 64 72 46 69 72 73      int addrFirs
5010: 74 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  t;    /* Address
5020: 20 6f 66 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74   of the OP_IfNot
5030: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69   opcode */.    i
5040: 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20 20 20 20  nt addrJmp;     
5050: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
5060: 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64  he OP_Jump opcod
5070: 65 20 2a 2f 0a 20 20 20 20 56 64 62 65 4f 70 20  e */.    VdbeOp 
5080: 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70  *pOp;      /* Op
5090: 63 6f 64 65 20 74 68 61 74 20 6f 70 65 6e 73 20  code that opens 
50a0: 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20  the sorter */.  
50b0: 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20    int nKey;     
50c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
50d0: 20 73 6f 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c   sorting key col
50e0: 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20  umns, including 
50f0: 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20  OP_Sequence */. 
5100: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b     KeyInfo *pKI;
5110: 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
5120: 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20   KeyInfo on the 
5130: 73 6f 72 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  sorter table */.
5140: 0a 20 20 20 20 72 65 67 50 72 65 76 4b 65 79 20  .    regPrevKey 
5150: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
5160: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
5170: 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42  em += pSort->nOB
5180: 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  Sat;.    nKey = 
5190: 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e  nExpr - pSort->n
51a0: 4f 42 53 61 74 20 2b 20 62 53 65 71 3b 0a 20 20  OBSat + bSeq;.  
51b0: 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20    if( bSeq ){.  
51c0: 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20      addrFirst = 
51d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
51e0: 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72  1(v, OP_IfNot, r
51f0: 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 20 0a  egBase+nExpr); .
5200: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5210: 20 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c   addrFirst = sql
5220: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
5230: 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 54 65 73  , OP_SequenceTes
5240: 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  t, pSort->iECurs
5250: 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56  or);.    }.    V
5260: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
5270: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5280: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp3(v, OP_Comp
5290: 61 72 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c  are, regPrevKey,
52a0: 20 72 65 67 42 61 73 65 2c 20 70 53 6f 72 74 2d   regBase, pSort-
52b0: 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 70 4f  >nOBSat);.    pO
52c0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
52d0: 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e 61  etOp(v, pSort->a
52e0: 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20  ddrSortIndex);. 
52f0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64     if( pParse->d
5300: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5310: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4f  ) return;.    pO
5320: 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20 2b 20 6e  p->p2 = nKey + n
5330: 44 61 74 61 3b 0a 20 20 20 20 70 4b 49 20 3d 20  Data;.    pKI = 
5340: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
5350: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4b 49  ;.    memset(pKI
5360: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 30 2c  ->aSortOrder, 0,
5370: 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64 29   pKI->nKeyField)
5380: 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a 75  ; /* Makes OP_Ju
5390: 6d 70 20 74 65 73 74 61 62 6c 65 20 2a 2f 0a 20  mp testable */. 
53a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
53b0: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
53c0: 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b 45 59  har*)pKI, P4_KEY
53d0: 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65 73 74 63  INFO);.    testc
53e0: 61 73 65 28 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69  ase( pKI->nAllFi
53f0: 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e 4b 65 79 46  eld > pKI->nKeyF
5400: 69 65 6c 64 2b 32 20 29 3b 0a 20 20 20 20 70 4f  ield+2 );.    pO
5410: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d  p->p4.pKeyInfo =
5420: 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
5430: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f  List(pParse, pSo
5440: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 6e 4f  rt->pOrderBy, nO
5450: 42 53 61 74 2c 0a 20 20 20 20 20 20 20 20 20 20  BSat,.          
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 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2d   pKI->nAllField-
5490: 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64 2d 31  pKI->nKeyField-1
54a0: 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d 70 20 3d  );.    addrJmp =
54b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
54c0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
54d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
54e0: 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
54f0: 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61 64 64 72  drJmp+1, 0, addr
5500: 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65  Jmp+1); VdbeCove
5510: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 70 53 6f  rage(v);.    pSo
5520: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 3d  rt->labelBkOut =
5530: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
5540: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 70 53  Label(v);.    pS
5550: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  ort->regReturn =
5560: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
5570: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5580: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
5590: 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65  ub, pSort->regRe
55a0: 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62  turn, pSort->lab
55b0: 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71  elBkOut);.    sq
55c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
55d0: 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65  v, OP_ResetSorte
55e0: 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  r, pSort->iECurs
55f0: 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 69  or);.    if( iLi
5600: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  mit ){.      sql
5610: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5620: 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d  , OP_IfNot, iLim
5630: 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  it, pSort->label
5640: 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62  Done);.      Vdb
5650: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
5660: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
5670: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
5680: 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 73  ddrFirst);.    s
5690: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
56a0: 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ve(pParse, regBa
56b0: 73 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20  se, regPrevKey, 
56c0: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a  pSort->nOBSat);.
56d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
56e0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a  umpHere(v, addrJ
56f0: 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  mp);.  }.  if( p
5700: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
5710: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
5720: 72 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d  rter ){.    op =
5730: 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74   OP_SorterInsert
5740: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
5750: 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  p = OP_IdxInsert
5760: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
5770: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
5780: 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  op, pSort->iECur
5790: 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a  sor, regRecord,.
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57b0: 20 20 20 20 20 20 20 72 65 67 42 61 73 65 2b 6e         regBase+n
57c0: 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42  OBSat, nBase-nOB
57d0: 53 61 74 29 3b 0a 20 20 69 66 28 20 69 4c 69 6d  Sat);.  if( iLim
57e0: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  it ){.    int ad
57f0: 64 72 3b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d  dr;.    int r1 =
5800: 20 30 3b 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20   0;.    /* Fill 
5810: 74 68 65 20 73 6f 72 74 65 72 20 75 6e 74 69 6c  the sorter until
5820: 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 4c 49 4d   it contains LIM
5830: 49 54 2b 4f 46 46 53 45 54 20 65 6e 74 72 69 65  IT+OFFSET entrie
5840: 73 2e 20 20 28 54 68 65 20 69 4c 69 6d 69 74 0a  s.  (The iLimit.
5850: 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72 20      ** register 
5860: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77  is initialized w
5870: 69 74 68 20 76 61 6c 75 65 20 6f 66 20 4c 49 4d  ith value of LIM
5880: 49 54 2b 4f 46 46 53 45 54 2e 29 20 20 41 66 74  IT+OFFSET.)  Aft
5890: 65 72 20 74 68 65 20 73 6f 72 74 65 72 0a 20 20  er the sorter.  
58a0: 20 20 2a 2a 20 66 69 6c 6c 73 20 75 70 2c 20 64    ** fills up, d
58b0: 65 6c 65 74 65 20 74 68 65 20 6c 65 61 73 74 20  elete the least 
58c0: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 73 6f 72  entry in the sor
58d0: 74 65 72 20 61 66 74 65 72 20 65 61 63 68 20 69  ter after each i
58e0: 6e 73 65 72 74 2e 0a 20 20 20 20 2a 2a 20 54 68  nsert..    ** Th
58f0: 75 73 20 77 65 20 6e 65 76 65 72 20 68 6f 6c 64  us we never hold
5900: 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 4c   more than the L
5910: 49 4d 49 54 2b 4f 46 46 53 45 54 20 72 6f 77 73  IMIT+OFFSET rows
5920: 20 69 6e 20 6d 65 6d 6f 72 79 20 61 74 20 6f 6e   in memory at on
5930: 63 65 20 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d  ce */.    addr =
5940: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5950: 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65  p1(v, OP_IfNotZe
5960: 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62  ro, iLimit); Vdb
5970: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
5980: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5990: 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20  Op1(v, OP_Last, 
59a0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29  pSort->iECursor)
59b0: 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d  ;.    if( pSort-
59c0: 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  >bOrderedInnerLo
59d0: 6f 70 20 29 7b 0a 20 20 20 20 20 20 72 31 20 3d  op ){.      r1 =
59e0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
59f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5a00: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
5a10: 6f 6c 75 6d 6e 2c 20 70 53 6f 72 74 2d 3e 69 45  olumn, pSort->iE
5a20: 43 75 72 73 6f 72 2c 20 6e 45 78 70 72 2c 20 72  Cursor, nExpr, r
5a30: 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
5a40: 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 71 22 29  mment((v, "seq")
5a50: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
5a60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
5a70: 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 53 6f  , OP_Delete, pSo
5a80: 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  rt->iECursor);. 
5a90: 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 62 4f     if( pSort->bO
5aa0: 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20  rderedInnerLoop 
5ab0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
5ac0: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69 73  he inner loop is
5ad0: 20 64 72 69 76 65 6e 20 62 79 20 61 6e 20 69 6e   driven by an in
5ae0: 64 65 78 20 73 75 63 68 20 74 68 61 74 20 76 61  dex such that va
5af0: 6c 75 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 20  lues from.      
5b00: 2a 2a 20 74 68 65 20 73 61 6d 65 20 69 74 65 72  ** the same iter
5b10: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e  ation of the inn
5b20: 65 72 20 6c 6f 6f 70 20 61 72 65 20 69 6e 20 73  er loop are in s
5b30: 6f 72 74 65 64 20 6f 72 64 65 72 2c 20 74 68 65  orted order, the
5b40: 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64  n.      ** immed
5b50: 69 61 74 65 6c 79 20 6a 75 6d 70 20 74 6f 20 74  iately jump to t
5b60: 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
5b70: 6e 20 6f 66 20 61 6e 20 69 6e 6e 65 72 20 6c 6f  n of an inner lo
5b80: 6f 70 20 69 66 20 74 68 65 0a 20 20 20 20 20 20  op if the.      
5b90: 2a 2a 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  ** entry from th
5ba0: 65 20 63 75 72 72 65 6e 74 20 69 74 65 72 61 74  e current iterat
5bb0: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 66 69 74  ion does not fit
5bc0: 20 69 6e 74 6f 20 74 68 65 20 74 6f 70 0a 20 20   into the top.  
5bd0: 20 20 20 20 2a 2a 20 4c 49 4d 49 54 2b 4f 46 46      ** LIMIT+OFF
5be0: 53 45 54 20 65 6e 74 72 69 65 73 20 6f 66 20 74  SET entries of t
5bf0: 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20  he sorter. */.  
5c00: 20 20 20 20 69 6e 74 20 69 42 72 6b 20 3d 20 73      int iBrk = s
5c10: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
5c20: 74 41 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20  tAddr(v) + 2;.  
5c30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5c40: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20  ddOp3(v, OP_Eq, 
5c50: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2c 20 69  regBase+nExpr, i
5c60: 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Brk, r1);.      
5c70: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
5c80: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55  eP5(v, SQLITE_NU
5c90: 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
5ca0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
5cb0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
5cc0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
5cd0: 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ddr);.  }.}../*.
5ce0: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69  ** Add code to i
5cf0: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46  mplement the OFF
5d00: 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  SET.*/.static vo
5d10: 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20  id codeOffset(. 
5d20: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
5d30: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
5d40: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
5d50: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   */.  int iOffse
5d60: 74 2c 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  t,      /* Regis
5d70: 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ter holding the 
5d80: 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72 20 2a  offset counter *
5d90: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
5da0: 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65  e     /* Jump he
5db0: 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63  re to skip the c
5dc0: 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f  urrent record */
5dd0: 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66 66 73 65  .){.  if( iOffse
5de0: 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t>0 ){.    sqlit
5df0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5e00: 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65  OP_IfPos, iOffse
5e10: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 31 29  t, iContinue, 1)
5e20: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
5e30: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
5e40: 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 22 29  nt((v, "OFFSET")
5e50: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5e60: 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69  Add code that wi
5e70: 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ll check to make
5e80: 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67 69   sure the N regi
5e90: 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
5ea0: 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61  t iMem.** form a
5eb0: 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e   distinct entry.
5ec0: 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74    iTab is a sort
5ed0: 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68  ing index that h
5ee0: 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a  olds previously.
5ef0: 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74  ** seen combinat
5f00: 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61  ions of the N va
5f10: 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74  lues.  A new ent
5f20: 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54  ry is made in iT
5f30: 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72  ab.** if the cur
5f40: 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72  rent N values ar
5f50: 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  e new..**.** A j
5f60: 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61  ump to addrRepea
5f70: 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68  t is made and th
5f80: 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65  e N+1 values are
5f90: 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
5fa0: 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65  .** stack if the
5fb0: 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20   top N elements 
5fc0: 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74  are not distinct
5fd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5fe0: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20   codeDistinct(. 
5ff0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6000: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
6010: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
6020: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
6030: 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20  int iTab,       
6040: 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20     /* A sorting 
6050: 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65  index used to te
6060: 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e  st for distinctn
6070: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ess */.  int add
6080: 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a  rRepeat,    /* J
6090: 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e  ump to here if n
60a0: 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  ot distinct */. 
60b0: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
60c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
60d0: 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   elements */.  i
60e0: 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20  nt iMem         
60f0: 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65    /* First eleme
6100: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  nt */.){.  Vdbe 
6110: 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20  *v;.  int r1;.. 
6120: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
6130: 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74  be;.  r1 = sqlit
6140: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
6150: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
6160: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
6170: 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20  OP_Found, iTab, 
6180: 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d  addrRepeat, iMem
6190: 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , N); VdbeCovera
61a0: 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
61b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
61c0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65  _MakeRecord, iMe
61d0: 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c  m, N, r1);.  sql
61e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
61f0: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
6200: 74 2c 20 69 54 61 62 2c 20 72 31 2c 20 69 4d 65  t, iTab, r1, iMe
6210: 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  m, N);.  sqlite3
6220: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6230: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
6240: 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  SULT);.  sqlite3
6250: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
6260: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23  Parse, r1);.}..#
6270: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6280: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
6290: 45 4e 43 45 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ENCES./*.** This
62a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
62b0: 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 69  led as part of i
62c0: 6e 6e 65 72 2d 6c 6f 6f 70 20 67 65 6e 65 72 61  nner-loop genera
62d0: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
62e0: 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77  T.** statement w
62f0: 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
6300: 74 68 61 74 20 69 73 20 6e 6f 74 20 6f 70 74 69  that is not opti
6310: 6d 69 7a 65 64 20 62 79 20 61 6e 20 69 6e 64 65  mized by an inde
6320: 78 2e 20 49 74 20 0a 2a 2a 20 64 65 74 65 72 6d  x. It .** determ
6330: 69 6e 65 73 20 74 68 65 20 65 78 70 72 65 73 73  ines the express
6340: 69 6f 6e 73 2c 20 69 66 20 61 6e 79 2c 20 74 68  ions, if any, th
6350: 61 74 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65  at the sorter-re
6360: 66 65 72 65 6e 63 65 20 0a 2a 2a 20 6f 70 74 69  ference .** opti
6370: 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20  mization should 
6380: 62 65 20 75 73 65 64 20 66 6f 72 2e 20 54 68 65  be used for. The
6390: 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63   sorter-referenc
63a0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
63b0: 2a 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  * is used for SE
63c0: 4c 45 43 54 20 71 75 65 72 69 65 73 20 6c 69 6b  LECT queries lik
63d0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  e:.**.**   SELEC
63e0: 54 20 61 2c 20 62 69 67 62 6c 6f 62 20 46 52 4f  T a, bigblob FRO
63f0: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 20  M t1 ORDER BY a 
6400: 4c 49 4d 49 54 20 31 30 0a 2a 2a 0a 2a 2a 20 49  LIMIT 10.**.** I
6410: 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
6420: 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  on is used for e
6430: 78 70 72 65 73 73 69 6f 6e 20 22 62 69 67 62 6c  xpression "bigbl
6440: 6f 62 22 2c 20 74 68 65 6e 20 69 6e 73 74 65 61  ob", then instea
6450: 64 20 6f 66 0a 2a 2a 20 73 74 6f 72 69 6e 67 20  d of.** storing 
6460: 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
6470: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20   that column in 
6480: 74 68 65 20 73 6f 72 74 65 72 20 72 65 63 6f 72  the sorter recor
6490: 64 73 2c 20 74 68 65 20 50 4b 20 6f 66 0a 2a 2a  ds, the PK of.**
64a0: 20 74 68 65 20 72 6f 77 20 66 72 6f 6d 20 74 61   the row from ta
64b0: 62 6c 65 20 74 31 20 69 73 20 73 74 6f 72 65 64  ble t1 is stored
64c0: 20 69 6e 73 74 65 61 64 2e 20 54 68 65 6e 2c 20   instead. Then, 
64d0: 61 73 20 72 65 63 6f 72 64 73 20 61 72 65 20 65  as records are e
64e0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 0a 2a 2a  xtracted from.**
64f0: 20 74 68 65 20 73 6f 72 74 65 72 20 74 6f 20 72   the sorter to r
6500: 65 74 75 72 6e 20 74 6f 20 74 68 65 20 75 73 65  eturn to the use
6510: 72 2c 20 74 68 65 20 72 65 71 75 69 72 65 64 20  r, the required 
6520: 76 61 6c 75 65 20 6f 66 20 62 69 67 62 6c 6f 62  value of bigblob
6530: 20 69 73 0a 2a 2a 20 72 65 74 72 69 65 76 65 64   is.** retrieved
6540: 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
6550: 61 62 6c 65 20 74 31 2e 20 49 66 20 74 68 65 20  able t1. If the 
6560: 76 61 6c 75 65 73 20 61 72 65 20 76 65 72 79 20  values are very 
6570: 6c 61 72 67 65 2c 20 74 68 69 73 20 0a 2a 2a 20  large, this .** 
6580: 63 61 6e 20 62 65 20 6d 6f 72 65 20 65 66 66 69  can be more effi
6590: 63 69 65 6e 74 20 74 68 61 6e 20 73 74 6f 72 69  cient than stori
65a0: 6e 67 20 74 68 65 6d 20 64 69 72 65 63 74 6c 79  ng them directly
65b0: 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20 72   in the sorter r
65c0: 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ecords..**.** Th
65d0: 65 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2e  e ExprList_item.
65e0: 62 53 6f 72 74 65 72 52 65 66 20 66 6c 61 67 20  bSorterRef flag 
65f0: 69 73 20 73 65 74 20 66 6f 72 20 65 61 63 68 20  is set for each 
6600: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 70 45  expression in pE
6610: 4c 69 73 74 20 0a 2a 2a 20 66 6f 72 20 77 68 69  List .** for whi
6620: 63 68 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65  ch the sorter-re
6630: 66 65 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ference optimiza
6640: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 65  tion should be e
6650: 6e 61 62 6c 65 64 2e 20 0a 2a 2a 20 41 64 64 69  nabled. .** Addi
6660: 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 70 53  tionally, the pS
6670: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 5d 20 61 72  ort->aDefer[] ar
6680: 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ray is populated
6690: 20 77 69 74 68 20 65 6e 74 72 69 65 73 0a 2a 2a   with entries.**
66a0: 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73   for all cursors
66b0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 76 61   required to eva
66c0: 6c 75 61 74 65 20 61 6c 6c 20 73 65 6c 65 63 74  luate all select
66d0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  ed expressions. 
66e0: 46 69 6e 61 6c 6c 79 2e 0a 2a 2a 20 6f 75 74 70  Finally..** outp
66f0: 75 74 20 76 61 72 69 61 62 6c 65 20 28 2a 70 70  ut variable (*pp
6700: 45 78 74 72 61 29 20 69 73 20 73 65 74 20 74 6f  Extra) is set to
6710: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
6720: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  ist containing.*
6730: 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  * expressions fo
6740: 72 20 61 6c 6c 20 65 78 74 72 61 20 50 4b 20 76  r all extra PK v
6750: 61 6c 75 65 73 20 74 68 61 74 20 73 68 6f 75 6c  alues that shoul
6760: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
6770: 68 65 0a 2a 2a 20 73 6f 72 74 65 72 20 72 65 63  he.** sorter rec
6780: 6f 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ords..*/.static 
6790: 76 6f 69 64 20 73 65 6c 65 63 74 45 78 70 72 44  void selectExprD
67a0: 65 66 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  efer(.  Parse *p
67b0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
67c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65          /* Leave
67d0: 20 61 6e 79 20 65 72 72 6f 72 20 68 65 72 65 20   any error here 
67e0: 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53  */.  SortCtx *pS
67f0: 6f 72 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ort,            
6800: 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 63       /* Sorter c
6810: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
6820: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
6830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
6840: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 73 74 69  xpressions desti
6850: 6e 65 64 20 66 6f 72 20 73 6f 72 74 65 72 20 2a  ned for sorter *
6860: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  /.  ExprList **p
6870: 70 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  pExtra          
6880: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6890: 6e 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  ns to append to 
68a0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
68b0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
68c0: 6e 74 20 6e 44 65 66 65 72 20 3d 20 30 3b 0a 20  nt nDefer = 0;. 
68d0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78 74 72   ExprList *pExtr
68e0: 61 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  a = 0;.  for(i=0
68f0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
6900: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  r; i++){.    str
6910: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
6920: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 45 4c 69  m *pItem = &pELi
6930: 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 69 66  st->a[i];.    if
6940: 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
6950: 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 7b 0a 20  derByCol==0 ){. 
6960: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
6970: 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
6980: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
6990: 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62  ab = pExpr->pTab
69a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
69b0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
69c0: 20 26 26 20 70 54 61 62 20 26 26 20 21 49 73 56   && pTab && !IsV
69d0: 69 72 74 75 61 6c 28 70 54 61 62 29 0a 20 20 20  irtual(pTab).   
69e0: 20 20 20 20 26 26 20 28 70 54 61 62 2d 3e 61 43      && (pTab->aC
69f0: 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ol[pExpr->iColum
6a00: 6e 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f  n].colFlags & CO
6a10: 4c 46 4c 41 47 5f 53 4f 52 54 45 52 52 45 46 29  LFLAG_SORTERREF)
6a20: 0a 23 69 66 20 30 0a 20 20 20 20 20 20 20 20 20  .#if 0.         
6a30: 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d   && pTab->pSchem
6a40: 61 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  a && pTab->pSele
6a50: 63 74 3d 3d 30 20 26 26 20 21 49 73 56 69 72 74  ct==0 && !IsVirt
6a60: 75 61 6c 28 70 54 61 62 29 0a 23 65 6e 64 69 66  ual(pTab).#endif
6a70: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
6a80: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
6a90: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 44 65 66   for(j=0; j<nDef
6aa0: 65 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  er; j++){.      
6ab0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 61      if( pSort->a
6ac0: 44 65 66 65 72 5b 6a 5d 2e 69 43 73 72 3d 3d 70  Defer[j].iCsr==p
6ad0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 20 62  Expr->iTable ) b
6ae0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
6af0: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e          if( j==n
6b00: 44 65 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Defer ){.       
6b10: 20 20 20 69 66 28 20 6e 44 65 66 65 72 3d 3d 41     if( nDefer==A
6b20: 72 72 61 79 53 69 7a 65 28 70 53 6f 72 74 2d 3e  rraySize(pSort->
6b30: 61 44 65 66 65 72 29 20 29 7b 0a 20 20 20 20 20  aDefer) ){.     
6b40: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
6b50: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
6b60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
6b70: 74 20 6e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  t nKey = 1;.    
6b80: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
6b90: 20 20 20 20 20 20 20 20 20 20 20 49 6e 64 65 78             Index
6ba0: 20 2a 70 50 6b 20 3d 20 30 3b 0a 20 20 20 20 20   *pPk = 0;.     
6bb0: 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52         if( !HasR
6bc0: 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
6bd0: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 6b 20              pPk 
6be0: 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
6bf0: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4b                nK
6c10: 65 79 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  ey = pPk->nKeyCo
6c20: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l;.            }
6c30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
6c40: 28 6b 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b  (k=0; k<nKey; k+
6c50: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
6c60: 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
6c70: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
6c80: 73 65 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30  se, TK_COLUMN, 0
6c90: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
6ca0: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cc0: 70 4e 65 77 2d 3e 69 54 61 62 6c 65 20 3d 20 70  pNew->iTable = p
6cd0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
6cf0: 65 77 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72  ew->pTab = pExpr
6d00: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
6d10: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 43          pNew->iC
6d20: 6f 6c 75 6d 6e 20 3d 20 70 50 6b 20 3f 20 70 50  olumn = pPk ? pP
6d30: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 3a  k->aiColumn[k] :
6d40: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
6d50: 20 20 20 20 20 70 45 78 74 72 61 20 3d 20 73 71       pExtra = sq
6d60: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
6d70: 65 6e 64 28 70 50 61 72 73 65 2c 20 70 45 78 74  end(pParse, pExt
6d80: 72 61 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  ra, pNew);.     
6d90: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6da0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6db0: 20 20 20 20 20 70 53 6f 72 74 2d 3e 61 44 65 66       pSort->aDef
6dc0: 65 72 5b 6e 44 65 66 65 72 5d 2e 70 54 61 62 20  er[nDefer].pTab 
6dd0: 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  = pExpr->pTab;. 
6de0: 20 20 20 20 20 20 20 20 20 20 20 70 53 6f 72 74             pSort
6df0: 2d 3e 61 44 65 66 65 72 5b 6e 44 65 66 65 72 5d  ->aDefer[nDefer]
6e00: 2e 69 43 73 72 20 3d 20 70 45 78 70 72 2d 3e 69  .iCsr = pExpr->i
6e10: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
6e20: 20 20 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72     pSort->aDefer
6e30: 5b 6e 44 65 66 65 72 5d 2e 6e 4b 65 79 20 3d 20  [nDefer].nKey = 
6e40: 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nKey;.          
6e50: 20 20 6e 44 65 66 65 72 2b 2b 3b 0a 20 20 20 20    nDefer++;.    
6e60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6e70: 7d 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  }.        pItem-
6e80: 3e 62 53 6f 72 74 65 72 52 65 66 20 3d 20 31 3b  >bSorterRef = 1;
6e90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6ea0: 20 7d 0a 20 20 70 53 6f 72 74 2d 3e 6e 44 65 66   }.  pSort->nDef
6eb0: 65 72 20 3d 20 28 75 38 29 6e 44 65 66 65 72 3b  er = (u8)nDefer;
6ec0: 0a 20 20 2a 70 70 45 78 74 72 61 20 3d 20 70 45  .  *ppExtra = pE
6ed0: 78 74 72 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  xtra;.}.#endif..
6ee0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
6ef0: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
6f00: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
6f10: 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65  side of the inne
6f20: 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53  r loop.** of a S
6f30: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ELECT..**.** If 
6f40: 73 72 63 54 61 62 20 69 73 20 6e 65 67 61 74 69  srcTab is negati
6f50: 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70 2d 3e  ve, then the p->
6f60: 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f  pEList expressio
6f70: 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61  ns.** are evalua
6f80: 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
6f90: 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72  get the data for
6fa0: 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73   this row.  If s
6fb0: 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f  rcTab is.** zero
6fc0: 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64   or more, then d
6fd0: 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72  ata is pulled fr
6fe0: 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 2d  om srcTab and p-
6ff0: 3e 70 45 4c 69 73 74 20 69 73 20 75 73 65 64 20  >pEList is used 
7000: 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20  only .** to get 
7010: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
7020: 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 63 6f  lumns and the co
7030: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
7040: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
7050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7060: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
7070: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
7080: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
7090: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
70a0: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
70b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
70c0: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
70d0: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
70e0: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
70f0: 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20   int srcTab,    
7100: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c           /* Pull
7110: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20   data from this 
7120: 74 61 62 6c 65 20 69 66 20 6e 6f 6e 2d 6e 65 67  table if non-neg
7130: 61 74 69 76 65 20 2a 2f 0a 20 20 53 6f 72 74 43  ative */.  SortC
7140: 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20  tx *pSort,      
7150: 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c     /* If not NUL
7160: 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  L, info on how t
7170: 6f 20 70 72 6f 63 65 73 73 20 4f 52 44 45 52 20  o process ORDER 
7180: 42 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74  BY */.  Distinct
7190: 43 74 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20  Ctx *pDistinct, 
71a0: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
71b0: 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70  info on how to p
71c0: 72 6f 63 65 73 73 20 44 49 53 54 49 4e 43 54 20  rocess DISTINCT 
71d0: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
71e0: 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20  *pDest,      /* 
71f0: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
7200: 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  f the results */
7210: 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
7220: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ,          /* Ju
7230: 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
7240: 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f  nue with next ro
7250: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  w */.  int iBrea
7260: 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
7270: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
7280: 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
7290: 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b  inner loop */.){
72a0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
72b0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
72c0: 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69  t i;.  int hasDi
72d0: 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20  stinct;         
72e0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
72f0: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
7300: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
7310: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
7320: 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f  Dest->eDest;   /
7330: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
7340: 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20   of results */. 
7350: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
7360: 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20  st->iSDParm; /* 
7370: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
7380: 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f  o disposal metho
7390: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75  d */.  int nResu
73a0: 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  ltCol;          
73b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
73c0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a  result columns *
73d0: 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52  /.  int nPrefixR
73e0: 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
73f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
7400: 72 61 20 72 65 67 69 73 74 65 72 73 20 62 65 66  ra registers bef
7410: 6f 72 65 20 72 65 67 52 65 73 75 6c 74 20 2a 2f  ore regResult */
7420: 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 2c 20  ..  /* Usually, 
7430: 72 65 67 52 65 73 75 6c 74 20 69 73 20 74 68 65  regResult is the
7440: 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 61   first cell in a
7450: 6e 20 61 72 72 61 79 20 6f 66 20 6d 65 6d 6f 72  n array of memor
7460: 79 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 63 6f 6e  y cells.  ** con
7470: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72  taining the curr
7480: 65 6e 74 20 72 65 73 75 6c 74 20 72 6f 77 2e 20  ent result row. 
7490: 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 67  In this case reg
74a0: 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f 20 74  Orig is set to t
74b0: 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c  he.  ** same val
74c0: 75 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ue. However, if 
74d0: 74 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  the results are 
74e0: 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 74 68  being sent to th
74f0: 65 20 73 6f 72 74 65 72 2c 20 74 68 65 0a 20 20  e sorter, the.  
7500: 2a 2a 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6e  ** values for an
7510: 79 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  y expressions th
7520: 61 74 20 61 72 65 20 61 6c 73 6f 20 70 61 72 74  at are also part
7530: 20 6f 66 20 74 68 65 20 73 6f 72 74 2d 6b 65 79   of the sort-key
7540: 20 61 72 65 20 6f 6d 69 74 74 65 64 0a 20 20 2a   are omitted.  *
7550: 2a 20 66 72 6f 6d 20 74 68 69 73 20 61 72 72 61  * from this arra
7560: 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  y. In this case 
7570: 72 65 67 4f 72 69 67 20 69 73 20 73 65 74 20 74  regOrig is set t
7580: 6f 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20 20 69 6e  o zero.  */.  in
7590: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
75a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
75b0: 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c  rt of memory hol
75c0: 64 69 6e 67 20 63 75 72 72 65 6e 74 20 72 65 73  ding current res
75d0: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ults */.  int re
75e0: 67 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  gOrig;          
75f0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
7600: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
7610: 20 66 75 6c 6c 20 72 65 73 75 6c 74 20 28 6f 72   full result (or
7620: 20 30 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74   0) */..  assert
7630: 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ( v );.  assert(
7640: 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b   p->pEList!=0 );
7650: 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d  .  hasDistinct =
7660: 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69   pDistinct ? pDi
7670: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
7680: 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e : WHERE_DISTIN
7690: 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70  CT_NOOP;.  if( p
76a0: 53 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70  Sort && pSort->p
76b0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f  OrderBy==0 ) pSo
76c0: 72 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53  rt = 0;.  if( pS
76d0: 6f 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69  ort==0 && !hasDi
76e0: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73  stinct ){.    as
76f0: 73 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21  sert( iContinue!
7700: 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66  =0 );.    codeOf
7710: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
7720: 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  et, iContinue);.
7730: 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74    }..  /* Pull t
7740: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
7750: 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65  umns..  */.  nRe
7760: 73 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c  sultCol = p->pEL
7770: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69  ist->nExpr;..  i
7780: 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d  f( pDest->iSdst=
7790: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  =0 ){.    if( pS
77a0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 72  ort ){.      nPr
77b0: 65 66 69 78 52 65 67 20 3d 20 70 53 6f 72 74 2d  efixReg = pSort-
77c0: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
77d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 28 70 53  ;.      if( !(pS
77e0: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
77f0: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
7800: 74 65 72 29 20 29 20 6e 50 72 65 66 69 78 52 65  ter) ) nPrefixRe
7810: 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73  g++;.      pPars
7820: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66  e->nMem += nPref
7830: 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20  ixReg;.    }.   
7840: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
7850: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
7860: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
7870: 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a   += nResultCol;.
7880: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73    }else if( pDes
7890: 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75 6c 74  t->iSdst+nResult
78a0: 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d  Col > pParse->nM
78b0: 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  em ){.    /* Thi
78c0: 73 20 69 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  s is an error co
78d0: 6e 64 69 74 69 6f 6e 20 74 68 61 74 20 63 61 6e  ndition that can
78e0: 20 72 65 73 75 6c 74 2c 20 66 6f 72 20 65 78 61   result, for exa
78f0: 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 53 45 4c  mple, when a SEL
7900: 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  ECT.    ** on th
7910: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
7920: 65 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 63  e of an INSERT c
7930: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72 65 73  ontains more res
7940: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e  ult columns than
7950: 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 61 72  .    ** there ar
7960: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
7970: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65   table on the le
7980: 66 74 2e 20 20 54 68 65 20 65 72 72 6f 72 20 77  ft.  The error w
7990: 69 6c 6c 20 62 65 20 63 61 75 67 68 74 0a 20 20  ill be caught.  
79a0: 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 65    ** and reporte
79b0: 64 20 6c 61 74 65 72 2e 20 20 42 75 74 20 77 65  d later.  But we
79c0: 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   need to make su
79d0: 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79  re enough memory
79e0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   is allocated.  
79f0: 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74    ** to avoid ot
7a00: 68 65 72 20 73 70 75 72 69 6f 75 73 20 65 72 72  her spurious err
7a10: 6f 72 73 20 69 6e 20 74 68 65 20 6d 65 61 6e 74  ors in the meant
7a20: 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72  ime. */.    pPar
7a30: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73  se->nMem += nRes
7a40: 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44  ultCol;.  }.  pD
7a50: 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65  est->nSdst = nRe
7a60: 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67 4f 72  sultCol;.  regOr
7a70: 69 67 20 3d 20 72 65 67 52 65 73 75 6c 74 20 3d  ig = regResult =
7a80: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20   pDest->iSdst;. 
7a90: 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20 29   if( srcTab>=0 )
7aa0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
7ab0: 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b  <nResultCol; i++
7ac0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7ad0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7ae0: 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c  _Column, srcTab,
7af0: 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29   i, regResult+i)
7b00: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
7b10: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 2d  ent((v, "%s", p-
7b20: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  >pEList->a[i].zN
7b30: 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ame));.    }.  }
7b40: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d  else if( eDest!=
7b50: 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 23 69  SRT_Exists ){.#i
7b60: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7b70: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
7b80: 4e 43 45 53 0a 20 20 20 20 45 78 70 72 4c 69 73  NCES.    ExprLis
7b90: 74 20 2a 70 45 78 74 72 61 20 3d 20 30 3b 0a 23  t *pExtra = 0;.#
7ba0: 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20  endif.    /* If 
7bb0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
7bc0: 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e  is an EXISTS(...
7bd0: 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  ) expression, th
7be0: 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20  e actual.    ** 
7bf0: 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20  values returned 
7c00: 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72  by the SELECT ar
7c10: 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  e not required..
7c20: 20 20 20 20 2a 2f 0a 20 20 20 20 75 38 20 65 63      */.    u8 ec
7c30: 65 6c 46 6c 61 67 73 3b 0a 20 20 20 20 69 66 28  elFlags;.    if(
7c40: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20   eDest==SRT_Mem 
7c50: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  || eDest==SRT_Ou
7c60: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
7c70: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
7c80: 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20        ecelFlags 
7c90: 3d 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  = SQLITE_ECEL_DU
7ca0: 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  P;.    }else{.  
7cb0: 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20      ecelFlags = 
7cc0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
7cd0: 20 70 53 6f 72 74 20 26 26 20 68 61 73 44 69 73   pSort && hasDis
7ce0: 74 69 6e 63 74 3d 3d 30 20 26 26 20 65 44 65 73  tinct==0 && eDes
7cf0: 74 21 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t!=SRT_EphemTab 
7d00: 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f 54 61  && eDest!=SRT_Ta
7d10: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ble ){.      /* 
7d20: 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  For each express
7d30: 69 6f 6e 20 69 6e 20 70 2d 3e 70 45 4c 69 73 74  ion in p->pEList
7d40: 20 74 68 61 74 20 69 73 20 61 20 63 6f 70 79 20   that is a copy 
7d50: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
7d60: 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   in.      ** the
7d70: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
7d80: 20 28 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42   (pSort->pOrderB
7d90: 79 29 2c 20 73 65 74 20 74 68 65 20 61 73 73 6f  y), set the asso
7da0: 63 69 61 74 65 64 20 0a 20 20 20 20 20 20 2a 2a  ciated .      **
7db0: 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c   iOrderByCol val
7dc0: 75 65 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74  ue to one more t
7dd0: 68 61 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  han the index of
7de0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 0a 20   the ORDER BY . 
7df0: 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
7e00: 6f 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 6f  on within the so
7e10: 72 74 2d 6b 65 79 20 74 68 61 74 20 70 75 73 68  rt-key that push
7e20: 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20 77 69 6c  OntoSorter() wil
7e30: 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20  l generate..    
7e40: 20 20 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73    ** This allows
7e50: 20 74 68 65 20 70 2d 3e 70 45 4c 69 73 74 20 66   the p->pEList f
7e60: 69 65 6c 64 20 74 6f 20 62 65 20 6f 6d 69 74 74  ield to be omitt
7e70: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74  ed from the sort
7e80: 65 64 20 72 65 63 6f 72 64 2c 0a 20 20 20 20 20  ed record,.     
7e90: 20 2a 2a 20 73 61 76 69 6e 67 20 73 70 61 63 65   ** saving space
7ea0: 20 61 6e 64 20 43 50 55 20 63 79 63 6c 65 73 2e   and CPU cycles.
7eb0: 20 20 2a 2f 0a 20 20 20 20 20 20 65 63 65 6c 46    */.      ecelF
7ec0: 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f  lags |= (SQLITE_
7ed0: 45 43 45 4c 5f 4f 4d 49 54 52 45 46 7c 53 51 4c  ECEL_OMITREF|SQL
7ee0: 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 3b 0a 20  ITE_ECEL_REF);. 
7ef0: 20 20 20 20 20 66 6f 72 28 69 3d 70 53 6f 72 74       for(i=pSort
7f00: 2d 3e 6e 4f 42 53 61 74 3b 20 69 3c 70 53 6f 72  ->nOBSat; i<pSor
7f10: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
7f20: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
7f30: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
7f40: 20 69 66 28 20 28 6a 20 3d 20 70 53 6f 72 74 2d   if( (j = pSort-
7f50: 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  >pOrderBy->a[i].
7f60: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29  u.x.iOrderByCol)
7f70: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
7f80: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 2d 31  p->pEList->a[j-1
7f90: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
7fa0: 6c 20 3d 20 69 2b 31 2d 70 53 6f 72 74 2d 3e 6e  l = i+1-pSort->n
7fb0: 4f 42 53 61 74 3b 0a 20 20 20 20 20 20 20 20 7d  OBSat;.        }
7fc0: 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
7fd0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
7fe0: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
7ff0: 20 20 20 20 20 20 73 65 6c 65 63 74 45 78 70 72        selectExpr
8000: 44 65 66 65 72 28 70 50 61 72 73 65 2c 20 70 53  Defer(pParse, pS
8010: 6f 72 74 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  ort, p->pEList, 
8020: 26 70 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20  &pExtra);.      
8030: 69 66 28 20 70 45 78 74 72 61 20 26 26 20 70 50  if( pExtra && pP
8040: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
8050: 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
8060: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
8070: 20 61 72 65 20 61 6e 79 20 65 78 74 72 61 20 50   are any extra P
8080: 4b 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 61 64 64  K columns to add
8090: 20 74 6f 20 74 68 65 20 73 6f 72 74 65 72 20 72   to the sorter r
80a0: 65 63 6f 72 64 73 2c 0a 20 20 20 20 20 20 20 20  ecords,.        
80b0: 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 65 78 74 72  ** allocate extr
80c0: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61  a memory cells a
80d0: 6e 64 20 61 64 6a 75 73 74 20 74 68 65 20 4f 70  nd adjust the Op
80e0: 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
80f0: 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74       ** instruct
8100: 69 6f 6e 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  ion to account f
8110: 6f 72 20 74 68 65 20 6c 61 72 67 65 72 20 72 65  or the larger re
8120: 63 6f 72 64 73 2e 20 54 68 69 73 20 69 73 20 6f  cords. This is o
8130: 6e 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  nly.        ** r
8140: 65 71 75 69 72 65 64 20 69 66 20 74 68 65 72 65  equired if there
8150: 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   are one or more
8160: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
8170: 61 62 6c 65 73 20 77 69 74 68 0a 20 20 20 20 20  ables with.     
8180: 20 20 20 2a 2a 20 63 6f 6d 70 6f 73 69 74 65 20     ** composite 
8190: 70 72 69 6d 61 72 79 20 6b 65 79 73 20 69 6e 20  primary keys in 
81a0: 74 68 65 20 53 6f 72 74 43 74 78 2e 61 44 65 66  the SortCtx.aDef
81b0: 65 72 5b 5d 20 61 72 72 61 79 2e 20 20 2a 2f 0a  er[] array.  */.
81c0: 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a          VdbeOp *
81d0: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
81e0: 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d  eGetOp(v, pSort-
81f0: 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  >addrSortIndex);
8200: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32  .        pOp->p2
8210: 20 2b 3d 20 28 70 45 78 74 72 61 2d 3e 6e 45 78   += (pExtra->nEx
8220: 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 44 65 66  pr - pSort->nDef
8230: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  er);.        pOp
8240: 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ->p4.pKeyInfo->n
8250: 41 6c 6c 46 69 65 6c 64 20 2b 3d 20 28 70 45 78  AllField += (pEx
8260: 74 72 61 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f  tra->nExpr - pSo
8270: 72 74 2d 3e 6e 44 65 66 65 72 29 3b 0a 20 20 20  rt->nDefer);.   
8280: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
8290: 6d 20 2b 3d 20 70 45 78 74 72 61 2d 3e 6e 45 78  m += pExtra->nEx
82a0: 70 72 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  pr;.      }.#end
82b0: 69 66 0a 20 20 20 20 20 20 72 65 67 4f 72 69 67  if.      regOrig
82c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
82d0: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  rt( eDest==SRT_S
82e0: 65 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  et || eDest==SRT
82f0: 5f 4d 65 6d 20 0a 20 20 20 20 20 20 20 20 20 20  _Mem .          
8300: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
8310: 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65 73  oroutine || eDes
8320: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
8330: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 52 65 73 75  .    }.    nResu
8340: 6c 74 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 45  ltCol = sqlite3E
8350: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
8360: 70 50 61 72 73 65 2c 70 2d 3e 70 45 4c 69 73 74  pParse,p->pEList
8370: 2c 72 65 67 52 65 73 75 6c 74 2c 0a 20 20 20 20  ,regResult,.    
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83a0: 20 20 20 20 20 30 2c 65 63 65 6c 46 6c 61 67 73       0,ecelFlags
83b0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
83c0: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
83d0: 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66  EFERENCES.    if
83e0: 28 20 70 45 78 74 72 61 20 29 7b 0a 20 20 20 20  ( pExtra ){.    
83f0: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 2b 3d 20    nResultCol += 
8400: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
8410: 78 70 72 4c 69 73 74 28 0a 20 20 20 20 20 20 20  xprList(.       
8420: 20 20 20 70 50 61 72 73 65 2c 20 70 45 78 74 72     pParse, pExtr
8430: 61 2c 20 72 65 67 52 65 73 75 6c 74 20 2b 20 6e  a, regResult + n
8440: 52 65 73 75 6c 74 43 6f 6c 2c 20 30 2c 20 30 0a  ResultCol, 0, 0.
8450: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
8460: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
8470: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
8480: 20 70 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a   pExtra);.    }.
8490: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
84a0: 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   If the DISTINCT
84b0: 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65   keyword was pre
84c0: 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45  sent on the SELE
84d0: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  CT statement.  *
84e0: 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68  * and this row h
84f0: 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66  as been seen bef
8500: 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ore, then do not
8510: 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20   make this row. 
8520: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
8530: 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69  result..  */.  i
8540: 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29  f( hasDistinct )
8550: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 44  {.    switch( pD
8560: 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79  istinct->eTnctTy
8570: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
8580: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
8590: 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20  ORDERED: {.     
85a0: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20     VdbeOp *pOp; 
85b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
85c0: 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
85d0: 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69   OpenEphemeral i
85e0: 6e 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nstr. */.       
85f0: 20 69 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20   int iJump;     
8600: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
8610: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a   destination */.
8620: 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 50          int regP
8630: 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
8640: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20  /* Previous row 
8650: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20  content */..    
8660: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
8670: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 70 72  space for the pr
8680: 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20  evious row */.  
8690: 20 20 20 20 20 20 72 65 67 50 72 65 76 20 3d 20        regPrev = 
86a0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
86b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
86c0: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
86d0: 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ol;..        /* 
86e0: 43 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  Change the OP_Op
86f0: 65 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65  enEphemeral code
8700: 64 20 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20  d earlier to an 
8710: 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20  OP_Null.        
8720: 2a 2a 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f  ** sets the MEM_
8730: 43 6c 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74  Cleared bit on t
8740: 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
8750: 72 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  r of the.       
8760: 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c   ** previous val
8770: 75 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63  ue.  This will c
8780: 61 75 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62  ause the OP_Ne b
8790: 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20  elow to always. 
87a0: 20 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f         ** fail o
87b0: 6e 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  n the first iter
87c0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
87d0: 70 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69  p even if the fi
87e0: 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  rst.        ** r
87f0: 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e  ow is all NULLs.
8800: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
8810: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
8820: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70  hangeToNoop(v, p
8830: 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e  Distinct->addrTn
8840: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ct);.        pOp
8850: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
8860: 74 4f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74  tOp(v, pDistinct
8870: 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20  ->addrTnct);.   
8880: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
8890: 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20   = OP_Null;.    
88a0: 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b      pOp->p1 = 1;
88b0: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32  .        pOp->p2
88c0: 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20   = regPrev;..   
88d0: 20 20 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c       iJump = sql
88e0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
88f0: 64 64 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74  ddr(v) + nResult
8900: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  Col;.        for
8910: 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43  (i=0; i<nResultC
8920: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
8930: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
8940: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
8950: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
8960: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  p->pEList->a[i].
8970: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
8980: 20 20 69 66 28 20 69 3c 6e 52 65 73 75 6c 74 43    if( i<nResultC
8990: 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  ol-1 ){.        
89a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
89b0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20  ddOp3(v, OP_Ne, 
89c0: 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 4a 75  regResult+i, iJu
89d0: 6d 70 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a  mp, regPrev+i);.
89e0: 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
89f0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
8a00: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8a10: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8a20: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8a30: 50 5f 45 71 2c 20 72 65 67 52 65 73 75 6c 74 2b  P_Eq, regResult+
8a40: 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65  i, iContinue, re
8a50: 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20  gPrev+i);.      
8a60: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
8a70: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
8a80: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
8a90: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
8aa0: 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20  4(v, -1, (const 
8ab0: 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
8ac0: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
8ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8ae0: 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
8af0: 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
8b00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
8b10: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
8b20: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3d  eCurrentAddr(v)=
8b30: 3d 69 4a 75 6d 70 20 7c 7c 20 70 50 61 72 73 65  =iJump || pParse
8b40: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8b50: 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ed );.        sq
8b60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8b70: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52  v, OP_Copy, regR
8b80: 65 73 75 6c 74 2c 20 72 65 67 50 72 65 76 2c 20  esult, regPrev, 
8b90: 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20  nResultCol-1);. 
8ba0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8bb0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
8bc0: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
8bd0: 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20  _UNIQUE: {.     
8be0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
8bf0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44  angeToNoop(v, pD
8c00: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
8c10: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
8c20: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
8c30: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
8c40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 69       assert( pDi
8c50: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
8c60: 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  e==WHERE_DISTINC
8c70: 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20  T_UNORDERED );. 
8c80: 20 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69         codeDisti
8c90: 6e 63 74 28 70 50 61 72 73 65 2c 20 70 44 69 73  nct(pParse, pDis
8ca0: 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20  tinct->tabTnct, 
8cb0: 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52 65 73 75  iContinue, nResu
8cc0: 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20  ltCol,.         
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52              regR
8ce0: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  esult);.        
8cf0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
8d00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f     }.    if( pSo
8d10: 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  rt==0 ){.      c
8d20: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
8d30: 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
8d40: 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ue);.    }.  }..
8d50: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
8d60: 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
8d70: 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61  s mode, write ea
8d80: 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20  ch query result 
8d90: 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  to the key of th
8da0: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
8db0: 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ** table iParm..
8dc0: 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
8dd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
8de0: 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63  UND_SELECT.    c
8df0: 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b  ase SRT_Union: {
8e00: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
8e10: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
8e20: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
8e30: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
8e40: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8e50: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
8e60: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
8e70: 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20  tCol, r1);.     
8e80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8e90: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
8ea0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
8eb0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
8ec0: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
8ed0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
8ee0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
8ef0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8f00: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
8f10: 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64  nstruct a record
8f20: 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20   from the query 
8f30: 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74  result, but inst
8f40: 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61  ead of.    ** sa
8f50: 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64  ving that record
8f60: 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65  , use it as a ke
8f70: 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d  y to delete elem
8f80: 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ents from.    **
8f90: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
8fa0: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
8fb0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
8fc0: 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20  Except: {.      
8fd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8fe0: 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74  3(v, OP_IdxDelet
8ff0: 65 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65 73  e, iParm, regRes
9000: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
9010: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9020: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
9030: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
9040: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 20  UND_SELECT */.. 
9050: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
9060: 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
9070: 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
9080: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
9090: 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a 20 20 20  se SRT_Fifo:.   
90a0: 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 46 69   case SRT_DistFi
90b0: 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  fo:.    case SRT
90c0: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
90d0: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
90e0: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20  .      int r1 = 
90f0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
9100: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50 72 65  nge(pParse, nPre
9110: 66 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20 20  fixReg+1);.     
9120: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
9130: 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  ==SRT_Table );. 
9140: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
9150: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
9160: 61 62 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ab );.      test
9170: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
9180: 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 74  _Fifo );.      t
9190: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
91a0: 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a  SRT_DistFifo );.
91b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
91c0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
91d0: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
91e0: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  ult, nResultCol,
91f0: 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67 29 3b   r1+nPrefixReg);
9200: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9210: 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 20 20 69  OMIT_CTE.      i
9220: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  f( eDest==SRT_Di
9230: 73 74 46 69 66 6f 20 29 7b 0a 20 20 20 20 20 20  stFifo ){.      
9240: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74    /* If the dest
9250: 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 46  ination is DistF
9260: 69 66 6f 2c 20 74 68 65 6e 20 63 75 72 73 6f 72  ifo, then cursor
9270: 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70   (iParm+1) is op
9280: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  en.        ** on
9290: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
92a0: 64 65 78 2e 20 49 66 20 74 68 65 20 63 75 72 72  dex. If the curr
92b0: 65 6e 74 20 72 6f 77 20 69 73 20 61 6c 72 65 61  ent row is alrea
92c0: 64 79 20 70 72 65 73 65 6e 74 0a 20 20 20 20 20  dy present.     
92d0: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64     ** in the ind
92e0: 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65  ex, do not write
92f0: 20 69 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75   it to the outpu
9300: 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64 20 74  t. If not, add t
9310: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 75  he.        ** cu
9320: 72 72 65 6e 74 20 72 6f 77 20 74 6f 20 74 68 65  rrent row to the
9330: 20 69 6e 64 65 78 20 61 6e 64 20 70 72 6f 63 65   index and proce
9340: 65 64 20 77 69 74 68 20 77 72 69 74 69 6e 67 20  ed with writing 
9350: 69 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  it to the.      
9360: 20 20 2a 2a 20 6f 75 74 70 75 74 20 74 61 62 6c    ** output tabl
9370: 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20  e as well.  */. 
9380: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
9390: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
93a0: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 34 3b  rentAddr(v) + 4;
93b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
93c0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
93d0: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d   OP_Found, iParm
93e0: 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c 20 30 29  +1, addr, r1, 0)
93f0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
9400: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
9410: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9420: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
9430: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31  xInsert, iParm+1
9440: 2c 20 72 31 2c 72 65 67 52 65 73 75 6c 74 2c 6e  , r1,regResult,n
9450: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
9460: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 6f 72      assert( pSor
9470: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  t==0 );.      }.
9480: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
9490: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
94a0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
94b0: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20  (pParse, pSort, 
94c0: 70 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67  p, r1+nPrefixReg
94d0: 2c 72 65 67 52 65 73 75 6c 74 2c 31 2c 6e 50 72  ,regResult,1,nPr
94e0: 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20  efixReg);.      
94f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
9500: 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
9510: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
9520: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
9530: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9540: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
9550: 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20  rm, r2);.       
9560: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9570: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
9580: 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b   iParm, r1, r2);
9590: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
95a0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
95b0: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
95c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
95d0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
95e0: 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
95f0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
9600: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
9610: 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 50 72  (pParse, r1, nPr
9620: 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20  efixReg+1);.    
9630: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
9640: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9650: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
9660: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
9670: 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
9680: 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
9690: 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
96a0: 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
96b0: 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
96c0: 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
96d0: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
96e0: 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
96f0: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
9700: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
9710: 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
9720: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
9730: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
9740: 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
9750: 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e  /* At first glan
9760: 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69  ce you would thi
9770: 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69  nk we could opti
9780: 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20  mize out the.   
9790: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
97a0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69   in this case si
97b0: 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66  nce the order of
97c0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
97d0: 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  set.        ** d
97e0: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20  oes not matter. 
97f0: 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74   But there might
9800: 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   be a LIMIT clau
9810: 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20  se, in which.   
9820: 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65       ** case the
9830: 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74   order does matt
9840: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  er */.        pu
9850: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
9860: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
9870: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
9880: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
9890: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65  nResultCol, nPre
98a0: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
98b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
98c0: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
98d0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
98e0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
98f0: 28 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ( sqlite3Strlen3
9900: 30 28 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73  0(pDest->zAffSds
9910: 74 29 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29  t)==nResultCol )
9920: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9930: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
9940: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
9950: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
9960: 43 6f 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Col, .          
9970: 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66    r1, pDest->zAf
9980: 66 53 64 73 74 2c 20 6e 52 65 73 75 6c 74 43 6f  fSdst, nResultCo
9990: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
99a0: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
99b0: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
99c0: 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  e, regResult, nR
99d0: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
99e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
99f0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
9a00: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
9a10: 72 31 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  r1, regResult, n
9a20: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
9a30: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
9a40: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
9a50: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r1);.      }. 
9a60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9a70: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79  }..    /* If any
9a80: 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68   row exist in th
9a90: 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65  e result set, re
9aa0: 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61  cord that fact a
9ab0: 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f  nd abort..    */
9ac0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
9ad0: 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71  ists: {.      sq
9ae0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9af0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
9b00: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
9b10: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
9b20: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
9b30: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
9b40: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
9b50: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
9b60: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
9b70: 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
9b80: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
9b90: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
9ba0: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
9bb0: 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
9bc0: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
9bd0: 72 79 20 63 65 6c 6c 20 6f 72 20 61 72 72 61 79  ry cell or array
9be0: 20 6f 66 20 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f   of .    ** memo
9bf0: 72 79 20 63 65 6c 6c 73 20 61 6e 64 20 62 72 65  ry cells and bre
9c00: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 73 63  ak out of the sc
9c10: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
9c20: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
9c30: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53  : {.      if( pS
9c40: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ort ){.        a
9c50: 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f  ssert( nResultCo
9c60: 6c 3c 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  l<=pDest->nSdst 
9c70: 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  );.        pushO
9c80: 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 20 20 20  ntoSorter(.     
9c90: 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
9ca0: 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75  Sort, p, regResu
9cb0: 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52 65  lt, regOrig, nRe
9cc0: 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78  sultCol, nPrefix
9cd0: 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
9ce0: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
9cf0: 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 70  t( nResultCol==p
9d00: 44 65 73 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20  Dest->nSdst );. 
9d10: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
9d20: 65 67 52 65 73 75 6c 74 3d 3d 69 50 61 72 6d 20  egResult==iParm 
9d30: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  );.        /* Th
9d40: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
9d50: 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
9d60: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
9d70: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
9d80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
9d90: 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
9da0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
9db0: 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73  UERY */..    cas
9dc0: 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
9dd0: 20 20 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 64         /* Send d
9de0: 61 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74  ata to a co-rout
9df0: 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ine */.    case 
9e00: 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20  SRT_Output: {   
9e10: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
9e20: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
9e30: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
9e40: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
9e50: 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ne );.      test
9e60: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
9e70: 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
9e80: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
9e90: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
9ea0: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  rter(pParse, pSo
9eb0: 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74  rt, p, regResult
9ec0: 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75  , regOrig, nResu
9ed0: 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20  ltCol,.         
9ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50                nP
9ef0: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
9f00: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
9f10: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
9f20: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9f30: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
9f40: 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
9f50: 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
9f60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9f70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9f80: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
9f90: 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  w, regResult, nR
9fa0: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
9fb0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
9fc0: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
9fd0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
9fe0: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
9ff0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a000: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
a010: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a020: 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57 72 69  T_CTE.    /* Wri
a030: 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  te the results i
a040: 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79 20 71  nto a priority q
a050: 75 65 75 65 20 74 68 61 74 20 69 73 20 6f 72 64  ueue that is ord
a060: 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a  er according to.
a070: 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e 70 4f      ** pDest->pO
a080: 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f 29 2e  rderBy (in pSO).
a090: 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d    pDest->iSDParm
a0a0: 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73 20 74   (in iParm) is t
a0b0: 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 61 6e  he cursor for an
a0c0: 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 77 69  .    ** index wi
a0d0: 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b 32 20  th pSO->nExpr+2 
a0e0: 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c 64 20  columns.  Build 
a0f0: 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53 4f 20  a key using pSO 
a100: 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a 20 20  for the first.  
a110: 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70 72 20    ** pSO->nExpr 
a120: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6d 61  columns, then ma
a130: 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65 79 73  ke sure all keys
a140: 20 61 72 65 20 75 6e 69 71 75 65 20 62 79 20 61   are unique by a
a150: 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66  dding a.    ** f
a160: 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e 63 65  inal OP_Sequence
a170: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 6c 61   column.  The la
a180: 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65  st column is the
a190: 20 72 65 63 6f 72 64 20 61 73 20 61 20 62 6c 6f   record as a blo
a1a0: 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  b..    */.    ca
a1b0: 73 65 20 53 52 54 5f 44 69 73 74 51 75 65 75 65  se SRT_DistQueue
a1c0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 51  :.    case SRT_Q
a1d0: 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ueue: {.      in
a1e0: 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e  t nKey;.      in
a1f0: 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20  t r1, r2, r3;.  
a200: 20 20 20 20 69 6e 74 20 61 64 64 72 54 65 73 74      int addrTest
a210: 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72   = 0;.      Expr
a220: 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20 20 20  List *pSO;.     
a230: 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e 70 4f   pSO = pDest->pO
a240: 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 61 73  rderBy;.      as
a250: 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20 20 20  sert( pSO );.   
a260: 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e     nKey = pSO->n
a270: 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31 20 3d  Expr;.      r1 =
a280: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
a290: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
a2a0: 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
a2b0: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
a2c0: 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20  e, nKey+2);.    
a2d0: 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79 2b 31    r3 = r2+nKey+1
a2e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
a2f0: 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65  t==SRT_DistQueue
a300: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
a310: 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  f the destinatio
a320: 6e 20 69 73 20 44 69 73 74 51 75 65 75 65 2c 20  n is DistQueue, 
a330: 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61  then cursor (iPa
a340: 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20  rm+1) is open.  
a350: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73 65        ** on a se
a360: 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c 20 69  cond ephemeral i
a370: 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20  ndex that holds 
a380: 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65 72 79  all values every
a390: 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 20 20   previously.    
a3a0: 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20      ** added to 
a3b0: 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a 20 20  the queue. */.  
a3c0: 20 20 20 20 20 20 61 64 64 72 54 65 73 74 20 3d        addrTest =
a3d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a3e0: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
a3f0: 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c 20 0a  d, iParm+1, 0, .
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a420: 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c          regResul
a430: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
a440: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
a450: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
a460: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a470: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
a480: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
a490: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
a4a0: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69 66 28  , r3);.      if(
a4b0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
a4c0: 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Queue ){.       
a4d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a4e0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
a4f0: 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 33 29  rt, iParm+1, r3)
a500: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a510: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
a520: 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
a530: 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 7d 0a  ESULT);.      }.
a540: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
a550: 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nKey; i++){.   
a560: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a570: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
a580: 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  py,.            
a590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
a5a0: 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d 3e 61  gResult + pSO->a
a5b0: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
a5c0: 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20 20 20  Col - 1,.       
a5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5e0: 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20 20 20     r2+i);.      
a5f0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
a600: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a610: 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72 6d 2c  Sequence, iParm,
a620: 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20 20 20   r2+nKey);.     
a630: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a640: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
a650: 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 2c  ord, r2, nKey+2,
a660: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
a670: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
a680: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
a690: 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 2c  , iParm, r1, r2,
a6a0: 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20   nKey+2);.      
a6b0: 69 66 28 20 61 64 64 72 54 65 73 74 20 29 20 73  if( addrTest ) s
a6c0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
a6d0: 72 65 28 76 2c 20 61 64 64 72 54 65 73 74 29 3b  re(v, addrTest);
a6e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
a6f0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
a700: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
a710: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
a720: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
a730: 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20  r2, nKey+2);.   
a740: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a750: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
a760: 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a  _OMIT_CTE */....
a770: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
a780: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
a790: 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64  ).    /* Discard
a7a0: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
a7b0: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
a7c0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
a7d0: 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20  s inside.    ** 
a7e0: 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52  the body of a TR
a7f0: 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70  IGGER.  The purp
a800: 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65  ose of such sele
a810: 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20  cts is to call. 
a820: 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e     ** user-defin
a830: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  ed functions tha
a840: 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65  t have side effe
a850: 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  cts.  We do not 
a860: 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75  care.    ** abou
a870: 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73  t the actual res
a880: 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
a890: 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ct..    */.    d
a8a0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
a8b0: 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53  assert( eDest==S
a8c0: 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20  RT_Discard );.  
a8d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a8e0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
a8f0: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
a900: 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
a910: 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
a920: 61 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c 20  ached.  Except, 
a930: 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  if.  ** there is
a940: 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77 68   a sorter, in wh
a950: 69 63 68 20 63 61 73 65 20 74 68 65 20 73 6f 72  ich case the sor
a960: 74 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ter has already 
a970: 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68 65  limited.  ** the
a980: 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e 0a   output for us..
a990: 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 6f 72 74    */.  if( pSort
a9a0: 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74  ==0 && p->iLimit
a9b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
a9c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a9d0: 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d  DecrJumpZero, p-
a9e0: 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29  >iLimit, iBreak)
a9f0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
aa00: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
aa10: 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e  Allocate a KeyIn
aa20: 66 6f 20 6f 62 6a 65 63 74 20 73 75 66 66 69 63  fo object suffic
aa30: 69 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64 65  ient for an inde
aa40: 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75 6d  x of N key colum
aa50: 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74 72  ns and.** X extr
aa60: 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65  a columns..*/.Ke
aa70: 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65  yInfo *sqlite3Ke
aa80: 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69 74  yInfoAlloc(sqlit
aa90: 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20 69  e3 *db, int N, i
aaa0: 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20 6e 45 78  nt X){.  int nEx
aab0: 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28 73 69 7a  tra = (N+X)*(siz
aac0: 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29  eof(CollSeq*)+1)
aad0: 20 2d 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65   - sizeof(CollSe
aae0: 71 2a 29 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  q*);.  KeyInfo *
aaf0: 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
ab00: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
ab10: 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 6e  eof(KeyInfo) + n
ab20: 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70 20  Extra);.  if( p 
ab30: 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f  ){.    p->aSortO
ab40: 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e  rder = (u8*)&p->
ab50: 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20  aColl[N+X];.    
ab60: 70 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 3d 20 28  p->nKeyField = (
ab70: 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 41  u16)N;.    p->nA
ab80: 6c 6c 46 69 65 6c 64 20 3d 20 28 75 31 36 29 28  llField = (u16)(
ab90: 4e 2b 58 29 3b 0a 20 20 20 20 70 2d 3e 65 6e 63  N+X);.    p->enc
aba0: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20   = ENC(db);.    
abb0: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  p->db = db;.    
abc0: 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  p->nRef = 1;.   
abd0: 20 6d 65 6d 73 65 74 28 26 70 5b 31 5d 2c 20 30   memset(&p[1], 0
abe0: 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65 6c  , nExtra);.  }el
abf0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  se{.    sqlite3O
ac00: 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 7d  omFault(db);.  }
ac10: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
ac20: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
ac30: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
ac40: 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
ac50: 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b 65  3KeyInfoUnref(Ke
ac60: 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28  yInfo *p){.  if(
ac70: 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74   p ){.    assert
ac80: 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  ( p->nRef>0 );. 
ac90: 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20     p->nRef--;.  
aca0: 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30    if( p->nRef==0
acb0: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
acc0: 4e 4e 28 70 2d 3e 64 62 2c 20 70 29 3b 0a 20 20  NN(p->db, p);.  
acd0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
ace0: 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 74 6f  a new pointer to
acf0: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
ad00: 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71  t.*/.KeyInfo *sq
ad10: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
ad20: 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  KeyInfo *p){.  i
ad30: 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65  f( p ){.    asse
ad40: 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b  rt( p->nRef>0 );
ad50: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a  .    p->nRef++;.
ad60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
ad70: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
ad80: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  _DEBUG./*.** Ret
ad90: 75 72 6e 20 54 52 55 45 20 69 66 20 61 20 4b 65  urn TRUE if a Ke
ada0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61 6e  yInfo object can
adb0: 20 62 65 20 63 68 61 6e 67 65 2e 20 20 54 68 65   be change.  The
adc0: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a   KeyInfo object.
add0: 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 63  ** can only be c
ade0: 68 61 6e 67 65 64 20 69 66 20 74 68 69 73 20 69  hanged if this i
adf0: 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20  s just a single 
ae00: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
ae10: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
ae20: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
ae30: 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65 20  sed only inside 
ae40: 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74  of assert() stat
ae50: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ements..*/.int s
ae60: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
ae70: 72 69 74 65 61 62 6c 65 28 4b 65 79 49 6e 66 6f  riteable(KeyInfo
ae80: 20 2a 70 29 7b 20 72 65 74 75 72 6e 20 70 2d 3e   *p){ return p->
ae90: 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69  nRef==1; }.#endi
aea0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
aeb0: 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  G */../*.** Give
aec0: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
aed0: 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61  list, generate a
aee0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
aef0: 72 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a  re that records.
af00: 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** the collating
af10: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61   sequence for ea
af20: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
af30: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
af40: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
af50: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
af60: 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  an ORDER BY or G
af70: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74  ROUP BY clause t
af80: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e  hen the resultin
af90: 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72  g.** KeyInfo str
afa0: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
afb0: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
afc0: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
afd0: 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70   index to.** imp
afe0: 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75  lement that clau
aff0: 73 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72  se.  If the Expr
b000: 4c 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75  List is the resu
b010: 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45  lt set of a SELE
b020: 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b  CT.** then the K
b030: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
b040: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
b050: 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  for initializing
b060: 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e   a virtual.** in
b070: 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  dex to implement
b080: 20 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74   a DISTINCT test
b090: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
b0a0: 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
b0b0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
b0c0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
b0d0: 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  loc.  The callin
b0e0: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  g.** function is
b0f0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
b100: 20 73 65 65 69 6e 67 20 74 68 61 74 20 74 68 69   seeing that thi
b110: 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  s structure is e
b120: 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65  ventually.** fre
b130: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65  ed..*/.static Ke
b140: 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72  yInfo *keyInfoFr
b150: 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
b160: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
b170: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
b180: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
b190: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
b1a0: 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49  /* Form the KeyI
b1b0: 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20  nfo object from 
b1c0: 74 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f  this ExprList */
b1d0: 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20  .  int iStart,  
b1e0: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
b1f0: 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d   with this colum
b200: 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20  n of pList */.  
b210: 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20 20  int nExtra      
b220: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
b230: 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75   many extra colu
b240: 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a  mns to the end *
b250: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72  /.){.  int nExpr
b260: 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e  ;.  KeyInfo *pIn
b270: 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  fo;.  struct Exp
b280: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
b290: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
b2a0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
b2b0: 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72   int i;..  nExpr
b2c0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
b2d0: 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74  .  pInfo = sqlit
b2e0: 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
b2f0: 62 2c 20 6e 45 78 70 72 2d 69 53 74 61 72 74 2c  b, nExpr-iStart,
b300: 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20 20 69 66   nExtra+1);.  if
b310: 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 61  ( pInfo ){.    a
b320: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
b330: 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
b340: 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 66  (pInfo) );.    f
b350: 6f 72 28 69 3d 69 53 74 61 72 74 2c 20 70 49 74  or(i=iStart, pIt
b360: 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53 74 61  em=pList->a+iSta
b370: 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  rt; i<nExpr; i++
b380: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
b390: 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69    pInfo->aColl[i
b3a0: 2d 69 53 74 61 72 74 5d 20 3d 20 73 71 6c 69 74  -iStart] = sqlit
b3b0: 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
b3c0: 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
b3d0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70 49 6e  Expr);.      pIn
b3e0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
b3f0: 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74 65 6d  -iStart] = pItem
b400: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
b410: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
b420: 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pInfo;.}../*.** 
b430: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e  Name of the conn
b440: 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c  ection operator,
b450: 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20   used for error 
b460: 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  messages..*/.sta
b470: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
b480: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74  selectOpName(int
b490: 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b   id){.  char *z;
b4a0: 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b  .  switch( id ){
b4b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
b4c0: 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49  :       z = "UNI
b4d0: 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b  ON ALL";   break
b4e0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  ;.    case TK_IN
b4f0: 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e  TERSECT: z = "IN
b500: 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61  TERSECT";   brea
b510: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
b520: 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45  XCEPT:    z = "E
b530: 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65  XCEPT";      bre
b540: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
b550: 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22             z = "
b560: 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72  UNION";       br
b570: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
b580: 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n z;.}..#ifndef 
b590: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
b5a0: 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  AIN./*.** Unless
b5b0: 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45   an "EXPLAIN QUE
b5c0: 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64  RY PLAN" command
b5d0: 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73   is being proces
b5e0: 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  sed, this functi
b5f0: 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  on.** is a no-op
b600: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
b610: 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  adds a single ro
b620: 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74  w of output to t
b630: 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a  he EQP result,.*
b640: 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74  * where the capt
b650: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
b660: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53 45  rm:.**.**   "USE
b670: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
b680: 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72   xxx".**.** wher
b690: 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f 66 20  e xxx is one of 
b6a0: 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f 52 44  "DISTINCT", "ORD
b6b0: 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f 55 50  ER BY" or "GROUP
b6c0: 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20 77 68   BY". Exactly wh
b6d0: 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65 72 6d  ich.** is determ
b6e0: 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55 73 61  ined by the zUsa
b6f0: 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ge argument..*/.
b700: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
b710: 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50 61 72  ainTempTable(Par
b720: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
b730: 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65 29 7b  t char *zUsage){
b740: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
b750: 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
b760: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
b770: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68  e->pVdbe;.    ch
b780: 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74  ar *zMsg = sqlit
b790: 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  e3MPrintf(pParse
b7a0: 2d 3e 64 62 2c 20 22 55 53 45 20 54 45 4d 50 20  ->db, "USE TEMP 
b7b0: 42 2d 54 52 45 45 20 46 4f 52 20 25 73 22 2c 20  B-TREE FOR %s", 
b7c0: 7a 55 73 61 67 65 29 3b 0a 20 20 20 20 73 71 6c  zUsage);.    sql
b7d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
b7e0: 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
b7f0: 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
b800: 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f   0, 0, zMsg, P4_
b810: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
b820: 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78  ./*.** Assign ex
b830: 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76  pression b to lv
b840: 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f 6e 64  alue a. A second
b850: 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e  , no-op, version
b860: 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a   of this macro.*
b870: 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20 77 68  * is provided wh
b880: 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  en SQLITE_OMIT_E
b890: 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69 6e 65  XPLAIN is define
b8a0: 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  d. This allows t
b8b0: 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71  he code.** in sq
b8c0: 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 74 6f  lite3Select() to
b8d0: 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73 20 74   assign values t
b8e0: 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65 6d 62  o structure memb
b8f0: 65 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  er variables tha
b900: 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20  t.** only exist 
b910: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  if SQLITE_OMIT_E
b920: 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64 65  XPLAIN is not de
b930: 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20 70 6f  fined without po
b940: 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63  lluting the.** c
b950: 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64 65 66  ode with #ifndef
b960: 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a   directives..*/.
b970: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
b980: 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20 62 29  SetInteger(a, b)
b990: 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a   a = b..#else./*
b9a0: 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20   No-op versions 
b9b0: 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58  of the explainXX
b9c0: 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  X() functions an
b9d0: 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64  d macros. */.# d
b9e0: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d  efine explainTem
b9f0: 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65  pTable(y,z).# de
ba00: 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49  fine explainSetI
ba10: 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64  nteger(y,z).#end
ba20: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
ba30: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50  (SQLITE_OMIT_EXP
ba40: 4c 41 49 4e 29 20 26 26 20 21 64 65 66 69 6e 65  LAIN) && !define
ba50: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  d(SQLITE_OMIT_CO
ba60: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 0a 2f  MPOUND_SELECT)./
ba70: 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22  *.** Unless an "
ba80: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
ba90: 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62  AN" command is b
baa0: 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20  eing processed, 
bab0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
bac0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68   is a no-op. Oth
bad0: 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73 20  erwise, it adds 
bae0: 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
baf0: 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45 51  output to the EQ
bb00: 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65  P result,.** whe
bb10: 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69  re the caption i
bb20: 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s of one of the 
bb30: 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a  two forms:.**.**
bb40: 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55     "COMPOSITE SU
bb50: 42 51 55 45 52 49 45 53 20 69 53 75 62 31 20 61  BQUERIES iSub1 a
bb60: 6e 64 20 69 53 75 62 32 20 28 6f 70 29 22 0a 2a  nd iSub2 (op)".*
bb70: 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53  *   "COMPOSITE S
bb80: 55 42 51 55 45 52 49 45 53 20 69 53 75 62 31 20  UBQUERIES iSub1 
bb90: 61 6e 64 20 69 53 75 62 32 20 55 53 49 4e 47 20  and iSub2 USING 
bba0: 54 45 4d 50 20 42 2d 54 52 45 45 20 28 6f 70 29  TEMP B-TREE (op)
bbb0: 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 69 53  ".**.** where iS
bbc0: 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 61 72  ub1 and iSub2 ar
bbd0: 65 20 74 68 65 20 69 6e 74 65 67 65 72 73 20 70  e the integers p
bbe0: 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 72  assed as the cor
bbf0: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75  responding.** fu
bc00: 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
bc10: 73 2c 20 61 6e 64 20 6f 70 20 69 73 20 74 68 65  s, and op is the
bc20: 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61   text representa
bc30: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 61  tion of the para
bc40: 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  meter.** of the 
bc50: 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68 65 20 70  same name. The p
bc60: 61 72 61 6d 65 74 65 72 20 22 6f 70 22 20 6d 75  arameter "op" mu
bc70: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 54 4b 5f  st be one of TK_
bc80: 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54  UNION, TK_EXCEPT
bc90: 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52 53 45 43  ,.** TK_INTERSEC
bca0: 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54 68 65  T or TK_ALL. The
bcb0: 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73 20 75   first form is u
bcc0: 73 65 64 20 69 66 20 61 72 67 75 6d 65 6e 74 20  sed if argument 
bcd0: 62 55 73 65 54 6d 70 20 69 73 20 0a 2a 2a 20 66  bUseTmp is .** f
bce0: 61 6c 73 65 2c 20 6f 72 20 74 68 65 20 73 65 63  alse, or the sec
bcf0: 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69 74 20 69  ond form if it i
bd00: 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69  s true..*/.stati
bd10: 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 43 6f  c void explainCo
bd20: 6d 70 6f 73 69 74 65 28 0a 20 20 50 61 72 73 65  mposite(.  Parse
bd30: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
bd40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
bd50: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
bd60: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd80: 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e   /* One of TK_UN
bd90: 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 20 65  ION, TK_EXCEPT e
bda0: 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  tc. */.  int iSu
bdb0: 62 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  b1,             
bdc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71           /* Subq
bdd0: 75 65 72 79 20 69 64 20 31 20 2a 2f 0a 20 20 69  uery id 1 */.  i
bde0: 6e 74 20 69 53 75 62 32 2c 20 20 20 20 20 20 20  nt iSub2,       
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
be00: 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 32 20  * Subquery id 2 
be10: 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65 54 6d 70  */.  int bUseTmp
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
be40: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 77 61 73  a temp table was
be50: 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73   used */.){.  as
be60: 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49  sert( op==TK_UNI
be70: 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43  ON || op==TK_EXC
be80: 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e  EPT || op==TK_IN
be90: 54 45 52 53 45 43 54 20 7c 7c 20 6f 70 3d 3d 54  TERSECT || op==T
bea0: 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20 70  K_ALL );.  if( p
beb0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
bec0: 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  2 ){.    Vdbe *v
bed0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
bee0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  ;.    char *zMsg
bef0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
bf00: 66 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  f(.        pPars
bf10: 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f 55 4e 44  e->db, "COMPOUND
bf20: 20 53 55 42 51 55 45 52 49 45 53 20 25 64 20 41   SUBQUERIES %d A
bf30: 4e 44 20 25 64 20 25 73 28 25 73 29 22 2c 20 69  ND %d %s(%s)", i
bf40: 53 75 62 31 2c 20 69 53 75 62 32 2c 0a 20 20 20  Sub1, iSub2,.   
bf50: 20 20 20 20 20 62 55 73 65 54 6d 70 3f 22 55 53       bUseTmp?"US
bf60: 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20  ING TEMP B-TREE 
bf70: 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  ":"", selectOpNa
bf80: 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b 0a 20 20  me(op).    );.  
bf90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bfa0: 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
bfb0: 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
bfc0: 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67  ctId, 0, 0, zMsg
bfd0: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
bfe0: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f   }.}.#else./* No
bff0: 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  -op versions of 
c000: 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29  the explainXXX()
c010: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d   functions and m
c020: 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69  acros. */.# defi
c030: 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  ne explainCompos
c040: 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23  ite(v,w,x,y,z).#
c050: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
c060: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
c070: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
c080: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
c090: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
c0a0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
c0b0: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
c0c0: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
c0d0: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
c0e0: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
c0f0: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
c100: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
c110: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
c120: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
c130: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
c140: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
c150: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
c160: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c170: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
c180: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c190: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
c1a0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
c1b0: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
c1c0: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
c1d0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f 72  atement */.  Sor
c1e0: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 2f  tCtx *pSort,   /
c1f0: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  * Information on
c200: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
c210: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ause */.  int nC
c220: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e  olumn,      /* N
c230: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
c240: 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65   of data */.  Se
c250: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
c260: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72  /* Write the sor
c270: 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65  ted results here
c280: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
c290: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
c2a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c2b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
c2c0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
c2d0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65  */.  int addrBre
c2e0: 61 6b 20 3d 20 70 53 6f 72 74 2d 3e 6c 61 62 65  ak = pSort->labe
c2f0: 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 20  lDone;          
c300: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
c310: 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20  o exit loop */. 
c320: 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75   int addrContinu
c330: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
c340: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a  akeLabel(v);  /*
c350: 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e   Jump here for n
c360: 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  ext cycle */.  i
c370: 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
c380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c390: 2a 20 54 6f 70 20 6f 66 20 6f 75 74 70 75 74 20  * Top of output 
c3a0: 6c 6f 6f 70 2e 20 4a 75 6d 70 20 66 6f 72 20 4e  loop. Jump for N
c3b0: 65 78 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ext. */.  int ad
c3c0: 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 69 6e  drOnce = 0;.  in
c3d0: 74 20 69 54 61 62 3b 0a 20 20 45 78 70 72 4c 69  t iTab;.  ExprLi
c3e0: 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
c3f0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  Sort->pOrderBy;.
c400: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
c410: 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e  est->eDest;.  in
c420: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
c430: 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69 6e 74 20  >iSDParm;.  int 
c440: 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65  regRow;.  int re
c450: 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69 43  gRowid;.  int iC
c460: 6f 6c 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 20  ol;.  int nKey; 
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c480: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c490: 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69  of key columns i
c4a0: 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  n sorter record 
c4b0: 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 54 61  */.  int iSortTa
c4c0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
c4d0: 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 63       /* Sorter c
c4e0: 75 72 73 6f 72 20 74 6f 20 72 65 61 64 20 66 72  ursor to read fr
c4f0: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20  om */.  int i;. 
c500: 20 69 6e 74 20 62 53 65 71 3b 20 20 20 20 20 20   int bSeq;      
c510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c520: 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 72 74   /* True if sort
c530: 65 72 20 72 65 63 6f 72 64 20 69 6e 63 6c 75 64  er record includ
c540: 65 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 20  es seq. no. */. 
c550: 20 69 6e 74 20 6e 52 65 66 4b 65 79 20 3d 20 30   int nRefKey = 0
c560: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
c570: 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74 45 78  ist_item *aOutEx
c580: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b   = p->pEList->a;
c590: 0a 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  ..  assert( addr
c5a0: 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20 69 66 28  Break<0 );.  if(
c5b0: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
c5c0: 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ut ){.    sqlite
c5d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c5e0: 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e  P_Gosub, pSort->
c5f0: 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  regReturn, pSort
c600: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20  ->labelBkOut);. 
c610: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
c620: 74 6f 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  to(v, addrBreak)
c630: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c640: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
c650: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
c660: 75 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ut);.  }..#ifdef
c670: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
c680: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
c690: 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 79 20 63  .  /* Open any c
c6a0: 75 72 73 6f 72 73 20 6e 65 65 64 65 64 20 66 6f  ursors needed fo
c6b0: 72 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e  r sorter-referen
c6c0: 63 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a  ce expressions *
c6d0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
c6e0: 53 6f 72 74 2d 3e 6e 44 65 66 65 72 3b 20 69 2b  Sort->nDefer; i+
c6f0: 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
c700: 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65  Tab = pSort->aDe
c710: 66 65 72 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20  fer[i].pTab;.   
c720: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
c730: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
c740: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
c750: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
c760: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
c770: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e  (pParse, pSort->
c780: 61 44 65 66 65 72 5b 69 5d 2e 69 43 73 72 2c 20  aDefer[i].iCsr, 
c790: 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
c7a0: 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 6e 52 65  enRead);.    nRe
c7b0: 66 4b 65 79 20 3d 20 4d 41 58 28 6e 52 65 66 4b  fKey = MAX(nRefK
c7c0: 65 79 2c 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  ey, pSort->aDefe
c7d0: 72 5b 69 5d 2e 6e 4b 65 79 29 3b 0a 20 20 7d 0a  r[i].nKey);.  }.
c7e0: 23 65 6e 64 69 66 0a 0a 20 20 69 54 61 62 20 3d  #endif..  iTab =
c7f0: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
c800: 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  ;.  if( eDest==S
c810: 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65  RT_Output || eDe
c820: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
c830: 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  e || eDest==SRT_
c840: 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 67 52 6f  Mem ){.    regRo
c850: 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67  wid = 0;.    reg
c860: 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64  Row = pDest->iSd
c870: 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  st;.  }else{.   
c880: 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69   regRowid = sqli
c890: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
c8a0: 61 72 73 65 29 3b 0a 20 20 20 20 72 65 67 52 6f  arse);.    regRo
c8b0: 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  w = sqlite3GetTe
c8c0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
c8d0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 7d 0a 20 20  nColumn);.  }.  
c8e0: 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  nKey = pOrderBy-
c8f0: 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e  >nExpr - pSort->
c900: 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53  nOBSat;.  if( pS
c910: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
c920: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
c930: 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ter ){.    int r
c940: 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50  egSortOut = ++pP
c950: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
c960: 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73  iSortTab = pPars
c970: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69  e->nTab++;.    i
c980: 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  f( pSort->labelB
c990: 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61 64  kOut ){.      ad
c9a0: 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  drOnce = sqlite3
c9b0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
c9c0: 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65  _Once); VdbeCove
c9d0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20  rage(v);.    }. 
c9e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c9f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
ca00: 73 65 75 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c  seudo, iSortTab,
ca10: 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 0a 20 20   regSortOut, .  
ca20: 20 20 20 20 20 20 6e 4b 65 79 2b 31 2b 6e 43 6f        nKey+1+nCo
ca30: 6c 75 6d 6e 2b 6e 52 65 66 4b 65 79 29 3b 0a 20  lumn+nRefKey);. 
ca40: 20 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20     if( addrOnce 
ca50: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
ca60: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63  pHere(v, addrOnc
ca70: 65 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31  e);.    addr = 1
ca80: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
ca90: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
caa0: 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64  rSort, iTab, add
cab0: 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
cac0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
cad0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
cae0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
caf0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73  Continue);.    s
cb00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
cb10: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
cb20: 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74  a, iTab, regSort
cb30: 4f 75 74 2c 20 69 53 6f 72 74 54 61 62 29 3b 0a  Out, iSortTab);.
cb40: 20 20 20 20 62 53 65 71 20 3d 20 30 3b 0a 20 20      bSeq = 0;.  
cb50: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20  }else{.    addr 
cb60: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
cb70: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
cb80: 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72  rt, iTab, addrBr
cb90: 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
cba0: 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f  ge(v);.    codeO
cbb0: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
cbc0: 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  set, addrContinu
cbd0: 65 29 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62  e);.    iSortTab
cbe0: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 62 53 65   = iTab;.    bSe
cbf0: 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72  q = 1;.  }.  for
cc00: 28 69 3d 30 2c 20 69 43 6f 6c 3d 6e 4b 65 79 2b  (i=0, iCol=nKey+
cc10: 62 53 65 71 2d 31 3b 20 69 3c 6e 43 6f 6c 75 6d  bSeq-1; i<nColum
cc20: 6e 3b 20 69 2b 2b 29 7b 0a 23 69 66 64 65 66 20  n; i++){.#ifdef 
cc30: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
cc40: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
cc50: 20 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69      if( aOutEx[i
cc60: 5d 2e 62 53 6f 72 74 65 72 52 65 66 20 29 20 63  ].bSorterRef ) c
cc70: 6f 6e 74 69 6e 75 65 3b 0a 23 65 6e 64 69 66 0a  ontinue;.#endif.
cc80: 20 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69      if( aOutEx[i
cc90: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
cca0: 6c 3d 3d 30 20 29 20 69 43 6f 6c 2b 2b 3b 0a 20  l==0 ) iCol++;. 
ccb0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
ccc0: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
ccd0: 45 46 45 52 45 4e 43 45 53 0a 20 20 69 66 28 20  EFERENCES.  if( 
cce0: 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 20 29 7b  pSort->nDefer ){
ccf0: 0a 20 20 20 20 69 6e 74 20 69 4b 65 79 20 3d 20  .    int iKey = 
cd00: 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 69 6e 74 20  iCol+1;.    int 
cd10: 72 65 67 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  regKey = sqlite3
cd20: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
cd30: 72 73 65 2c 20 6e 52 65 66 4b 65 79 29 3b 0a 0a  rse, nRefKey);..
cd40: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
cd50: 53 6f 72 74 2d 3e 6e 44 65 66 65 72 3b 20 69 2b  Sort->nDefer; i+
cd60: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  +){.      int iC
cd70: 73 72 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66  sr = pSort->aDef
cd80: 65 72 5b 69 5d 2e 69 43 73 72 3b 0a 20 20 20 20  er[i].iCsr;.    
cd90: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
cda0: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d  pSort->aDefer[i]
cdb0: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74  .pTab;.      int
cdc0: 20 6e 4b 65 79 20 3d 20 70 53 6f 72 74 2d 3e 61   nKey = pSort->a
cdd0: 44 65 66 65 72 5b 69 5d 2e 6e 4b 65 79 3b 0a 0a  Defer[i].nKey;..
cde0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cdf0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
ce00: 6c 6c 52 6f 77 2c 20 69 43 73 72 29 3b 0a 20 20  llRow, iCsr);.  
ce10: 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64      if( HasRowid
ce20: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
ce30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ce40: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
ce50: 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 4b 65 79  , iSortTab, iKey
ce60: 2b 2b 2c 20 72 65 67 4b 65 79 29 3b 0a 20 20 20  ++, regKey);.   
ce70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ce80: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65  AddOp3(v, OP_See
ce90: 6b 52 6f 77 69 64 2c 20 69 43 73 72 2c 20 0a 20  kRowid, iCsr, . 
cea0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ceb0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
cec0: 72 28 76 29 2b 31 2c 20 72 65 67 4b 65 79 29 3b  r(v)+1, regKey);
ced0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
cee0: 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
cef0: 20 20 20 20 20 69 6e 74 20 69 4a 6d 70 3b 0a 20       int iJmp;. 
cf00: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
cf10: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
cf20: 49 6e 64 65 78 28 70 54 61 62 29 2d 3e 6e 4b 65  Index(pTab)->nKe
cf30: 79 43 6f 6c 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20  yCol==nKey );.  
cf40: 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
cf50: 3c 6e 4b 65 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20  <nKey; k++){.   
cf60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cf70: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
cf80: 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c  olumn, iSortTab,
cf90: 20 69 4b 65 79 2b 2b 2c 20 72 65 67 4b 65 79 2b   iKey++, regKey+
cfa0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  k);.        }.  
cfb0: 20 20 20 20 20 20 69 4a 6d 70 20 3d 20 73 71 6c        iJmp = sql
cfc0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
cfd0: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
cfe0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cff0: 34 49 6e 74 28 76 2c 20 4f 50 5f 53 65 65 6b 47  4Int(v, OP_SeekG
d000: 45 2c 20 69 43 73 72 2c 20 69 4a 6d 70 2b 32 2c  E, iCsr, iJmp+2,
d010: 20 72 65 67 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a   regKey, nKey);.
d020: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d030: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
d040: 4f 50 5f 49 64 78 4c 45 2c 20 69 43 73 72 2c 20  OP_IdxLE, iCsr, 
d050: 69 4a 6d 70 2b 33 2c 20 72 65 67 4b 65 79 2c 20  iJmp+3, regKey, 
d060: 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 73  nKey);.        s
d070: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
d080: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
d090: 69 43 73 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iCsr);.      }. 
d0a0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
d0b0: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
d0c0: 28 70 50 61 72 73 65 2c 20 72 65 67 4b 65 79 2c  (pParse, regKey,
d0d0: 20 6e 52 65 66 4b 65 79 29 3b 0a 20 20 7d 0a 23   nRefKey);.  }.#
d0e0: 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 6e 43  endif.  for(i=nC
d0f0: 6f 6c 75 6d 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69  olumn-1; i>=0; i
d100: 2d 2d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  --){.#ifdef SQLI
d110: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
d120: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20  _REFERENCES.    
d130: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 62 53  if( aOutEx[i].bS
d140: 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20 20 20  orterRef ){.    
d150: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
d160: 65 28 70 50 61 72 73 65 2c 20 61 4f 75 74 45 78  e(pParse, aOutEx
d170: 5b 69 5d 2e 70 45 78 70 72 2c 20 72 65 67 52 6f  [i].pExpr, regRo
d180: 77 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  w+i);.    }else.
d190: 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20  #endif.    {.   
d1a0: 20 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20 20     int iRead;.  
d1b0: 20 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69      if( aOutEx[i
d1c0: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
d1d0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 52 65  l ){.        iRe
d1e0: 61 64 20 3d 20 61 4f 75 74 45 78 5b 69 5d 2e 75  ad = aOutEx[i].u
d1f0: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31  .x.iOrderByCol-1
d200: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d210: 20 20 20 20 20 20 20 69 52 65 61 64 20 3d 20 69         iRead = i
d220: 43 6f 6c 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  Col--;.      }. 
d230: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d240: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
d250: 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69  umn, iSortTab, i
d260: 52 65 61 64 2c 20 72 65 67 52 6f 77 2b 69 29 3b  Read, regRow+i);
d270: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
d280: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 61 4f 75  nt((v, "%s", aOu
d290: 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 3f 61 4f 75  tEx[i].zName?aOu
d2a0: 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61  tEx[i].zName : a
d2b0: 4f 75 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29 29  OutEx[i].zSpan))
d2c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 77  ;.    }.  }.  sw
d2d0: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
d2e0: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
d2f0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
d300: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
d310: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d320: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
d330: 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  id, iParm, regRo
d340: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
d350: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d360: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
d370: 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f  m, regRow, regRo
d380: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
d390: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
d3a0: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
d3b0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
d3c0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
d3d0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
d3e0: 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  RY.    case SRT_
d3f0: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
d400: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71  ert( nColumn==sq
d410: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
d420: 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 20 29  est->zAffSdst) )
d430: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d440: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
d450: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
d460: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67  ow, nColumn, reg
d470: 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20  Rowid,.         
d480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
d490: 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20  Dest->zAffSdst, 
d4a0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
d4b0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
d4c0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
d4d0: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e  Parse, regRow, n
d4e0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73  Column);.      s
d4f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
d500: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
d510: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
d520: 6f 77 69 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43  owid, regRow, nC
d530: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
d540: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
d550: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
d560: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
d570: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
d580: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
d590: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
d5a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
d5b0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
d5c0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
d5d0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
d5e0: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
d5f0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a  T_Coroutine ); .
d600: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
d610: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
d620: 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
d630: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
d640: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20  Coroutine );.   
d650: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
d660: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
d670: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d680: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
d690: 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53  ltRow, pDest->iS
d6a0: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
d6b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
d6c0: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
d6d0: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44  hange(pParse, pD
d6e0: 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c  est->iSdst, nCol
d6f0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  umn);.      }els
d700: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
d710: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d720: 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
d730: 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
d740: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
d750: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
d760: 72 65 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  regRowid ){.    
d770: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  if( eDest==SRT_S
d780: 65 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  et ){.      sqli
d790: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
d7a0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
d7b0: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ow, nColumn);.  
d7c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
d7d0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
d7e0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
d7f0: 52 6f 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Row);.    }.    
d800: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
d810: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
d820: 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f  gRowid);.  }.  /
d830: 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  * The bottom of 
d840: 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  the loop.  */.  
d850: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
d860: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43  veLabel(v, addrC
d870: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20  ontinue);.  if( 
d880: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
d890: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
d8a0: 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  orter ){.    sql
d8b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d8c0: 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
d8d0: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64   iTab, addr); Vd
d8e0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
d8f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
d900: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d910: 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
d920: 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72  addr); VdbeCover
d930: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66  age(v);.  }.  if
d940: 28 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  ( pSort->regRetu
d950: 72 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  rn ) sqlite3Vdbe
d960: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
d970: 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  urn, pSort->regR
d980: 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65  eturn);.  sqlite
d990: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
d9a0: 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  l(v, addrBreak);
d9b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
d9c0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
d9d0: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
d9e0: 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69  g the 'declarati
d9f0: 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a  on type' of the.
da00: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  ** expression pE
da10: 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20  xpr. The string 
da20: 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61  may be treated a
da30: 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20  s static by the 
da40: 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c  caller..**.** Al
da50: 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61  so try to estima
da60: 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  te the size of t
da70: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
da80: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61  e and return tha
da90: 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a  t.** result in *
daa0: 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a  pEstWidth..**.**
dab0: 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   The declaration
dac0: 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61   type is the exa
dad0: 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69  ct datatype defi
dae0: 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64  nition extracted
daf0: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69   from the.** ori
db00: 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42  ginal CREATE TAB
db10: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20  LE statement if 
db20: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
db30: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a  s a column. The.
db40: 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  ** declaration t
db50: 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20  ype for a ROWID 
db60: 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52  field is INTEGER
db70: 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61  . Exactly when a
db80: 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  n expression.** 
db90: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
dba0: 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f  column can be co
dbb0: 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65  mplex in the pre
dbc0: 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72  sence of subquer
dbd0: 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75  ies. The.** resu
dbe0: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
dbf0: 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  n in all of the 
dc00: 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54  following SELECT
dc10: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a   statements is .
dc20: 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  ** considered a 
dc30: 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66  column by this f
dc40: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
dc50: 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d   SELECT col FROM
dc60: 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43   tbl;.**   SELEC
dc70: 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52  T (SELECT col FR
dc80: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
dc90: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
dca0: 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20  FROM tbl);.**   
dcb0: 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20  SELECT abc FROM 
dcc0: 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61  (SELECT col AS a
dcd0: 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a  bc FROM tbl);.**
dce0: 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61   .** The declara
dcf0: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e  tion type for an
dd00: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68  y expression oth
dd10: 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e  er than a column
dd20: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
dd30: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
dd40: 20 65 69 74 68 65 72 20 33 20 6f 72 20 36 20 70   either 3 or 6 p
dd50: 61 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e 64  arameters depend
dd60: 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
dd70: 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c  r not.** the SQL
dd80: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
dd90: 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70 69  N_METADATA compi
dda0: 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
ddb0: 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65  s used..*/.#ifde
ddc0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ddd0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
dde0: 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54  # define columnT
ddf0: 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63  ype(A,B,C,D,E) c
de00: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c  olumnTypeImpl(A,
de10: 42 2c 43 2c 44 2c 45 29 0a 23 65 6c 73 65 20 2f  B,C,D,E).#else /
de20: 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  * if !defined(SQ
de30: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
de40: 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a  MN_METADATA) */.
de50: 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54  # define columnT
de60: 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63  ype(A,B,C,D,E) c
de70: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c  olumnTypeImpl(A,
de80: 42 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  B).#endif.static
de90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c   const char *col
dea0: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e  umnTypeImpl(.  N
deb0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
dec0: 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
ded0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
dee0: 45 54 41 44 41 54 41 0a 20 20 45 78 70 72 20 2a  ETADATA.  Expr *
def0: 70 45 78 70 72 0a 23 65 6c 73 65 0a 20 20 45 78  pExpr.#else.  Ex
df00: 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e  pr *pExpr,.  con
df10: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
df20: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
df30: 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20   **pzOrigTab,.  
df40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
df50: 72 69 67 43 6f 6c 0a 23 65 6e 64 69 66 0a 29 7b  rigCol.#endif.){
df60: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
df70: 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Type = 0;.  int 
df80: 6a 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  j;.#ifdef SQLITE
df90: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
dfa0: 45 54 41 44 41 54 41 0a 20 20 63 68 61 72 20 63  ETADATA.  char c
dfb0: 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20  onst *zOrigDb = 
dfc0: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
dfd0: 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20  *zOrigTab = 0;. 
dfe0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
dff0: 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69  igCol = 0;.#endi
e000: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  f..  assert( pEx
e010: 70 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pr!=0 );.  asser
e020: 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  t( pNC->pSrcList
e030: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e040: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
e050: 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a  GG_COLUMN );  /*
e060: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   This routine ru
e070: 6e 65 73 20 62 65 66 6f 72 65 20 61 67 67 72 65  nes before aggre
e080: 67 61 74 65 73 0a 20 20 20 20 20 20 20 20 20 20  gates.          
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
e0b0: 61 72 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f  are processed */
e0c0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
e0d0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
e0e0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
e0f0: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
e100: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
e110: 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  n. Locate the ta
e120: 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ble the column i
e130: 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a  s being.      **
e140: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
e150: 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70  in NameContext.p
e160: 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61  SrcList. This ta
e170: 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a  ble may be real.
e180: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
e190: 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62  e table or a sub
e1a0: 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  query..      */.
e1b0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
e1c0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
e1d0: 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63    /* Table struc
e1e0: 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65  ture column is e
e1f0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
e200: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
e210: 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  S = 0;          
e220: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65     /* Select the
e230: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
e240: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
e250: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
e260: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f  xpr->iColumn;  /
e270: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
e280: 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20  n in pTab */.   
e290: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
e2a0: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
e2b0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
e2c0: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
e2d0: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
e2e0: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
e2f0: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
e300: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
e310: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
e320: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
e330: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
e340: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
e350: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
e360: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
e370: 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69       pS = pTabLi
e380: 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74  st->a[j].pSelect
e390: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
e3a0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d  .          pNC =
e3b0: 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pNC->pNext;.   
e3c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
e3d0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
e3e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
e3f0: 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64  At one time, cod
e400: 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45 43  e such as "SELEC
e410: 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20  T new.x" within 
e420: 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a  a trigger would.
e430: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65          ** cause
e440: 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   this condition 
e450: 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74  to run.  Since t
e460: 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73  hen, we have res
e470: 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20  tructured how.  
e480: 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
e490: 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
e4a0: 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63  ed and so this c
e4b0: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c  ondition is no l
e4c0: 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a  onger .        *
e4d0: 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65  * possible. Howe
e4e0: 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c  ver, it can stil
e4f0: 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73 74  l be true for st
e500: 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20  atements like.  
e510: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c        ** the fol
e520: 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20  lowing:.        
e530: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
e540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
e550: 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20  col INTEGER);.  
e560: 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
e570: 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c  T (SELECT t1.col
e580: 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a  ) FROM FROM t1;.
e590: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
e5a0: 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d     ** when colum
e5b0: 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65  nType() is calle
e5c0: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
e5d0: 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20  ion "t1.col" in 
e5e0: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
e5f0: 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74  sub-select. In t
e600: 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74 68  his case, set th
e610: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f  e column type to
e620: 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20   NULL, even.    
e630: 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74      ** though it
e640: 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62   should really b
e650: 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20  e "INTEGER"..   
e660: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
e670: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
e680: 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65   problem, as the
e690: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20   column type of 
e6a0: 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65  "t1.col" is neve
e6b0: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65  r.        ** use
e6c0: 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79  d. When columnTy
e6d0: 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  pe() is called o
e6e0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
e6f0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53   .        ** "(S
e700: 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20  ELECT t1.col)", 
e710: 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65  the correct type
e720: 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73 65   is returned (se
e730: 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a  e the TK_SELECT.
e740: 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63          ** branc
e750: 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20  h below.  */.   
e760: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e770: 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
e780: 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70 72  t( pTab && pExpr
e790: 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a  ->pTab==pTab );.
e7a0: 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a        if( pS ){.
e7b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22          /* The "
e7c0: 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c  table" is actual
e7d0: 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ly a sub-select 
e7e0: 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68 65  or a view in the
e7f0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20   FROM clause.   
e800: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53       ** of the S
e810: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
e820: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
e830: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
e840: 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20   origin.        
e850: 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  ** data for the 
e860: 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d  result-set colum
e870: 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  n of the sub-sel
e880: 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ect..        */.
e890: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
e8a0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e  >=0 && iCol<pS->
e8b0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
e8c0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
e8d0: 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68   iCol is less th
e8e0: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
e8f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71  e expression req
e900: 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20 20  uests the.      
e910: 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20      ** rowid of 
e920: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  the sub-select o
e930: 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78 70  r view. This exp
e940: 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c  ression is legal
e950: 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20 20   (see .         
e960: 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69   ** test case mi
e970: 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c  sc2.2.2) - it al
e980: 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20 74  ways evaluates t
e990: 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20  o NULL..        
e9a0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e    */.          N
e9b0: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
e9c0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
e9d0: 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  p = pS->pEList->
e9e0: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20  a[iCol].pExpr;. 
e9f0: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72           sNC.pSr
ea00: 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63  cList = pS->pSrc
ea10: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
ea20: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
ea30: 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73         sNC.pPars
ea40: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
ea50: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
ea60: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
ea70: 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26  NC, p,&zOrigDb,&
ea80: 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69 67 43  zOrigTab,&zOrigC
ea90: 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  ol); .        }.
eaa0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
eab0: 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74       /* A real t
eac0: 61 62 6c 65 20 6f 72 20 61 20 43 54 45 20 74 61  able or a CTE ta
ead0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ble */.        a
eae0: 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 23 69  ssert( !pS );.#i
eaf0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
eb00: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
eb10: 54 41 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  TA.        if( i
eb20: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
eb30: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
eb40: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
eb50: 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69  ==XN_ROWID || (i
eb60: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
eb70: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
eb80: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
eb90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
eba0: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
ebb0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
ebc0: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
ebd0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ebe0: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c          zOrigCol
ebf0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
ec00: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
ec10: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c       zType = sql
ec20: 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26  ite3ColumnType(&
ec30: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
ec40: 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ,0);.        }. 
ec50: 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20         zOrigTab 
ec60: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
ec70: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e         if( pNC->
ec80: 70 50 61 72 73 65 20 26 26 20 70 54 61 62 2d 3e  pParse && pTab->
ec90: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
eca0: 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
ecb0: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
ecc0: 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d  dex(pNC->pParse-
ecd0: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
ece0: 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ma);.          z
ecf0: 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50  OrigDb = pNC->pP
ed00: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
ed10: 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
ed20: 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
ed30: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
ed40: 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28  l==XN_ROWID || (
ed50: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
ed60: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
ed70: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
ed80: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
ed90: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
eda0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
edb0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
edc0: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
edd0: 54 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c  Type(&pTab->aCol
ede0: 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20  [iCol],0);.     
edf0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
ee00: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
ee10: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
ee20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
ee30: 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
ee40: 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
ee50: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
ee60: 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  n is a sub-selec
ee70: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
ee80: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
ee90: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67  nd.      ** orig
eea0: 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20  in info for the 
eeb0: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e  single column in
eec0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
eed0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  of the SELECT.  
eee0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
eef0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
ef00: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
ef10: 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  ;.      Select *
ef20: 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  pS = pExpr->x.pS
ef30: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70  elect;.      Exp
ef40: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
ef50: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
ef60: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
ef70: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
ef80: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
ef90: 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  ) );.      sNC.p
efa0: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
efb0: 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e  rc;.      sNC.pN
efc0: 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20  ext = pNC;.     
efd0: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e   sNC.pParse = pN
efe0: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  C->pParse;.     
eff0: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
f000: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f  ype(&sNC, p, &zO
f010: 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62  rigDb, &zOrigTab
f020: 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20  , &zOrigCol); . 
f030: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f040: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
f050: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
f060: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
f070: 54 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69  TA  .  if( pzOri
f080: 67 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  gDb ){.    asser
f090: 74 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20  t( pzOrigTab && 
f0a0: 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20  pzOrigCol );.   
f0b0: 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72   *pzOrigDb = zOr
f0c0: 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  igDb;.    *pzOri
f0d0: 67 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b  gTab = zOrigTab;
f0e0: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20  .    *pzOrigCol 
f0f0: 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a  = zOrigCol;.  }.
f100: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
f110: 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zType;.}../*.** 
f120: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
f130: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
f140: 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72   VDBE the declar
f150: 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63  ation types of c
f160: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
f170: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a   result set..*/.
f180: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
f190: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
f1a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
f1b0: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
f1c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
f1d0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
f1e0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
f1f0: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
f200: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
f210: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
f220: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
f230: 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  set */.){.#ifnde
f240: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
f250: 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76  CLTYPE.  Vdbe *v
f260: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
f270: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  ;.  int i;.  Nam
f280: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
f290: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
f2a0: 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70  TabList;.  sNC.p
f2b0: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
f2c0: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b    sNC.pNext = 0;
f2d0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
f2e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
f2f0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
f300: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
f310: 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  xpr;.    const c
f320: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64  har *zType;.#ifd
f330: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f340: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
f350: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f360: 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20  *zOrigDb = 0;.  
f370: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
f380: 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  rigTab = 0;.    
f390: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
f3a0: 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54  gCol = 0;.    zT
f3b0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
f3c0: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
f3d0: 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26  Db, &zOrigTab, &
f3e0: 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20  zOrigCol);..    
f3f0: 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74  /* The vdbe must
f400: 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f   make its own co
f410: 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
f420: 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20  -type and other 
f430: 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73  .    ** column s
f440: 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c  pecific strings,
f450: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68   in case the sch
f460: 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66  ema is reset bef
f470: 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ore this.    ** 
f480: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
f490: 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  is deleted..    
f4a0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
f4b0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
f4c0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42  i, COLNAME_DATAB
f4d0: 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51  ASE, zOrigDb, SQ
f4e0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
f4f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f500: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
f510: 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20   COLNAME_TABLE, 
f520: 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45  zOrigTab, SQLITE
f530: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
f540: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
f550: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
f560: 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72  NAME_COLUMN, zOr
f570: 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52  igCol, SQLITE_TR
f580: 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a  ANSIENT);.#else.
f590: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
f5a0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
f5b0: 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  0, 0, 0);.#endif
f5c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f5d0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
f5e0: 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50   COLNAME_DECLTYP
f5f0: 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45  E, zType, SQLITE
f600: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
f610: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
f620: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
f630: 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a  DECLTYPE) */.}..
f640: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
f650: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
f660: 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61  for a SELECT sta
f670: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
f680: 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65  e only guarantee
f690: 20 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b   that SQLite mak
f6a0: 65 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  es about column 
f6b0: 6e 61 6d 65 73 20 69 73 20 74 68 61 74 20 69 66  names is that if
f6c0: 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68   the.** column h
f6d0: 61 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20  as an AS clause 
f6e0: 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e  assigning it a n
f6f0: 61 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62  ame, that will b
f700: 65 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e  e the name used.
f710: 0a 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65 20  .** That is the 
f720: 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20  only documented 
f730: 67 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65  guarantee.  Howe
f740: 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61  ver, countless a
f750: 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64  pplications.** d
f760: 65 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68  eveloped over th
f770: 65 20 79 65 61 72 73 20 68 61 76 65 20 6d 61 64  e years have mad
f780: 65 20 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d  e baseless assum
f790: 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c  ptions about col
f7a0: 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64  umn names.** and
f7b0: 20 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74   will break if t
f7c0: 68 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73  hose assumptions
f7d0: 20 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65   changes.  Hence
f7e0: 2c 20 75 73 65 20 65 78 74 72 65 6d 65 20 63 61  , use extreme ca
f7f0: 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f  ution.** when mo
f800: 64 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75  difying this rou
f810: 74 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72  tine to avoid br
f820: 65 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a  eaking legacy..*
f830: 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 73  *.** See Also: s
f840: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
f850: 6d 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a  mExprList().**.*
f860: 2a 20 54 68 65 20 50 52 41 47 4d 41 20 73 68 6f  * The PRAGMA sho
f870: 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20  rt_column_names 
f880: 61 6e 64 20 50 52 41 47 4d 41 20 66 75 6c 6c 5f  and PRAGMA full_
f890: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 73 65 74  column_names set
f8a0: 74 69 6e 67 73 20 61 72 65 0a 2a 2a 20 64 65 70  tings are.** dep
f8b0: 72 65 63 61 74 65 64 2e 20 20 54 68 65 20 64 65  recated.  The de
f8c0: 66 61 75 6c 74 20 73 65 74 74 69 6e 67 20 69 73  fault setting is
f8d0: 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d   short=ON, full=
f8e0: 4f 46 46 2e 20 20 39 39 2e 39 25 20 6f 66 20 61  OFF.  99.9% of a
f8f0: 6c 6c 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f  ll.** applicatio
f900: 6e 73 20 73 68 6f 75 6c 64 20 6f 70 65 72 61 74  ns should operat
f910: 65 20 74 68 69 73 20 77 61 79 2e 20 20 4e 65 76  e this way.  Nev
f920: 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 6e 65  ertheless, we ne
f930: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 74 68  ed to support th
f940: 65 0a 2a 2a 20 6f 74 68 65 72 20 6d 6f 64 65 73  e.** other modes
f950: 20 66 6f 72 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a   for legacy:.**.
f960: 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 46 46 2c  **    short=OFF,
f970: 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20   full=OFF:      
f980: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 74  Column name is t
f990: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 65  he text of the e
f9a0: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 69 74  xpression has it
f9b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
f9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9d0: 20 6f 72 69 67 69 6e 61 6c 6c 79 20 61 70 70 65   originally appe
f9e0: 61 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ars in the SELEC
f9f0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e  T statement.  In
fa00: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
fa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa20: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
fa30: 65 20 7a 53 70 61 6e 20 6f 66 20 74 68 65 20 72  e zSpan of the r
fa40: 65 73 75 6c 74 20 65 78 70 72 65 73 73 69 6f 6e  esult expression
fa50: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74  ..**.**    short
fa60: 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20 20  =ON, full=OFF:  
fa70: 20 20 20 20 20 28 54 68 69 73 20 69 73 20 74 68       (This is th
fa80: 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e  e default settin
fa90: 67 29 2e 20 20 49 66 20 74 68 65 20 72 65 73 75  g).  If the resu
faa0: 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
fab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fac0: 20 20 20 72 65 66 65 72 73 20 64 69 72 65 63 74     refers direct
fad0: 6c 79 20 74 6f 20 61 20 74 61 62 6c 65 20 63 6f  ly to a table co
fae0: 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 0a 2a  lumn, then the.*
faf0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
fb10: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  esult column nam
fb20: 65 20 69 73 20 6a 75 73 74 20 74 68 65 20 74 61  e is just the ta
fb30: 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20  ble column.**   
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb50: 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 3a             name:
fb60: 20 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77   COLUMN.  Otherw
fb70: 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a  ise use zSpan..*
fb80: 2a 0a 2a 2a 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c  *.**    full=ON,
fb90: 20 73 68 6f 72 74 3d 41 4e 59 3a 20 20 20 20 20   short=ANY:     
fba0: 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20    If the result 
fbb0: 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
fbc0: 74 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d  to a table colum
fbd0: 6e 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  n,.**           
fbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbf0: 20 20 20 74 68 65 6e 20 74 68 65 20 72 65 73 75     then the resu
fc00: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77  lt column name w
fc10: 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ith the table na
fc20: 6d 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  me.**           
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc40: 20 20 20 70 72 65 66 69 78 2c 20 65 78 3a 20 54     prefix, ex: T
fc50: 41 42 4c 45 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74  ABLE.COLUMN.  Ot
fc60: 68 65 72 77 69 73 65 20 75 73 65 20 7a 53 70 61  herwise use zSpa
fc70: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
fc80: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
fc90: 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Names(.  Parse *
fca0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
fcb0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
fcc0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
fcd0: 65 63 74 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ect     /* Gener
fce0: 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ate column names
fcf0: 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54   for this SELECT
fd00: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
fd10: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
fd20: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
fd30: 74 20 69 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  t i;.  Table *pT
fd40: 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ab;.  SrcList *p
fd50: 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
fd60: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73  ist *pEList;.  s
fd70: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
fd80: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66  rse->db;.  int f
fd90: 75 6c 6c 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 54  ullName;    /* T
fda0: 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e  ABLE.COLUMN if n
fdb0: 6f 20 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20  o AS clause and 
fdc0: 69 73 20 61 20 64 69 72 65 63 74 20 74 61 62 6c  is a direct tabl
fdd0: 65 20 72 65 66 20 2a 2f 0a 20 20 69 6e 74 20 73  e ref */.  int s
fde0: 72 63 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 43  rcName;     /* C
fdf0: 4f 4c 55 4d 4e 20 6f 72 20 54 41 42 4c 45 2e 43  OLUMN or TABLE.C
fe00: 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63  OLUMN if no AS c
fe10: 6c 61 75 73 65 20 61 6e 64 20 69 73 20 64 69 72  lause and is dir
fe20: 65 63 74 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ect */..#ifndef 
fe30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
fe40: 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  AIN.  /* If this
fe50: 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20   is an EXPLAIN, 
fe60: 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a  skip this step *
fe70: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
fe80: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72  explain ){.    r
fe90: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
fea0: 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  f..  if( pParse-
feb0: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
fec0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
fed0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20   ) return;.  /* 
fee0: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65  Column names are
fef0: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
ff00: 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  he left-most ter
ff10: 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  m of a compound 
ff20: 73 65 6c 65 63 74 20 2a 2f 0a 20 20 77 68 69 6c  select */.  whil
ff30: 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  e( pSelect->pPri
ff40: 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70  or ) pSelect = p
ff50: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a  Select->pPrior;.
ff60: 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
ff70: 70 50 61 72 73 65 2c 70 53 65 6c 65 63 74 2c 28  pParse,pSelect,(
ff80: 22 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6c 75  "generating colu
ff90: 6d 6e 20 6e 61 6d 65 73 5c 6e 22 29 29 3b 0a 20  mn names\n"));. 
ffa0: 20 70 54 61 62 4c 69 73 74 20 3d 20 70 53 65 6c   pTabList = pSel
ffb0: 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  ect->pSrc;.  pEL
ffc0: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
ffd0: 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28  EList;.  assert(
ffe0: 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   v!=0 );.  asser
fff0: 74 28 20 70 54 61 62 4c 69 73 74 21 3d 30 20 29  t( pTabList!=0 )
10000 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  ;.  pParse->colN
10010 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66  amesSet = 1;.  f
10020 75 6c 6c 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66  ullName = (db->f
10030 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
10040 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
10050 20 20 73 72 63 4e 61 6d 65 20 3d 20 28 64 62 2d    srcName = (db-
10060 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
10070 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d  ShortColNames)!=
10080 30 20 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b 0a 20  0 || fullName;. 
10090 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
100a0 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74  umCols(v, pEList
100b0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28  ->nExpr);.  for(
100c0 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
100d0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
100e0 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74  Expr *p = pEList
100f0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a 20  ->a[i].pExpr;.. 
10100 20 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20     assert( p!=0 
10110 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
10120 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
10130 55 4d 4e 20 29 3b 20 20 2f 2a 20 41 67 67 20 70  UMN );  /* Agg p
10140 72 6f 63 65 73 73 69 6e 67 20 68 61 73 20 6e 6f  rocessing has no
10150 74 20 72 75 6e 20 79 65 74 20 2a 2f 0a 20 20 20  t run yet */.   
10160 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
10170 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e  TK_COLUMN || p->
10180 70 54 61 62 21 3d 30 20 29 3b 20 2f 2a 20 43 6f  pTab!=0 ); /* Co
10190 76 65 72 69 6e 67 20 69 64 78 20 6e 6f 74 20 79  vering idx not y
101a0 65 74 20 63 6f 64 65 64 20 2a 2f 0a 20 20 20 20  et coded */.    
101b0 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
101c0 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
101d0 2f 2a 20 41 6e 20 41 53 20 63 6c 61 75 73 65 20  /* An AS clause 
101e0 61 6c 77 61 79 73 20 74 61 6b 65 73 20 66 69 72  always takes fir
101f0 73 74 20 70 72 69 6f 72 69 74 79 20 2a 2f 0a 20  st priority */. 
10200 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
10210 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
10220 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c  zName;.      sql
10230 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
10240 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
10250 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51  _NAME, zName, SQ
10260 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
10270 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
10280 72 63 4e 61 6d 65 20 26 26 20 70 2d 3e 6f 70 3d  rcName && p->op=
10290 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
102a0 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a      char *zCol;.
102b0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
102c0 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
102d0 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 54 61     pTab = p->pTa
102e0 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  b;.      assert(
102f0 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
10300 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
10310 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
10320 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
10330 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
10340 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
10350 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
10360 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
10370 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
10380 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d  "rowid";.      }
10390 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
103a0 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
103b0 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
103c0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66     }.      if( f
103d0 75 6c 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ullName ){.     
103e0 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
103f0 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   0;.        zNam
10400 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
10410 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  tf(db, "%s.%s", 
10420 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pTab->zName, zCo
10430 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
10440 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
10450 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
10460 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  NAME, zName, SQL
10470 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
10480 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10490 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
104a0 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
104b0 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f  OLNAME_NAME, zCo
104c0 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
104d0 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ENT);.      }.  
104e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
104f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
10500 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
10510 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d  n;.      z = z==
10520 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  0 ? sqlite3MPrin
10530 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64  tf(db, "column%d
10540 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74 65  ", i+1) : sqlite
10550 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 29  3DbStrDup(db, z)
10560 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10570 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
10580 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
10590 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  , z, SQLITE_DYNA
105a0 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  MIC);.    }.  }.
105b0 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
105c0 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54  Types(pParse, pT
105d0 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
105e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
105f0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
10600 73 74 20 28 77 68 69 63 68 20 69 73 20 72 65 61  st (which is rea
10610 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66 20  lly the list of 
10620 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
10630 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65 73  hat form the res
10640 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c  ult set of a SEL
10650 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20 63  ECT statement) c
10660 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69 61  ompute appropria
10670 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d  te.** column nam
10680 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74  es for a table t
10690 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74  hat would hold t
106a0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
106b0 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f  st..**.** All co
106c0 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20  lumn names will 
106d0 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a  be unique..**.**
106e0 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   Only the column
106f0 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70 75   names are compu
10700 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79  ted.  Column.zTy
10710 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c  pe, Column.zColl
10720 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66  ,.** and other f
10730 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20  ields of Column 
10740 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a  are zeroed..**.*
10750 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
10760 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
10770 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
10780 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
10790 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55  urs,.** store NU
107a0 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64  LL in *paCol and
107b0 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64   0 in *pnCol and
107c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
107d0 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OMEM..**.** The 
107e0 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74  only guarantee t
107f0 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73  hat SQLite makes
10800 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61   about column na
10810 6d 65 73 20 69 73 20 74 68 61 74 20 69 66 20 74  mes is that if t
10820 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73  he.** column has
10830 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73   an AS clause as
10840 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d  signing it a nam
10850 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  e, that will be 
10860 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a  the name used..*
10870 2a 20 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e  * That is the on
10880 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75  ly documented gu
10890 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65  arantee.  Howeve
108a0 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70  r, countless app
108b0 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76  lications.** dev
108c0 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20  eloped over the 
108d0 79 65 61 72 73 20 68 61 76 65 20 6d 61 64 65 20  years have made 
108e0 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74  baseless assumpt
108f0 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d  ions about colum
10900 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77  n names.** and w
10910 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f  ill break if tho
10920 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63  se assumptions c
10930 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20  hanges.  Hence, 
10940 75 73 65 20 65 78 74 72 65 6d 65 20 63 61 75 74  use extreme caut
10950 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69  ion.** when modi
10960 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  fying this routi
10970 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61  ne to avoid brea
10980 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a  king legacy..**.
10990 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 67 65 6e  ** See Also: gen
109a0 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
109b0 28 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ().*/.int sqlite
109c0 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
109d0 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
109e0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
109f0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
10a00 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
10a10 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
10a20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f  /* Expr list fro
10a30 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69 76  m which to deriv
10a40 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  e column names *
10a50 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20  /.  i16 *pnCol, 
10a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
10a70 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
10a80 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20  of columns here 
10a90 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61  */.  Column **pa
10aa0 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Col          /* 
10ab0 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f  Write the new co
10ac0 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a  lumn list here *
10ad0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
10ae0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10af0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
10b00 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
10b10 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
10b20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
10b30 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
10b40 20 75 33 32 20 63 6e 74 3b 20 20 20 20 20 20 20   u32 cnt;       
10b50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10b60 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d  Index added to m
10b70 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69  ake the name uni
10b80 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20  que */.  Column 
10b90 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20  *aCol, *pCol;   
10ba0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
10bb0 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20  ing over result 
10bc0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
10bd0 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
10be0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10bf0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
10c00 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
10c10 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
10c20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10c30 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20   /* Column name 
10c40 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
10c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c60 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65   /* Size of name
10c70 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20   in zName[] */. 
10c80 20 48 61 73 68 20 68 74 3b 20 20 20 20 20 20 20   Hash ht;       
10c90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10ca0 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20 63 6f  Hash table of co
10cb0 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20  lumn names */.. 
10cc0 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
10cd0 28 26 68 74 29 3b 0a 20 20 69 66 28 20 70 45 4c  (&ht);.  if( pEL
10ce0 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20  ist ){.    nCol 
10cf0 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
10d00 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69  .    aCol = sqli
10d10 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
10d20 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b  db, sizeof(aCol[
10d30 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74  0])*nCol);.    t
10d40 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30  estcase( aCol==0
10d50 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c   );.    if( nCol
10d60 3e 33 32 37 36 37 20 29 20 6e 43 6f 6c 20 3d 20  >32767 ) nCol = 
10d70 33 32 37 36 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a  32767;.  }else{.
10d80 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20      nCol = 0;.  
10d90 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a    aCol = 0;.  }.
10da0 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d    assert( nCol==
10db0 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a  (i16)nCol );.  *
10dc0 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  pnCol = nCol;.  
10dd0 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a  *paCol = aCol;..
10de0 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
10df0 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26 20  aCol; i<nCol && 
10e00 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
10e10 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  d; i++, pCol++){
10e20 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61  .    /* Get an a
10e30 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20  ppropriate name 
10e40 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20  for the column. 
10e50 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 7a     */.    if( (z
10e60 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
10e70 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  [i].zName)!=0 ){
10e80 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
10e90 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
10ea0 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20   an "AS <name>" 
10eb0 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d  phrase, use <nam
10ec0 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a  e> as the name *
10ed0 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
10ee0 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70     Expr *pColExp
10ef0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
10f00 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73  kipCollate(pELis
10f10 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
10f20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f        while( pCo
10f30 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  lExpr->op==TK_DO
10f40 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  T ){.        pCo
10f50 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72  lExpr = pColExpr
10f60 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
10f70 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78    assert( pColEx
10f80 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  pr!=0 );.      }
10f90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10fa0 43 6f 6c 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ColExpr->op!=TK_
10fb0 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
10fc0 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72      if( pColExpr
10fd0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
10fe0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ){.        /* Fo
10ff0 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68  r columns use th
11000 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61  e column name na
11010 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  me */.        in
11020 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70  t iCol = pColExp
11030 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
11040 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
11050 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62  = pColExpr->pTab
11060 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
11070 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
11080 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
11090 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
110a0 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e  PKey;.        zN
110b0 61 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20  ame = iCol>=0 ? 
110c0 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
110d0 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22  .zName : "rowid"
110e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
110f0 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
11100 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20  TK_ID ){.       
11110 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
11120 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78  sProperty(pColEx
11130 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
11140 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   );.        zNam
11150 65 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e  e = pColExpr->u.
11160 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65  zToken;.      }e
11170 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
11180 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  Use the original
11190 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c   text of the col
111a0 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  umn expression a
111b0 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20  s its name */.  
111c0 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45        zName = pE
111d0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
111e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
111f0 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b      if( zName ){
11200 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
11210 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
11220 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b, zName);.    }
11230 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61 6d  else{.      zNam
11240 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
11250 74 66 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64 22  tf(db,"column%d"
11260 2c 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ,i+1);.    }..  
11270 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
11280 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
11290 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68  s unique.  If th
112a0 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e  e name is not un
112b0 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70  ique,.    ** app
112c0 65 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74  end an integer t
112d0 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68  o the name so th
112e0 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e  at it becomes un
112f0 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ique..    */.   
11300 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68   cnt = 0;.    wh
11310 69 6c 65 28 20 7a 4e 61 6d 65 20 26 26 20 73 71  ile( zName && sq
11320 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 68  lite3HashFind(&h
11330 74 2c 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  t, zName)!=0 ){.
11340 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71        nName = sq
11350 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
11360 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
11370 6e 4e 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 20  nName>0 ){.     
11380 20 20 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31     for(j=nName-1
11390 3b 20 6a 3e 30 20 26 26 20 73 71 6c 69 74 65 33  ; j>0 && sqlite3
113a0 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d  Isdigit(zName[j]
113b0 29 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20 20  ); j--){}.      
113c0 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d    if( zName[j]==
113d0 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b  ':' ) nName = j;
113e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
113f0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
11400 72 69 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a 3a  rintf(db, "%.*z:
11410 25 75 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d  %u", nName, zNam
11420 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20  e, ++cnt);.     
11430 20 69 66 28 20 63 6e 74 3e 33 20 29 20 73 71 6c   if( cnt>3 ) sql
11440 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
11450 73 69 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63 6e  sizeof(cnt), &cn
11460 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  t);.    }.    pC
11470 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  ol->zName = zNam
11480 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  e;.    sqlite3Co
11490 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72  lumnPropertiesFr
114a0 6f 6d 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29 3b  omName(0, pCol);
114b0 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 26  .    if( zName &
114c0 26 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  & sqlite3HashIns
114d0 65 72 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c 20  ert(&ht, zName, 
114e0 70 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20  pCol)==pCol ){. 
114f0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
11500 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  ault(db);.    }.
11510 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73    }.  sqlite3Has
11520 68 43 6c 65 61 72 28 26 68 74 29 3b 0a 20 20 69  hClear(&ht);.  i
11530 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
11540 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a  led ){.    for(j
11550 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
11560 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
11570 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a  ee(db, aCol[j].z
11580 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
11590 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
115a0 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70  b, aCol);.    *p
115b0 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70  aCol = 0;.    *p
115c0 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65  nCol = 0;.    re
115d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
115e0 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  M_BKPT;.  }.  re
115f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11600 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70  }../*.** Add typ
11610 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
11620 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61  information to a
11630 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73   column list bas
11640 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43  ed on.** a SELEC
11650 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
11660 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c  .** The column l
11670 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63  ist presumably c
11680 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43  ame from selectC
11690 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78  olumnNamesFromEx
116a0 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65  prList()..** The
116b0 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73   column list has
116c0 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74   only names, not
116d0 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74   types or collat
116e0 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72  ions.  This.** r
116f0 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f  outine goes thro
11700 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65  ugh and adds the
11710 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
11720 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
11730 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72  s routine requir
11740 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e  es that all iden
11750 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53  tifiers in the S
11760 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
11770 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  nt be resolved..
11780 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
11790 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
117a0 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a  peAndCollation(.
117b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
117c0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
117d0 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  ng contexts */. 
117e0 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
117f0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f         /* Add co
11800 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d  lumn type inform
11810 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61  ation to this ta
11820 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ble */.  Select 
11830 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f  *pSelect       /
11840 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f  * SELECT used to
11850 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73   determine types
11860 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20   and collations 
11870 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
11880 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
11890 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
118a0 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  sNC;.  Column *p
118b0 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Col;.  CollSeq *
118c0 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pColl;.  int i;.
118d0 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72    Expr *p;.  str
118e0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
118f0 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  m *a;..  assert(
11900 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20   pSelect!=0 );. 
11910 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65 63   assert( (pSelec
11920 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
11930 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b  _Resolved)!=0 );
11940 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
11950 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e  >nCol==pSelect->
11960 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c  pEList->nExpr ||
11970 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11980 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  d );.  if( db->m
11990 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
119a0 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26  turn;.  memset(&
119b0 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
119c0 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63  NC));.  sNC.pSrc
119d0 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
119e0 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c  pSrc;.  a = pSel
119f0 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a  ect->pEList->a;.
11a00 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
11a10 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54  pTab->aCol; i<pT
11a20 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ab->nCol; i++, p
11a30 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  Col++){.    cons
11a40 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20  t char *zType;. 
11a50 20 20 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20     int n, m;.   
11a60 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b   p = a[i].pExpr;
11a70 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
11a80 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
11a90 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 2f   0, 0, 0);.    /
11aa0 2a 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20  * pCol->szEst = 
11ab0 2e 2e 2e 20 2f 2f 20 43 6f 6c 75 6d 6e 20 73 69  ... // Column si
11ac0 7a 65 20 65 73 74 20 66 6f 72 20 53 45 4c 45 43  ze est for SELEC
11ad0 54 20 74 61 62 6c 65 73 20 6e 65 76 65 72 20 75  T tables never u
11ae0 73 65 64 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d  sed */.    pCol-
11af0 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
11b00 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
11b10 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70  p);.    if( zTyp
11b20 65 20 29 7b 0a 20 20 20 20 20 20 6d 20 3d 20 73  e ){.      m = s
11b30 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
11b40 54 79 70 65 29 3b 0a 20 20 20 20 20 20 6e 20 3d  Type);.      n =
11b50 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
11b60 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
11b70 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65       pCol->zName
11b80 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
11b90 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c 20 70 43  locOrFree(db, pC
11ba0 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b 32  ol->zName, n+m+2
11bb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
11bc0 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  l->zName ){.    
11bd0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 43 6f 6c      memcpy(&pCol
11be0 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a 54  ->zName[n+1], zT
11bf0 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20 20 20 20  ype, m+1);.     
11c00 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67     pCol->colFlag
11c10 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53  s |= COLFLAG_HAS
11c20 54 59 50 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TYPE;.      }.  
11c30 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 6f 6c    }.    if( pCol
11c40 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20  ->affinity==0 ) 
11c50 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
11c60 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
11c70 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
11c80 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
11c90 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
11ca0 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43   if( pColl && pC
11cb0 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a  ol->zColl==0 ){.
11cc0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c        pCol->zCol
11cd0 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
11ce0 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a  Dup(db, pColl->z
11cf0 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
11d00 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  .  pTab->szTabRo
11d10 77 20 3d 20 31 3b 20 2f 2a 20 41 6e 79 20 6e 6f  w = 1; /* Any no
11d20 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 77 6f 72  n-zero value wor
11d30 6b 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ks */.}../*.** G
11d40 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74  iven a SELECT st
11d50 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74  atement, generat
11d60 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  e a Table struct
11d70 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
11d80 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  es.** the result
11d90 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c   set of that SEL
11da0 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ECT..*/.Table *s
11db0 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
11dc0 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  fSelect(Parse *p
11dd0 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
11de0 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65  Select){.  Table
11df0 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65   *pTab;.  sqlite
11e00 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
11e10 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46  db;.  int savedF
11e20 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c  lags;..  savedFl
11e30 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b  ags = db->flags;
11e40 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
11e50 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e  ~SQLITE_FullColN
11e60 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  ames;.  db->flag
11e70 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72  s |= SQLITE_Shor
11e80 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c  tColNames;.  sql
11e90 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70  ite3SelectPrep(p
11ea0 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
11eb0 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  0);.  if( pParse
11ec0 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20  ->nErr ) return 
11ed0 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c  0;.  while( pSel
11ee0 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53  ect->pPrior ) pS
11ef0 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d  elect = pSelect-
11f00 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66  >pPrior;.  db->f
11f10 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67  lags = savedFlag
11f20 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  s;.  pTab = sqli
11f30 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
11f40 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
11f50 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  ) );.  if( pTab=
11f60 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
11f70 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65   0;.  }.  /* The
11f80 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
11f90 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f  tOfSelect() is o
11fa0 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65  nly used n conte
11fb0 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73  xts where lookas
11fc0 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61  ide.  ** is disa
11fd0 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  bled */.  assert
11fe0 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
11ff0 62 44 69 73 61 62 6c 65 20 29 3b 0a 20 20 70 54  bDisable );.  pT
12000 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b  ab->nTabRef = 1;
12010 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d  .  pTab->zName =
12020 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77   0;.  pTab->nRow
12030 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73  LogEst = 200; as
12040 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74  sert( 200==sqlit
12050 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36  e3LogEst(1048576
12060 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  ) );.  sqlite3Co
12070 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
12080 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
12090 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62  t->pEList, &pTab
120a0 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
120b0 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  Col);.  sqlite3S
120c0 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
120d0 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
120e0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65  Parse, pTab, pSe
120f0 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69  lect);.  pTab->i
12100 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28  PKey = -1;.  if(
12110 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
12120 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
12130 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
12140 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72  pTab);.    retur
12150 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
12160 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
12170 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20   Get a VDBE for 
12180 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72  the given parser
12190 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74   context.  Creat
121a0 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
121b0 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20  ecessary..** If 
121c0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
121d0 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64   return NULL and
121e0 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65   leave a message
121f0 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56   in pParse..*/.V
12200 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56  dbe *sqlite3GetV
12210 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  dbe(Parse *pPars
12220 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  e){.  if( pParse
12230 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 72  ->pVdbe ){.    r
12240 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 70 56  eturn pParse->pV
12250 64 62 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dbe;.  }.  if( p
12260 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c  Parse->pToplevel
12270 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69  ==0.   && Optimi
12280 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50  zationEnabled(pP
12290 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f  arse->db,SQLITE_
122a0 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a  FactorOutConst).
122b0 20 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d    ){.    pParse-
122c0 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d  >okConstFactor =
122d0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
122e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
122f0 74 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a  te(pParse);.}...
12300 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
12310 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
12320 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
12330 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
12340 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74  on the.** pLimit
12350 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70   expressions.  p
12360 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64  Limit->pLeft and
12370 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20   pLimit->pRight 
12380 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
12390 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70  ions.** that app
123a0 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69  ear in the origi
123b0 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
123c0 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49  t after the LIMI
123d0 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20  T and OFFSET.** 
123e0 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55  keywords.  Or NU
123f0 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77  LL if those keyw
12400 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64  ords are omitted
12410 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  . iLimit and iOf
12420 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65  fset .** are the
12430 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20   integer memory 
12440 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
12450 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73   for counters us
12460 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a  ed to compute .*
12470 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20  * the limit and 
12480 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72  offset.  If ther
12490 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e  e is no limit an
124a0 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65  d/or offset, the
124b0 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64  n .** iLimit and
124c0 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67   iOffset are neg
124d0 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ative..**.** Thi
124e0 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65  s routine change
124f0 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  s the values of 
12500 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
12510 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20  et only if.** a 
12520 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20  limit or offset 
12530 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c  is defined by pL
12540 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64 20  imit->pLeft and 
12550 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2e 20  pLimit->pRight. 
12560 20 69 4c 69 6d 69 74 0a 2a 2a 20 61 6e 64 20 69   iLimit.** and i
12570 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61  Offset should ha
12580 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74  ve been preset t
12590 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65  o appropriate de
125a0 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65  fault values (ze
125b0 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ro).** prior to 
125c0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
125d0 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tine..**.** The 
125e0 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72  iOffset register
125f0 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
12600 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
12610 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f  o the value.** o
12620 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54  f the OFFSET.  T
12630 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74  he iLimit regist
12640 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
12650 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67  d to LIMIT.  Reg
12660 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74  ister.** iOffset
12670 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  +1 is initialize
12680 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45  d to LIMIT+OFFSE
12690 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66  T..**.** Only if
126a0 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d   pLimit->pLeft!=
126b0 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72  0 do the limit r
126c0 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20  egisters get.** 
126d0 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20  redefined.  The 
126e0 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
126f0 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f  or uses this pro
12700 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a  perty to force.*
12710 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74  * the reuse of t
12720 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e  he same limit an
12730 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65  d offset registe
12740 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70  rs across multip
12750 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  le.** SELECT sta
12760 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
12770 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c  ic void computeL
12780 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61  imitRegisters(Pa
12790 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
127a0 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65  ect *p, int iBre
127b0 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ak){.  Vdbe *v =
127c0 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74   0;.  int iLimit
127d0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66   = 0;.  int iOff
127e0 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  set;.  int n;.  
127f0 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70  Expr *pLimit = p
12800 2d 3e 70 4c 69 6d 69 74 3b 0a 0a 20 20 69 66 28  ->pLimit;..  if(
12810 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74   p->iLimit ) ret
12820 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  urn;..  /* .  **
12830 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61   "LIMIT -1" alwa
12840 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77  ys shows all row
12850 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d  s.  There is som
12860 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72  e.  ** controver
12870 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68  sy about what th
12880 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
12890 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20  or should be..  
128a0 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69  ** The current i
128b0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
128c0 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20  terprets "LIMIT 
128d0 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20  0" to mean.  ** 
128e0 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20  no rows..  */.  
128f0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
12900 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
12910 20 69 66 28 20 70 4c 69 6d 69 74 20 29 7b 0a 20   if( pLimit ){. 
12920 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 6d 69     assert( pLimi
12930 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d 49 54 20  t->op==TK_LIMIT 
12940 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12950 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30 20  Limit->pLeft!=0 
12960 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  );.    p->iLimit
12970 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50   = iLimit = ++pP
12980 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
12990 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
129a0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
129b0 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
129c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
129d0 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 4c 69  xprIsInteger(pLi
129e0 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 29 20  mit->pLeft, &n) 
129f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12a00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12a10 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69  _Integer, n, iLi
12a20 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  mit);.      Vdbe
12a30 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
12a40 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
12a50 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
12a60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12a70 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72 65  VdbeGoto(v, iBre
12a80 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ak);.      }else
12a90 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e   if( n>=0 && p->
12aa0 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74  nSelectRow>sqlit
12ab0 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29  e3LogEst((u64)n)
12ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
12ad0 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
12ae0 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
12af0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65  );.        p->se
12b00 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69 78  lFlags |= SF_Fix
12b10 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d  edLimit;.      }
12b20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12b30 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
12b40 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d 69 74  e(pParse, pLimit
12b50 2d 3e 70 4c 65 66 74 2c 20 69 4c 69 6d 69 74 29  ->pLeft, iLimit)
12b60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12b70 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
12b80 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69  MustBeInt, iLimi
12b90 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
12ba0 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
12bb0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
12bc0 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
12bd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12be0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp2(v, OP_IfNo
12bf0 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  t, iLimit, iBrea
12c00 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
12c10 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  (v);.    }.    i
12c20 66 28 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68  f( pLimit->pRigh
12c30 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  t ){.      p->iO
12c40 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20  ffset = iOffset 
12c50 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
12c60 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
12c70 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c  nMem++;   /* All
12c80 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72  ocate an extra r
12c90 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69  egister for limi
12ca0 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  t+offset */.    
12cb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
12cc0 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d 69 74  e(pParse, pLimit
12cd0 2d 3e 70 52 69 67 68 74 2c 20 69 4f 66 66 73 65  ->pRight, iOffse
12ce0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
12cf0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12d00 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66  P_MustBeInt, iOf
12d10 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72  fset); VdbeCover
12d20 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
12d30 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  beComment((v, "O
12d40 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29  FFSET counter"))
12d50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12d60 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
12d70 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c 69  OffsetLimit, iLi
12d80 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c 20  mit, iOffset+1, 
12d90 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  iOffset);.      
12da0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
12db0 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29  "LIMIT+OFFSET"))
12dc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
12dd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12de0 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
12df0 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  CT./*.** Return 
12e00 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
12e10 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
12e20 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d  ce for the iCol-
12e30 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20  th column of.** 
12e40 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66  the result set f
12e50 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d  or the compound-
12e60 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
12e70 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55   "p".  Return NU
12e80 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  LL if.** the col
12e90 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75  umn has no defau
12ea0 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  lt collating seq
12eb0 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uence..**.** The
12ec0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
12ed0 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  nce for the comp
12ee0 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74  ound select is t
12ef0 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  aken from the.**
12f00 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20   left-most term 
12f10 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68  of the select th
12f20 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  at has a collati
12f30 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  ng sequence..*/.
12f40 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a  static CollSeq *
12f50 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
12f60 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
12f70 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
12f80 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65   iCol){.  CollSe
12f90 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70  q *pRet;.  if( p
12fa0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
12fb0 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65  pRet = multiSele
12fc0 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
12fd0 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f  , p->pPrior, iCo
12fe0 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
12ff0 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20   pRet = 0;.  }. 
13000 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30   assert( iCol>=0
13010 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d 75   );.  /* iCol mu
13020 73 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  st be less than 
13030 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
13040 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20  .  Otherwise an 
13050 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a 2a  error would.  **
13060 20 68 61 76 65 20 62 65 65 6e 20 74 68 72 6f 77   have been throw
13070 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65 20 72 65  n during name re
13080 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65 20  solution and we 
13090 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 67  would not have g
130a0 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20  otten.  ** this 
130b0 66 61 72 20 2a 2f 0a 20 20 69 66 28 20 70 52 65  far */.  if( pRe
130c0 74 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69  t==0 && ALWAYS(i
130d0 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Col<p->pEList->n
130e0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 70 52 65  Expr) ){.    pRe
130f0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
13100 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
13110 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
13120 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  ].pExpr);.  }.  
13130 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
13140 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74  /*.** The select
13150 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
13160 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
13170 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 63  parameter is a c
13180 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a  ompound SELECT.*
13190 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  * with an ORDER 
131a0 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20  BY clause. This 
131b0 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
131c0 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  es and returns a
131d0 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75   KeyInfo.** stru
131e0 63 74 75 72 65 20 73 75 69 74 61 62 6c 65 20 66  cture suitable f
131f0 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  or implementing 
13200 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a  the ORDER BY..**
13210 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
13220 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
13230 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69  ructure is obtai
13240 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
13250 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   The calling.** 
13260 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
13270 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75  onsible for ensu
13280 72 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73  ring that this s
13290 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e  tructure is even
132a0 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e  tually.** freed.
132b0 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e  .*/.static KeyIn
132c0 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f  fo *multiSelectO
132d0 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61  rderByKeyInfo(Pa
132e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
132f0 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74  ect *p, int nExt
13300 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  ra){.  ExprList 
13310 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
13320 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e  OrderBy;.  int n
13330 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
13340 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
13350 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
13360 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49  arse->db;.  KeyI
13370 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69  nfo *pRet = sqli
13380 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
13390 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78  db, nOrderBy+nEx
133a0 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  tra, 1);.  if( p
133b0 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Ret ){.    int i
133c0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
133d0 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
133e0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
133f0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
13400 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e  em = &pOrderBy->
13410 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72  a[i];.      Expr
13420 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d   *pTerm = pItem-
13430 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f  >pExpr;.      Co
13440 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20  llSeq *pColl;.. 
13450 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
13460 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
13470 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  te ){.        pC
13480 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
13490 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
134a0 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d   pTerm);.      }
134b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
134c0 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  oll = multiSelec
134d0 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
134e0 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69   p, pItem->u.x.i
134f0 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20  OrderByCol-1);. 
13500 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
13510 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  ==0 ) pColl = db
13520 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
13530 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
13540 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20  [i].pExpr =.    
13550 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
13560 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e  rAddCollateStrin
13570 67 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  g(pParse, pTerm,
13580 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
13590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
135a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
135b0 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
135c0 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70  pRet) );.      p
135d0 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Ret->aColl[i] = 
135e0 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65  pColl;.      pRe
135f0 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  t->aSortOrder[i]
13600 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
13610 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ].sortOrder;.   
13620 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
13630 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65   pRet;.}..#ifnde
13640 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
13650 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E./*.** This rou
13660 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56  tine generates V
13670 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70  DBE code to comp
13680 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ute the content 
13690 6f 66 20 61 20 57 49 54 48 20 52 45 43 55 52 53  of a WITH RECURS
136a0 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20  IVE.** query of 
136b0 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
136c0 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62    <recursive-tab
136d0 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71  le> AS (<setup-q
136e0 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c  uery> UNION [ALL
136f0 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65  ] <recursive-que
13700 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  ry>).**         
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13720 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  \___________/   
13730 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
13740 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20  __________/.**  
13750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13760 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69           p->pPri
13770 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  or              
13780 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a          p.**.**.
13790 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78 61 63  ** There is exac
137a0 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63  tly one referenc
137b0 65 20 74 6f 20 74 68 65 20 72 65 63 75 72 73 69  e to the recursi
137c0 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ve-table in the 
137d0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f  FROM clause.** o
137e0 66 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72  f recursive-quer
137f0 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74  y, marked with t
13800 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e  he SrcList->a[].
13810 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 66  fg.isRecursive f
13820 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  lag..**.** The s
13830 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20  etup-query runs 
13840 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65  once to generate
13850 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20   an initial set 
13860 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a  of rows that go.
13870 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20  ** into a Queue 
13880 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65  table.  Rows are
13890 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
138a0 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
138b0 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20  one by.** one.  
138c0 45 61 63 68 20 72 6f 77 20 65 78 74 72 61 63 74  Each row extract
138d0 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73  ed from Queue is
138e0 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73 74   output to pDest
138f0 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67  .  Then the sing
13900 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20  le.** extracted 
13910 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20  row (now in the 
13920 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20  iCurrent table) 
13930 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74  becomes the cont
13940 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65  ent of the.** re
13950 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f  cursive-table fo
13960 72 20 61 20 72 65 63 75 72 73 69 76 65 2d 71 75  r a recursive-qu
13970 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75  ery run.  The ou
13980 74 70 75 74 20 6f 66 20 74 68 65 20 72 65 63 75  tput of the recu
13990 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69  rsive-query.** i
139a0 73 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74  s added back int
139b0 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  o the Queue tabl
139c0 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72  e.  Then another
139d0 20 72 6f 77 20 69 73 20 65 78 74 72 61 63 74 65   row is extracte
139e0 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20  d from Queue.** 
139f0 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 69 6f  and the iteratio
13a00 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69  n continues unti
13a10 6c 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  l the Queue tabl
13a20 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a  e is empty..**.*
13a30 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  * If the compoun
13a40 64 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72  d query operator
13a50 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e   is UNION then n
13a60 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73  o duplicate rows
13a70 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73   are ever.** ins
13a80 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51  erted into the Q
13a90 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ueue table.  The
13aa0 20 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65   iDistinct table
13ab0 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66   keeps a copy of
13ac0 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61   all rows.** tha
13ad0 74 20 68 61 76 65 20 65 76 65 72 20 62 65 65 6e  t have ever been
13ae0 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51   inserted into Q
13af0 75 65 75 65 20 61 6e 64 20 63 61 75 73 65 73 20  ueue and causes 
13b00 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65  duplicates to be
13b10 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20  .** discarded.  
13b20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  If the operator 
13b30 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68  is UNION ALL, th
13b40 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61 72  en duplicates ar
13b50 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a  e allowed..** .*
13b60 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 68  * If the query h
13b70 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20  as an ORDER BY, 
13b80 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20  then entries in 
13b90 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
13ba0 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f  are kept in.** O
13bb0 52 44 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e  RDER BY order an
13bc0 64 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  d the first entr
13bd0 79 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  y is extracted f
13be0 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20  or each cycle.  
13bf0 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52  Without.** an OR
13c00 44 45 52 20 42 59 2c 20 74 68 65 20 51 75 65 75  DER BY, the Queu
13c10 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20  e table is just 
13c20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66  a FIFO..**.** If
13c30 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20   a LIMIT clause 
13c40 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65  is provided, the
13c50 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20  n the iteration 
13c60 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49  stops after LIMI
13c70 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62  T rows.** have b
13c80 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44  een output to pD
13c90 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66  est.  A LIMIT of
13ca0 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f   zero means to o
13cb0 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e  utput no rows an
13cc0 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20  d a.** negative 
13cd0 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f  LIMIT means to o
13ce0 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20  utput all rows. 
13cf0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 73   If there is als
13d00 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75  o an OFFSET clau
13d10 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73  se.** with a pos
13d20 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65  itive value, the
13d30 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53  n the first OFFS
13d40 45 54 20 6f 75 74 70 75 74 73 20 61 72 65 20 64  ET outputs are d
13d50 69 73 63 61 72 64 65 64 20 72 61 74 68 65 72 0a  iscarded rather.
13d60 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65  ** than being se
13d70 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68  nt to pDest.  Th
13d80 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f  e LIMIT count do
13d90 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74  es not begin unt
13da0 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a  il after OFFSET.
13db0 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65 65  ** rows have bee
13dc0 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  n skipped..*/.st
13dd0 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
13de0 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51  teWithRecursiveQ
13df0 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70  uery(.  Parse *p
13e00 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
13e10 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
13e20 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
13e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13e40 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c  he recursive SEL
13e50 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20  ECT to be coded 
13e60 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
13e70 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
13e80 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
13e90 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
13ea0 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
13eb0 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20  c = p->pSrc;    
13ec0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
13ed0 61 75 73 65 20 6f 66 20 74 68 65 20 72 65 63 75  ause of the recu
13ee0 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20  rsive query */. 
13ef0 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70   int nCol = p->p
13f00 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f  EList->nExpr;  /
13f10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
13f20 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75 72  mns in the recur
13f30 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  sive table */.  
13f40 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
13f50 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
13f60 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
13f70 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
13f80 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
13f90 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d  Select *pSetup =
13fa0 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a   p->pPrior;   /*
13fb0 20 54 68 65 20 73 65 74 75 70 20 71 75 65 72 79   The setup query
13fc0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f   */.  int addrTo
13fd0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
13fe0 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
13ff0 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
14000 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72  addrCont, addrBr
14010 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e  eak;      /* CON
14020 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20  TINUE and BREAK 
14030 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69  addresses */.  i
14040 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b  nt iCurrent = 0;
14050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14060 54 68 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c  The Current tabl
14070 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75  e */.  int regCu
14080 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  rrent;          
14090 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
140a0 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74   holding Current
140b0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
140c0 69 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20  iQueue;         
140d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
140e0 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a   Queue table */.
140f0 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20    int iDistinct 
14100 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
14110 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69  /* To ensure uni
14120 71 75 65 20 72 65 73 75 6c 74 73 20 69 66 20 55  que results if U
14130 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44  NION */.  int eD
14140 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20  est = SRT_Fifo; 
14150 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
14160 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65 75 65  o write to Queue
14170 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
14180 20 64 65 73 74 51 75 65 75 65 3b 20 20 20 20 20   destQueue;     
14190 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73      /* SelectDes
141a0 74 20 74 61 72 67 65 74 74 69 6e 67 20 74 68 65  t targetting the
141b0 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a   Queue table */.
141c0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
141d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141e0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
141f0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
14200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14210 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
14220 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
14230 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20  *pOrderBy;      
14240 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
14250 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
14260 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20   Expr *pLimit;  
14270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14280 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e  * Saved LIMIT an
14290 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e  d OFFSET */.  in
142a0 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f  t regLimit, regO
142b0 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52  ffset;      /* R
142c0 65 67 69 73 74 65 72 73 20 75 73 65 64 20 62 79  egisters used by
142d0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
142e0 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69  T */..  /* Obtai
142f0 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
14300 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69 76  to do a recursiv
14310 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28  e query */.  if(
14320 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
14330 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
14340 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20 30  _RECURSIVE, 0, 0
14350 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  , 0) ) return;..
14360 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65    /* Process the
14370 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
14380 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74 68  T clauses, if th
14390 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61 64  ey exist */.  ad
143a0 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65  drBreak = sqlite
143b0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
143c0 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  );.  p->nSelectR
143d0 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20  ow = 320;  /* 4 
143e0 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a  billion rows */.
143f0 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
14400 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
14410 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  p, addrBreak);. 
14420 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
14430 6d 69 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20  mit;.  regLimit 
14440 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72  = p->iLimit;.  r
14450 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  egOffset = p->iO
14460 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d  ffset;.  p->pLim
14470 69 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69  it = 0;.  p->iLi
14480 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  mit = p->iOffset
14490 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79   = 0;.  pOrderBy
144a0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
144b0 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
144c0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
144d0 66 20 74 68 65 20 43 75 72 72 65 6e 74 20 74 61  f the Current ta
144e0 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ble */.  for(i=0
144f0 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d  ; ALWAYS(i<pSrc-
14500 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20  >nSrc); i++){.  
14510 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d    if( pSrc->a[i]
14520 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  .fg.isRecursive 
14530 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65 6e  ){.      iCurren
14540 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  t = pSrc->a[i].i
14550 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62 72  Cursor;.      br
14560 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
14570 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75    /* Allocate cu
14580 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66 6f  rsors numbers fo
14590 72 20 51 75 65 75 65 20 61 6e 64 20 44 69 73 74  r Queue and Dist
145a0 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73 6f  inct.  The curso
145b0 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a  r number for.  *
145c0 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74 20 74  * the Distinct t
145d0 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78 61  able must be exa
145e0 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65 72  ctly one greater
145f0 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20 6f   than Queue in o
14600 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  rder.  ** for th
14610 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 20 61  e SRT_DistFifo a
14620 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65 75 65  nd SRT_DistQueue
14630 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f   destinations to
14640 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65   work. */.  iQue
14650 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ue = pParse->nTa
14660 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  b++;.  if( p->op
14670 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
14680 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
14690 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51 75 65  By ? SRT_DistQue
146a0 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46 69 66  ue : SRT_DistFif
146b0 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63 74  o;.    iDistinct
146c0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
146d0 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
146e0 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79  eDest = pOrderBy
146f0 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20 53   ? SRT_Queue : S
14700 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73  RT_Fifo;.  }.  s
14710 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
14720 49 6e 69 74 28 26 64 65 73 74 51 75 65 75 65 2c  Init(&destQueue,
14730 20 65 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b   eDest, iQueue);
14740 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
14750 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72  cursors for Curr
14760 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20  ent, Queue, and 
14770 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72  Distinct. */.  r
14780 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50  egCurrent = ++pP
14790 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
147a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
147b0 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
147c0 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43  , iCurrent, regC
147d0 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20  urrent, nCol);. 
147e0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
147f0 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
14800 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65  eyInfo = multiSe
14810 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
14820 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
14830 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14840 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
14850 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75  enEphemeral, iQu
14860 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  eue, pOrderBy->n
14870 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20  Expr+2, 0,.     
14880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14890 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
148a0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
148b0 20 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f 72     destQueue.pOr
148c0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
148d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
148e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
148f0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
14900 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43  eral, iQueue, nC
14910 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43  ol);.  }.  VdbeC
14920 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65 75  omment((v, "Queu
14930 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69 66  e table"));.  if
14940 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  ( iDistinct ){. 
14950 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
14960 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56  hm[0] = sqlite3V
14970 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14980 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
14990 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20  Distinct, 0);.  
149a0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
149b0 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
149c0 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  l;.  }..  /* Det
149d0 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
149e0 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
149f0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
14a00 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
14a10 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f  y = 0;..  /* Sto
14a20 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  re the results o
14a30 66 20 74 68 65 20 73 65 74 75 70 2d 71 75 65 72  f the setup-quer
14a40 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20  y in Queue. */. 
14a50 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d   pSetup->pNext =
14a60 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
14a70 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
14a80 20 70 53 65 74 75 70 2c 20 26 64 65 73 74 51 75   pSetup, &destQu
14a90 65 75 65 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e  eue);.  pSetup->
14aa0 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69 66 28  pNext = p;.  if(
14ab0 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f   rc ) goto end_o
14ac0 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72  f_recursive_quer
14ad0 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  y;..  /* Find th
14ae0 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68  e next row in th
14af0 65 20 51 75 65 75 65 20 61 6e 64 20 6f 75 74 70  e Queue and outp
14b00 75 74 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20  ut that row */. 
14b10 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
14b20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14b30 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51 75 65 75  OP_Rewind, iQueu
14b40 65 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56  e, addrBreak); V
14b50 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
14b60 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74  .  /* Transfer t
14b70 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 51  he next row in Q
14b80 75 65 75 65 20 6f 76 65 72 20 74 6f 20 43 75 72  ueue over to Cur
14b90 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rent */.  sqlite
14ba0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
14bb0 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72  P_NullRow, iCurr
14bc0 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65  ent); /* To rese
14bd0 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a  t column cache *
14be0 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
14bf0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
14c00 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
14c10 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20  Column, iQueue, 
14c20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
14c30 31 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a  1, regCurrent);.
14c40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
14c50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14c60 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 51  , OP_RowData, iQ
14c70 75 65 75 65 2c 20 72 65 67 43 75 72 72 65 6e 74  ueue, regCurrent
14c80 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
14c90 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
14ca0 5f 44 65 6c 65 74 65 2c 20 69 51 75 65 75 65 29  _Delete, iQueue)
14cb0 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
14cc0 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e  he single row in
14cd0 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64   Current */.  ad
14ce0 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33  drCont = sqlite3
14cf0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
14d00 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76  ;.  codeOffset(v
14d10 2c 20 72 65 67 4f 66 66 73 65 74 2c 20 61 64 64  , regOffset, add
14d20 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74  rCont);.  select
14d30 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
14d40 2c 20 70 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20  , p, iCurrent,. 
14d50 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74       0, 0, pDest
14d60 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72  , addrCont, addr
14d70 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65  Break);.  if( re
14d80 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  gLimit ){.    sq
14d90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14da0 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65  v, OP_DecrJumpZe
14db0 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61 64  ro, regLimit, ad
14dc0 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64  drBreak);.    Vd
14dd0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
14de0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
14df0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
14e00 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a  addrCont);..  /*
14e10 20 45 78 65 63 75 74 65 20 74 68 65 20 72 65 63   Execute the rec
14e20 75 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 61  ursive SELECT ta
14e30 6b 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20  king the single 
14e40 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61  row in Current a
14e50 73 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65  s.  ** the value
14e60 20 66 6f 72 20 74 68 65 20 72 65 63 75 72 73 69   for the recursi
14e70 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20  ve-table. Store 
14e80 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
14e90 68 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20  he Queue..  */. 
14ea0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
14eb0 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20   & SF_Aggregate 
14ec0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
14ed0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
14ee0 72 65 63 75 72 73 69 76 65 20 61 67 67 72 65 67  recursive aggreg
14ef0 61 74 65 20 71 75 65 72 69 65 73 20 6e 6f 74 20  ate queries not 
14f00 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 7d  supported");.  }
14f10 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50 72  else{.    p->pPr
14f20 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ior = 0;.    sql
14f30 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
14f40 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75 65  e, p, &destQueue
14f50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
14f60 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
14f70 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
14f80 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Setup;.  }..  /*
14f90 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68   Keep running th
14fa0 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65  e loop until the
14fb0 20 51 75 65 75 65 20 69 73 20 65 6d 70 74 79 20   Queue is empty 
14fc0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
14fd0 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29  Goto(v, addrTop)
14fe0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
14ff0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
15000 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f  ddrBreak);..end_
15010 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65  of_recursive_que
15020 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  ry:.  sqlite3Exp
15030 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
15040 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65  se->db, p->pOrde
15050 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65  rBy);.  p->pOrde
15060 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
15070 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
15080 69 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  imit;.  return;.
15090 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
150a0 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
150b0 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
150c0 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ences */.static 
150d0 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
150e0 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
150f0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
15100 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
15110 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
15120 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
15130 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
15140 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
15150 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
15160 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
15170 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
15180 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
15190 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ts */.);../*.** 
151a0 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69  Handle the speci
151b0 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d  al case of a com
151c0 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61  pound-select tha
151d0 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f  t originates fro
151e0 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c  m a.** VALUES cl
151f0 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69  ause.  By handli
15200 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65  ng this as a spe
15210 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76  cial case, we av
15220 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75  oid deep.** recu
15230 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20  rsion, and thus 
15240 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65  do not need to e
15250 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54  nforce the SQLIT
15260 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
15270 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20  _SELECT.** on a 
15280 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a  VALUES clause..*
15290 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65  *.** Because the
152a0 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f   Select object o
152b0 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61  riginates from a
152c0 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a   VALUES clause:.
152d0 2a 2a 20 20 20 28 31 29 20 54 68 65 72 65 20 69  **   (1) There i
152e0 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46  s no LIMIT or OF
152f0 46 53 45 54 20 6f 72 20 65 6c 73 65 20 74 68 65  FSET or else the
15300 72 65 20 69 73 20 61 20 4c 49 4d 49 54 20 6f 66  re is a LIMIT of
15310 20 65 78 61 63 74 6c 79 20 31 0a 2a 2a 20 20 20   exactly 1.**   
15320 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20 61 72  (2) All terms ar
15330 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20 20  e UNION ALL.**  
15340 20 28 33 29 20 54 68 65 72 65 20 69 73 20 6e 6f   (3) There is no
15350 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
15360 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 4c 49 4d 49  .**.** The "LIMI
15370 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31 22 20  T of exactly 1" 
15380 63 61 73 65 20 6f 66 20 63 6f 6e 64 69 74 69 6f  case of conditio
15390 6e 20 28 31 29 20 63 6f 6d 65 73 20 61 62 6f 75  n (1) comes abou
153a0 74 20 77 68 65 6e 20 61 20 56 41 4c 55 45 53 0a  t when a VALUES.
153b0 2a 2a 20 63 6c 61 75 73 65 20 6f 63 63 75 72 73  ** clause occurs
153c0 20 77 69 74 68 69 6e 20 73 63 61 6c 61 72 20 65   within scalar e
153d0 78 70 72 65 73 73 69 6f 6e 20 28 65 78 3a 20 22  xpression (ex: "
153e0 53 45 4c 45 43 54 20 28 56 41 4c 55 45 53 28 31  SELECT (VALUES(1
153f0 29 2c 28 32 29 2c 28 33 29 29 22 29 2e 0a 2a 2a  ),(2),(3))")..**
15400 20 54 68 65 20 73 71 6c 69 74 65 33 43 6f 64 65   The sqlite3Code
15410 53 75 62 73 65 6c 65 63 74 20 77 69 6c 6c 20 68  Subselect will h
15420 61 76 65 20 61 64 64 65 64 20 74 68 65 20 4c 49  ave added the LI
15430 4d 49 54 20 31 20 63 6c 61 75 73 65 20 69 6e 20  MIT 1 clause in 
15440 74 68 74 20 63 61 73 65 2e 0a 2a 2a 20 53 69 6e  tht case..** Sin
15450 63 65 20 74 68 65 20 6c 69 6d 69 74 20 69 73 20  ce the limit is 
15460 65 78 61 63 74 6c 79 20 31 2c 20 77 65 20 6f 6e  exactly 1, we on
15470 6c 79 20 6e 65 65 64 20 74 6f 20 65 76 61 6c 75  ly need to evalu
15480 74 65 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  tes the left-mos
15490 74 20 56 41 4c 55 45 53 2e 0a 2a 2f 0a 73 74 61  t VALUES..*/.sta
154a0 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
154b0 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72  ectValues(.  Par
154c0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
154d0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
154e0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
154f0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
15500 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
15510 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
15520 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
15530 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
15540 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
15550 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
15560 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65  sults */.){.  Se
15570 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20  lect *pPrior;.  
15580 53 65 6c 65 63 74 20 2a 70 52 69 67 68 74 6d 6f  Select *pRightmo
15590 73 74 20 3d 20 70 3b 0a 20 20 69 6e 74 20 6e 52  st = p;.  int nR
155a0 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72 63  ow = 1;.  int rc
155b0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
155c0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
155d0 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a 20  _MultiValue );. 
155e0 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28   do{.    assert(
155f0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
15600 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20 20 20  F_Values );.    
15610 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
15620 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d  K_ALL || (p->op=
15630 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 2d  =TK_SELECT && p-
15640 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a 20  >pPrior==0) );. 
15650 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e     assert( p->pN
15660 65 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c  ext==0 || p->pEL
15670 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70  ist->nExpr==p->p
15680 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  Next->pEList->nE
15690 78 70 72 20 29 3b 0a 20 20 20 20 69 66 28 20 70  xpr );.    if( p
156a0 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 62 72  ->pPrior==0 ) br
156b0 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  eak;.    assert(
156c0 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78   p->pPrior->pNex
156d0 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 20 3d 20  t==p );.    p = 
156e0 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e  p->pPrior;.    n
156f0 52 6f 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  Row++;.  }while(
15700 31 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  1);.  while( p )
15710 7b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70  {.    pPrior = p
15720 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d  ->pPrior;.    p-
15730 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
15740 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
15750 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ect(pParse, p, p
15760 44 65 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 50  Dest);.    p->pP
15770 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
15780 20 20 20 69 66 28 20 72 63 20 7c 7c 20 70 52 69     if( rc || pRi
15790 67 68 74 6d 6f 73 74 2d 3e 70 4c 69 6d 69 74 20  ghtmost->pLimit 
157a0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d 3e  ) break;.    p->
157b0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 52 6f  nSelectRow = nRo
157c0 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  w;.    p = p->pN
157d0 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
157e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
157f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
15800 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73  alled to process
15810 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
15820 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74  y form from.** t
15830 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
15840 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69 6e  ate queries usin
15850 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41  g UNION, UNION A
15860 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a  LL, EXCEPT, or.*
15870 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a  * INTERSECT.**.*
15880 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20  * "p" points to 
15890 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  the right-most o
158a0 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65  f the two querie
158b0 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e  s.  the query on
158c0 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20   the.** left is 
158d0 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20  p->pPrior.  The 
158e0 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64  left query could
158f0 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f   also be a compo
15900 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20  und query.** in 
15910 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20  which case this 
15920 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
15930 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
15940 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ly. .**.** The r
15950 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f  esults of the to
15960 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f  tal query are to
15970 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
15980 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a   a destination.*
15990 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20  * of type eDest 
159a0 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  with parameter i
159b0 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  Parm..**.** Exam
159c0 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72  ple 1:  Consider
159d0 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d   a three-way com
159e0 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d  pound SQL statem
159f0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ent..**.**     S
15a00 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
15a10 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46  UNION SELECT b F
15a20 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c  ROM t2 UNION SEL
15a30 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
15a40 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65  .** This stateme
15a50 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20  nt is parsed up 
15a60 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
15a70 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46  *     SELECT c F
15a80 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c  ROM t3.**      |
15a90 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e  .**      `----->
15aa0 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
15ab0 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t2.**           
15ac0 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
15ad0 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d           `------
15ae0 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  >  SELECT a FROM
15af0 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72   t1.**.** The ar
15b00 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67  rows in the diag
15b10 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73  ram above repres
15b20 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70  ent the Select.p
15b30 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a  Prior pointer..*
15b40 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75  * So if this rou
15b50 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
15b60 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74  ith p equal to t
15b70 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65  he t3 query, the
15b80 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c  n.** pPrior will
15b90 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79   be the t2 query
15ba0 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65  .  p->op will be
15bb0 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69   TK_UNION in thi
15bc0 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  s case..**.** No
15bd0 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73  tice that becaus
15be0 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c  e of the way SQL
15bf0 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f  ite parses compo
15c00 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65  und SELECTs, the
15c10 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73  .** individual s
15c20 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72  elects always gr
15c30 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  oup from left to
15c40 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69   right..*/.stati
15c50 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
15c60 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
15c70 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
15c80 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
15c90 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
15ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15cb0 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
15cc0 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
15cd0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
15ce0 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
15cf0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
15d00 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
15d10 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
15d20 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53  QLITE_OK;   /* S
15d30 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d  uccess code from
15d40 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
15d50 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
15d60 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
15d70 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
15d80 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
15d90 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15db0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
15dc0 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
15dd0 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
15de0 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e  ;      /* Altern
15df0 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74 69  ative data desti
15e00 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  nation */.  Sele
15e10 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b  ct *pDelete = 0;
15e20 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69    /* Chain of si
15e30 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20  mple selects to 
15e40 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69  delete */.  sqli
15e50 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
15e60 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
15e70 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e  nnection */.#ifn
15e80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15e90 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53  EXPLAIN.  int iS
15ea0 75 62 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ub1 = 0;        
15eb0 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66  /* EQP id of lef
15ec0 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
15ed0 20 20 69 6e 74 20 69 53 75 62 32 20 3d 20 30 3b    int iSub2 = 0;
15ee0 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
15ef0 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20  d of right-hand 
15f00 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a  query */.#endif.
15f10 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
15f20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
15f30 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c  R BY or LIMIT cl
15f40 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45  ause on prior SE
15f50 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a  LECTs.  Only.  *
15f60 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68  * the last (righ
15f70 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69  t-most) SELECT i
15f80 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79  n the series may
15f90 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
15fa0 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f  Y or LIMIT..  */
15fb0 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20  .  assert( p && 
15fc0 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a  p->pPrior );  /*
15fd0 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   Calling functio
15fe0 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 69  n guarantees thi
15ff0 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73 65  s much */.  asse
16000 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  rt( (p->selFlags
16010 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29   & SF_Recursive)
16020 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  ==0 || p->op==TK
16030 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  _ALL || p->op==T
16040 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20  K_UNION );.  db 
16050 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
16060 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
16070 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44  or;.  dest = *pD
16080 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f  est;.  if( pPrio
16090 72 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20 70  r->pOrderBy || p
160a0 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b  Prior->pLimit ){
160b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
160c0 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73 20  rMsg(pParse,"%s 
160d0 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
160e0 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
160f0 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 70  before",.      p
16100 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 21  Prior->pOrderBy!
16110 3d 30 20 3f 20 22 4f 52 44 45 52 20 42 59 22 20  =0 ? "ORDER BY" 
16120 3a 20 22 4c 49 4d 49 54 22 2c 20 73 65 6c 65 63  : "LIMIT", selec
16130 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
16140 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
16150 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
16160 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76  ct_end;.  }..  v
16170 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
16180 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
16190 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a  ert( v!=0 );  /*
161a0 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64   The VDBE alread
161b0 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c  y created by cal
161c0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ling function */
161d0 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
161e0 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65  e destination te
161f0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66  mporary table if
16200 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a   necessary.  */.
16210 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
16220 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
16230 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
16240 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73  >pEList );.    s
16250 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16260 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
16270 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61  eral, dest.iSDPa
16280 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  rm, p->pEList->n
16290 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73 74 2e  Expr);.    dest.
162a0 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c  eDest = SRT_Tabl
162b0 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65  e;.  }..  /* Spe
162c0 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66 6f  cial handling fo
162d0 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  r a compound-sel
162e0 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61  ect that origina
162f0 74 65 73 20 61 73 20 61 20 56 41 4c 55 45 53 20  tes as a VALUES 
16300 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  clause..  */.  i
16310 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
16320 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29   SF_MultiValue )
16330 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69  {.    rc = multi
16340 53 65 6c 65 63 74 56 61 6c 75 65 73 28 70 50 61  SelectValues(pPa
16350 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
16360 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
16370 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
16380 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61    /* Make sure a
16390 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68  ll SELECTs in th
163a0 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65  e statement have
163b0 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
163c0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a   of elements.  *
163d0 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c  * in their resul
163e0 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61  t sets..  */.  a
163f0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
16400 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69   && pPrior->pELi
16410 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  st );.  assert( 
16420 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
16430 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  ==pPrior->pEList
16440 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66 6e  ->nExpr );..#ifn
16450 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16460 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  CTE.  if( p->sel
16470 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
16480 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e 65  sive ){.    gene
16490 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76  rateWithRecursiv
164a0 65 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  eQuery(pParse, p
164b0 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73  , &dest);.  }els
164c0 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  e.#endif..  /* C
164d0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20  ompound SELECTs 
164e0 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44  that have an ORD
164f0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
16500 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74   handled separat
16510 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ely..  */.  if( 
16520 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
16530 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53     return multiS
16540 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50 61  electOrderBy(pPa
16550 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a  rse, p, pDest);.
16560 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 47 65    }else..  /* Ge
16570 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
16580 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
16590 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ht SELECT statem
165a0 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69  ents..  */.  swi
165b0 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
165c0 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b    case TK_ALL: {
165d0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20  .      int addr 
165e0 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  = 0;.      int n
165f0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61 73 73  Limit;.      ass
16600 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c  ert( !pPrior->pL
16610 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70 50  imit );.      pP
16620 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70  rior->iLimit = p
16630 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
16640 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20  pPrior->iOffset 
16650 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  = p->iOffset;.  
16660 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d      pPrior->pLim
16670 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
16680 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
16690 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
166a0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
166b0 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
166c0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
166d0 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
166e0 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d  &dest);.      p-
166f0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
16700 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
16710 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
16720 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
16730 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
16740 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
16750 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f  ->iLimit = pPrio
16760 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r->iLimit;.     
16770 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50   p->iOffset = pP
16780 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  rior->iOffset;. 
16790 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d       if( p->iLim
167a0 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64  it ){.        ad
167b0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
167c0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
167d0 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20  ot, p->iLimit); 
167e0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
167f0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
16800 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61  ment((v, "Jump a
16810 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65  head if LIMIT re
16820 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ached"));.      
16830 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74    if( p->iOffset
16840 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
16850 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16860 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69  v, OP_OffsetLimi
16870 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
16880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16890 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66  ->iLimit, p->iOf
168a0 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73  fset+1, p->iOffs
168b0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
168c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
168d0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
168e0 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
168f0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
16900 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16910 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
16920 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
16930 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
16940 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
16950 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
16960 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
16970 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
16980 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
16990 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
169a0 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63  EstAdd(p->nSelec
169b0 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53  tRow, pPrior->nS
169c0 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20  electRow);.     
169d0 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
169e0 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71  mit.       && sq
169f0 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
16a00 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  er(pPrior->pLimi
16a10 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c 69 6d 69  t->pLeft, &nLimi
16a20 74 29 0a 20 20 20 20 20 20 20 26 26 20 6e 4c 69  t).       && nLi
16a30 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c  mit>0 && p->nSel
16a40 65 63 74 52 6f 77 20 3e 20 73 71 6c 69 74 65 33  ectRow > sqlite3
16a50 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69 6d  LogEst((u64)nLim
16a60 69 74 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  it) .      ){.  
16a70 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
16a80 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
16a90 45 73 74 28 28 75 36 34 29 6e 4c 69 6d 69 74 29  Est((u64)nLimit)
16aa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16ab0 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20  if( addr ){.    
16ac0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
16ad0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
16ae0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16af0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
16b00 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
16b10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49  .    case TK_UNI
16b20 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ON: {.      int 
16b30 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20  unionTab;    /* 
16b40 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
16b50 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
16b60 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73  able holding res
16b70 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ult */.      u8 
16b80 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  op = 0;       /*
16b90 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f   One of the SRT_
16ba0 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61   operations to a
16bb0 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a  pply to self */.
16bc0 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f        int priorO
16bd0 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52  p;     /* The SR
16be0 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  T_ operation to 
16bf0 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73  apply to prior s
16c00 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20  elects */.      
16c10 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20  Expr *pLimit;   
16c20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
16c30 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 20 2a   of p->nLimit  *
16c40 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
16c50 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  ;.      SelectDe
16c60 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20  st uniondest;.. 
16c70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
16c80 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
16c90 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
16ca0 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  e( p->op==TK_UNI
16cb0 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f  ON );.      prio
16cc0 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b  rOp = SRT_Union;
16cd0 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
16ce0 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29  eDest==priorOp )
16cf0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
16d00 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70  can reuse a temp
16d10 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65  orary table gene
16d20 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43  rated by a SELEC
16d30 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20  T to our.       
16d40 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20   ** right..     
16d50 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
16d60 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d  sert( p->pLimit=
16d70 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f  =0 );      /* No
16d80 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66  t allowed on lef
16d90 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a  tward elements *
16da0 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
16db0 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  ab = dest.iSDPar
16dc0 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  m;.      }else{.
16dd0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69          /* We wi
16de0 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  ll need to creat
16df0 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72  e our own tempor
16e00 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c  ary table to hol
16e10 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
16e20 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
16e30 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  sults..        *
16e40 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
16e50 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
16e60 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  b++;.        ass
16e70 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
16e80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
16e90 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
16ea0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
16eb0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69  enEphemeral, uni
16ec0 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
16ed0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
16ee0 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
16ef0 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70   -1 );.        p
16f00 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
16f10 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
16f20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28    findRightmost(
16f30 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  p)->selFlags |= 
16f40 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
16f50 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
16f60 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
16f70 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
16f80 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
16f90 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f   statements to o
16fa0 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f  ur left.      */
16fb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
16fc0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
16fd0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
16fe0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
16ff0 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f  &uniondest, prio
17000 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a  rOp, unionTab);.
17010 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
17020 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
17030 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
17040 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
17050 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
17060 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
17070 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
17080 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
17090 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
170a0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
170b0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
170c0 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
170d0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
170e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
170f0 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43  f( p->op==TK_EXC
17100 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  EPT ){.        o
17110 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a  p = SRT_Except;.
17120 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17130 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
17140 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
17150 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54          op = SRT
17160 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a  _Union;.      }.
17170 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
17180 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69  = 0;.      pLimi
17190 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
171a0 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
171b0 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64   0;.      uniond
171c0 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a  est.eDest = op;.
171d0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
171e0 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
171f0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
17200 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
17210 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
17220 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f  pParse, p, &unio
17230 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  ndest);.      te
17240 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
17250 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f  TE_OK );.      /
17260 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69  * Query flatteni
17270 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ng in sqlite3Sel
17280 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69  ect() might refi
17290 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a  ll p->pOrderBy..
172a0 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65        ** Be sure
172b0 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f   to delete p->pO
172c0 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72  rderBy, therefor
172d0 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  e, to avoid a me
172e0 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20  mory leak. */.  
172f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
17300 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
17310 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
17320 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
17330 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
17340 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
17350 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
17360 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  By = 0;.      if
17370 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
17380 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  N ){.        p->
17390 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
173a0 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d  ite3LogEstAdd(p-
173b0 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72  >nSelectRow, pPr
173c0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29  ior->nSelectRow)
173d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
173e0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
173f0 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
17400 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
17410 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
17420 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b    p->iLimit = 0;
17430 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
17440 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  t = 0;..      /*
17450 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74   Convert the dat
17460 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  a in the tempora
17470 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68  ry table into wh
17480 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20  atever form.    
17490 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20    ** it is that 
174a0 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65  we currently nee
174b0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
174c0 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54    assert( unionT
174d0 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d  ab==dest.iSDParm
174e0 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d   || dest.eDest!=
174f0 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20  priorOp );.     
17500 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21   if( dest.eDest!
17510 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
17520 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
17530 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
17540 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17550 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
17560 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
17570 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
17580 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43  l(v);.        iC
17590 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
175a0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
175b0 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69         computeLi
175c0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
175d0 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
175e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
175f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17600 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61  _Rewind, unionTa
17610 62 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65  b, iBreak); Vdbe
17620 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
17630 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
17640 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
17650 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
17660 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
17670 28 70 50 61 72 73 65 2c 20 70 2c 20 75 6e 69 6f  (pParse, p, unio
17680 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20  nTab,.          
17690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
176a0 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
176b0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
176c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
176d0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
176e0 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
176f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17700 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
17710 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20 56  nTab, iStart); V
17720 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
17730 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17740 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
17750 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
17760 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17770 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
17780 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
17790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
177a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
177b0 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
177c0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   p->op==TK_INTER
177d0 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20  SECT ); {.      
177e0 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a  int tab1, tab2;.
177f0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
17800 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
17810 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69  .      Expr *pLi
17820 6d 69 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  mit;.      int a
17830 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  ddr;.      Selec
17840 74 44 65 73 74 20 69 6e 74 65 72 73 65 63 74 64  tDest intersectd
17850 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  est;.      int r
17860 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54  1;..      /* INT
17870 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72  ERSECT is differ
17880 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ent from the oth
17890 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71  ers since it req
178a0 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74  uires.      ** t
178b0 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wo temporary tab
178c0 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68  les.  Hence it h
178d0 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e  as its own case.
178e0 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a    Begin.      **
178f0 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74   by allocating t
17900 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c  he tables we wil
17910 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  l need..      */
17920 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50  .      tab1 = pP
17930 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
17940 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73      tab2 = pPars
17950 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
17960 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
17970 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  erBy==0 );..    
17980 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
17990 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
179a0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
179b0 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
179c0 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
179d0 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
179e0 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64   );.      p->add
179f0 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61  rOpenEphm[0] = a
17a00 64 64 72 3b 0a 20 20 20 20 20 20 66 69 6e 64 52  ddr;.      findR
17a10 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c  ightmost(p)->sel
17a20 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73  Flags |= SF_Uses
17a30 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20  Ephemeral;.     
17a40 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
17a50 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  st );..      /* 
17a60 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73  Code the SELECTs
17a70 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74   to our left int
17a80 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
17a90 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20  e "tab1"..      
17aa0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
17ab0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
17ac0 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53  intersectdest, S
17ad0 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b  RT_Union, tab1);
17ae0 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
17af0 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
17b00 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
17b10 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
17b20 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
17b30 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
17b40 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29   &intersectdest)
17b50 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
17b60 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
17b70 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
17b80 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
17b90 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
17ba0 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20  ent SELECT into 
17bb0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
17bc0 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a  "tab2".      */.
17bd0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
17be0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17bf0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
17c00 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  al, tab2, 0);.  
17c10 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
17c20 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
17c30 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
17c40 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
17c50 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70   = addr;.      p
17c60 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
17c70 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e      pLimit = p->
17c80 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
17c90 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
17ca0 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74     intersectdest
17cb0 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b  .iSDParm = tab2;
17cc0 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
17cd0 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
17ce0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
17cf0 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
17d00 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
17d10 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74  (pParse, p, &int
17d20 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
17d30 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
17d40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
17d50 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
17d60 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
17d70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
17d80 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
17d90 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f  nSelectRow>pPrio
17da0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20  r->nSelectRow ) 
17db0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
17dc0 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
17dd0 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ow;.      sqlite
17de0 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
17df0 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
17e00 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
17e10 69 6d 69 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  imit;..      /* 
17e20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
17e30 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73   take the inters
17e40 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77  ection of the tw
17e50 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  o temporary.    
17e60 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20    ** tables..   
17e70 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
17e80 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
17e90 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20  .      iBreak = 
17ea0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
17eb0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
17ec0 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
17ed0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
17ee0 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
17ef0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
17f00 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
17f10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17f20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
17f30 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65  wind, tab1, iBre
17f40 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
17f50 65 28 76 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  e(v);.      r1 =
17f60 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
17f70 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
17f80 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
17f90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17fa0 4f 50 5f 52 6f 77 44 61 74 61 2c 20 74 61 62 31  OP_RowData, tab1
17fb0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
17fc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
17fd0 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
17fe0 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72  , tab2, iCont, r
17ff0 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  1, 0); VdbeCover
18000 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
18010 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
18020 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
18030 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
18040 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
18050 2c 20 74 61 62 31 2c 0a 20 20 20 20 20 20 20 20  , tab1,.        
18060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
18070 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
18080 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
18090 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
180a0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
180b0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
180c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
180d0 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53  P_Next, tab1, iS
180e0 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72  tart); VdbeCover
180f0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
18100 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
18110 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
18120 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
18130 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18140 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b  Close, tab2, 0);
18150 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18160 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
18170 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lose, tab1, 0);.
18180 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18190 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69   }.  }..  explai
181a0 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73  nComposite(pPars
181b0 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c  e, p->op, iSub1,
181c0 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54   iSub2, p->op!=T
181d0 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f  K_ALL);..  /* Co
181e0 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  mpute collating 
181f0 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62  sequences used b
18200 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  y .  ** temporar
18210 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20  y tables needed 
18220 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
18230 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
18240 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68  ..  ** Attach th
18250 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
18260 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f  ure to all tempo
18270 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a  rary tables..  *
18280 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74  *.  ** This sect
18290 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68  ion is run by th
182a0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c  e right-most SEL
182b0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
182c0 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20  ly..  ** SELECT 
182d0 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68  statements to th
182e0 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b  e left always sk
182f0 69 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54  ip this part.  T
18300 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
18310 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20  ** SELECT might 
18320 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70  also skip this p
18330 61 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f  art if it has no
18340 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
18350 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d   and.  ** no tem
18360 70 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71  p tables are req
18370 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  uired..  */.  if
18380 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
18390 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
183a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20   ){.    int i;  
183b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183c0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
183d0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79  unter */.    Key
183e0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
183f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
18400 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
18410 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20   for the result 
18420 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63  set */.    Selec
18430 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  t *pLoop;       
18440 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
18450 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
18460 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
18470 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71  s */.    CollSeq
18480 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20   **apColl;      
18490 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
184a0 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b  oping through pK
184b0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20  eyInfo->aColl[] 
184c0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
184d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
184f0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73  f columns in res
18500 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20  ult set */..    
18510 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74  assert( p->pNext
18520 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20  ==0 );.    nCol 
18530 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
18540 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  pr;.    pKeyInfo
18550 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
18560 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c  oAlloc(db, nCol,
18570 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b   1);.    if( !pK
18580 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
18590 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
185a0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  M_BKPT;.      go
185b0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
185c0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  end;.    }.    f
185d0 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70  or(i=0, apColl=p
185e0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20  KeyInfo->aColl; 
185f0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43  i<nCol; i++, apC
18600 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61  oll++){.      *a
18610 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
18620 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
18630 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
18640 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29  if( 0==*apColl )
18650 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c  {.        *apCol
18660 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
18670 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
18680 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ..    for(pLoop=
18690 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
186a0 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  pLoop->pPrior){.
186b0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
186c0 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
186d0 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f    int addr = pLo
186e0 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
186f0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
18700 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20   addr<0 ){.     
18710 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69       /* If [0] i
18720 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31  s unused then [1
18730 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64  ] is also unused
18740 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20  .  So we can.   
18750 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
18760 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73   safely abort as
18770 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72   soon as the fir
18780 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69  st unused slot i
18790 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  s found */.     
187a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
187b0 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
187c0 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20  [1]<0 );.       
187d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
187e0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
187f0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
18800 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a  v, addr, nCol);.
18810 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18820 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
18830 64 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69  ddr, (char*)sqli
18840 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
18850 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20  eyInfo),.       
18860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18870 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29       P4_KEYINFO)
18880 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ;.        pLoop-
18890 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
188a0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
188b0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
188c0 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
188d0 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c  yInfo);.  }..mul
188e0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  ti_select_end:. 
188f0 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
18900 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44  dest.iSdst;.  pD
18910 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73  est->nSdst = des
18920 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74  t.nSdst;.  sqlit
18930 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
18940 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72  b, pDelete);.  r
18950 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
18960 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
18970 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
18980 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f  T */../*.** Erro
18990 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 77 68  r message for wh
189a0 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74  en two or more t
189b0 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75  erms of a compou
189c0 6e 64 20 73 65 6c 65 63 74 20 68 61 76 65 20 64  nd select have d
189d0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73 69 7a 65  ifferent.** size
189e0 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 2a 2f   result sets..*/
189f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
18a00 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73  ectWrongNumTerms
18a10 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61  Error(Parse *pPa
18a20 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
18a30 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
18a40 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29  gs & SF_Values )
18a50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
18a60 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
18a70 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68  ll VALUES must h
18a80 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
18a90 62 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a  ber of terms");.
18aa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
18ab0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
18ac0 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f  rse, "SELECTs to
18ad0 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
18ae0 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20  ght of %s".     
18af0 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74   " do not have t
18b00 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
18b10 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
18b20 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
18b30 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  p->op));.  }.}..
18b40 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75  /*.** Code an ou
18b50 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20  tput subroutine 
18b60 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  for a coroutine 
18b70 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
18b80 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  f a.** SELECT st
18b90 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  atment..**.** Th
18ba0 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74  e data to be out
18bb0 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  put is contained
18bc0 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20   in pIn->iSdst. 
18bd0 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49   There are.** pI
18be0 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73  n->nSdst columns
18bf0 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20   to be output.  
18c00 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20 74  pDest is where t
18c10 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64  he output should
18c20 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a  .** be sent..**.
18c30 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73 20  ** regReturn is 
18c40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  the number of th
18c50 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  e register holdi
18c60 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ng the subroutin
18c70 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72  e.** return addr
18c80 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65  ess..**.** If re
18c90 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20  gPrev>0 then it 
18ca0 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65 67  is the first reg
18cb0 69 73 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f  ister in a vecto
18cc0 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64  r that.** record
18cd0 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f  s the previous o
18ce0 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50  utput.  mem[regP
18cf0 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74  rev] is a flag t
18d00 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20  hat is false.** 
18d10 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65  if there has bee
18d20 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75  n no previous ou
18d30 74 70 75 74 2e 20 20 49 66 20 72 65 67 50 72 65  tput.  If regPre
18d40 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  v>0 then code is
18d50 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f  .** generated to
18d60 20 73 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   suppress duplic
18d70 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20  ates.  pKeyInfo 
18d80 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70  is used for comp
18d90 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a  aring.** keys..*
18da0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49  *.** If the LIMI
18db0 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c  T found in p->iL
18dc0 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c  imit is reached,
18dd0 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
18de0 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a  y to.** iBreak..
18df0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
18e00 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
18e10 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20  outine(.  Parse 
18e20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
18e30 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
18e40 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
18e50 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
18e60 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
18e70 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53  statement */.  S
18e80 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20  electDest *pIn, 
18e90 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74         /* Corout
18ea0 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61  ine supplying da
18eb0 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ta */.  SelectDe
18ec0 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20  st *pDest,      
18ed0 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64  /* Where to send
18ee0 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   the data */.  i
18ef0 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20  nt regReturn,   
18f00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
18f10 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
18f20 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
18f30 65 67 50 72 65 76 2c 20 20 20 20 20 20 20 20 20  egPrev,         
18f40 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
18f50 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20  esult register. 
18f60 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69   No uniqueness i
18f70 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  f 0 */.  KeyInfo
18f80 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
18f90 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e   /* For comparin
18fa0 67 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20  g with previous 
18fb0 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  entry */.  int i
18fc0 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20  Break           
18fd0 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
18fe0 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c 49  if we hit the LI
18ff0 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  MIT */.){.  Vdbe
19000 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
19010 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74  dbe;.  int iCont
19020 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72  inue;.  int addr
19030 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  ;..  addr = sqli
19040 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
19050 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e  dr(v);.  iContin
19060 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
19070 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
19080 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75 70   /* Suppress dup
19090 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f  licates for UNIO
190a0 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
190b0 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20  NTERSECT .  */. 
190c0 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a   if( regPrev ){.
190d0 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61      int addr1, a
190e0 64 64 72 32 3b 0a 20 20 20 20 61 64 64 72 31 20  ddr2;.    addr1 
190f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
19100 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
19110 20 72 65 67 50 72 65 76 29 3b 20 56 64 62 65 43   regPrev); VdbeC
19120 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
19130 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
19140 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
19150 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53  Compare, pIn->iS
19160 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  dst, regPrev+1, 
19170 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20  pIn->nSdst,.    
19180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19190 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
191a0 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
191b0 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34  ef(pKeyInfo), P4
191c0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73  _KEYINFO);.    s
191d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
191e0 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
191f0 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  r2+2, iContinue,
19200 20 61 64 64 72 32 2b 32 29 3b 20 56 64 62 65 43   addr2+2); VdbeC
19210 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
19220 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
19230 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
19240 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19250 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
19260 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
19270 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
19280 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  st-1);.    sqlit
19290 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
192a0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
192b0 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69  egPrev);.  }.  i
192c0 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
192d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
192e0 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75  turn 0;..  /* Su
192f0 70 70 72 65 73 73 20 74 68 65 20 66 69 72 73 74  ppress the first
19300 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20   OFFSET entries 
19310 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
19320 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a  FFSET clause.  *
19330 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76  /.  codeOffset(v
19340 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
19350 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 61 73 73  ontinue);..  ass
19360 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
19370 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 3b  t!=SRT_Exists );
19380 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74  .  assert( pDest
19390 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62  ->eDest!=SRT_Tab
193a0 6c 65 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  le );.  switch( 
193b0 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a  pDest->eDest ){.
193c0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
193d0 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
193e0 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
193f0 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
19400 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
19410 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
19420 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
19430 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
19440 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
19450 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
19460 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
19470 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
19480 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
19490 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
194a0 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20  n->nSdst, r1);. 
194b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
194c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
194d0 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53  Rowid, pDest->iS
194e0 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  DParm, r2);.    
194f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19500 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
19510 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
19520 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
19530 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
19540 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
19550 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71  PPEND);.      sq
19560 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
19570 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
19580 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
19590 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
195a0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
195b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
195c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
195d0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
195e0 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
195f0 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
19600 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
19610 43 54 20 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f  CT ...)"..    */
19620 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
19630 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  t: {.      int r
19640 31 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  1;.      testcas
19650 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3e 31 20  e( pIn->nSdst>1 
19660 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
19670 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
19680 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
19690 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
196a0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
196b0 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  d, pIn->iSdst, p
196c0 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a 20 20 20 20  In->nSdst, .    
196d0 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74 2d        r1, pDest-
196e0 3e 7a 41 66 66 53 64 73 74 2c 20 70 49 6e 2d 3e  >zAffSdst, pIn->
196f0 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
19700 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
19710 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
19720 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
19730 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
19740 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19750 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
19760 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  dxInsert, pDest-
19770 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 0a 20 20  >iSDParm, r1,.  
19780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19790 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 69 53           pIn->iS
197a0 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
197b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
197c0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
197d0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
197e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
197f0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
19800 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
19810 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
19820 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
19830 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
19840 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
19850 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
19860 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
19870 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a   break out.    *
19880 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
19890 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
198a0 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
198b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
198c0 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50  ->nSdst==1 || pP
198d0 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20  arse->nErr>0 ); 
198e0 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e   testcase( pIn->
198f0 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20 20 20 20  nSdst!=1 );.    
19900 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
19910 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
19920 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d  n->iSdst, pDest-
19930 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20  >iSDParm, 1);.  
19940 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
19950 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
19960 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
19970 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
19980 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
19990 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
199a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
199b0 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a  QUERY */..    /*
199c0 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
199d0 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
199e0 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
199f0 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  rs.    ** starti
19a00 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64  ng at pDest->iSd
19a10 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  st.  Then the co
19a20 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e  -routine yields.
19a30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
19a40 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20   SRT_Coroutine: 
19a50 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73  {.      if( pDes
19a60 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
19a70 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53         pDest->iS
19a80 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dst = sqlite3Get
19a90 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
19aa0 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
19ab0 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53         pDest->nS
19ac0 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74  dst = pIn->nSdst
19ad0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19ae0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
19af0 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ove(pParse, pIn-
19b00 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69  >iSdst, pDest->i
19b10 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
19b20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19b30 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
19b40 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
19b50 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62  SDParm);.      b
19b60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
19b70 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74   /* If none of t
19b80 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74  he above, then t
19b90 68 65 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e  he result destin
19ba0 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20  ation must be.  
19bb0 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e    ** SRT_Output.
19bc0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
19bd0 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77  s never called w
19be0 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20  ith any other.  
19bf0 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e    ** destination
19c00 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
19c10 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f  ones handled abo
19c20 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74  ve or SRT_Output
19c30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
19c40 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20  For SRT_Output, 
19c50 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
19c60 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65  ed in a sequence
19c70 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20   of registers.  
19c80 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  .    ** Then the
19c90 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70   OP_ResultRow op
19ca0 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20  code is used to 
19cb0 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74  cause sqlite3_st
19cc0 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72  ep() to.    ** r
19cd0 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72  eturn the next r
19ce0 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20  ow of result..  
19cf0 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
19d00 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
19d10 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
19d20 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
19d30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19d40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
19d50 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73  ltRow, pIn->iSds
19d60 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
19d70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19d80 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
19d90 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
19da0 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
19db0 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  dst);.      brea
19dc0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
19dd0 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
19de0 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
19df0 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
19e00 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  eached..  */.  i
19e10 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
19e20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19e30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
19e40 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  JumpZero, p->iLi
19e50 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  mit, iBreak); Vd
19e60 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19e70 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
19e80 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  e the subroutine
19e90 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73   return.  */.  s
19ea0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
19eb0 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69  eLabel(v, iConti
19ec0 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nue);.  sqlite3V
19ed0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
19ee0 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72  Return, regRetur
19ef0 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64  n);..  return ad
19f00 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74  dr;.}../*.** Alt
19f10 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e  ernative compoun
19f20 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65  d select code ge
19f30 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65  nerator for case
19f40 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  s when there.** 
19f50 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
19f60 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  lause..**.** We 
19f70 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f  assume a query o
19f80 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
19f90 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
19fa0 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65   <selectA>  <ope
19fb0 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42  rator>  <selectB
19fc0 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64  >  ORDER BY <ord
19fd0 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20  erbylist>.**.** 
19fe0 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e  <operator> is on
19ff0 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  e of UNION ALL, 
1a000 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
1a010 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68  r INTERSECT.  Th
1a020 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20  e idea.** is to 
1a030 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63  code both <selec
1a040 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42  tA> and <selectB
1a050 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52  > with the ORDER
1a060 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a   BY clause as.**
1a070 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54   co-routines.  T
1a080 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72  hen run the co-r
1a090 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c  outines in paral
1a0a0 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68  lel and merge th
1a0b0 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
1a0c0 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49  o the output.  I
1a0d0 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
1a0e0 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
1a0f0 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41   (called selectA
1a100 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29   and.** selectB)
1a110 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62   there are 7 sub
1a120 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20  routines:.**.** 
1a130 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65     outA:    Move
1a140 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
1a150 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75  he selectA corou
1a160 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
1a170 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
1a180 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
1a190 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  und query..**.**
1a1a0 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76      outB:    Mov
1a1b0 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
1a1c0 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f  the selectB coro
1a1d0 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
1a1e0 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
1a1f0 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
1a200 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e  ound query.  (On
1a210 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  ly generated for
1a220 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20   UNION and.**   
1a230 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
1a240 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64  ALL.  EXCEPT and
1a250 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65   INSERTSECT neve
1a260 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74  r output a row t
1a270 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1a280 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20     appears only 
1a290 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20  in B.).**.**    
1a2a0 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AltB:    Called 
1a2b0 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
1a2c0 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
1a2d0 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e  outines and A<B.
1a2e0 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  .**.**    AeqB: 
1a2f0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
1a300 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
1a310 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
1a320 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a  s and A==B..**.*
1a330 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61  *    AgtB:    Ca
1a340 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
1a350 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
1a360 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
1a370 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45   A>B..**.**    E
1a380 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofA:    Called w
1a390 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
1a3a0 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
1a3b0 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  tA..**.**    Eof
1a3c0 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
1a3d0 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
1a3e0 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42  ted from selectB
1a3f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
1a400 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
1a410 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75  e latter five su
1a420 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64  broutines depend
1a430 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f   on which .** <o
1a440 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64  perator> is used
1a450 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  :.**.**.**      
1a460 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
1a470 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20           UNION  
1a480 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54            EXCEPT
1a490 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53            INTERS
1a4a0 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ECT.**          
1a4b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
1a4c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a4d0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
1a4e0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
1a4f0 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20  ---.**   AltB:  
1a500 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
1a510 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
1a520 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
1a530 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a          nextA.**
1a540 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75  .**   AeqB:   ou
1a550 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
1a560 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20    nextA         
1a570 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
1a580 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a    outA, nextA.**
1a590 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75  .**   AgtB:   ou
1a5a0 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f  tB, nextB      o
1a5b0 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
1a5c0 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20      nextB       
1a5d0 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a       nextB.**.**
1a5e0 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c     EofA:   outB,
1a5f0 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
1a600 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
1a610 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20   halt           
1a620 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45    halt.**.**   E
1a630 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  ofB:   outA, nex
1a640 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  tA      outA, ne
1a650 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20  xtA       outA, 
1a660 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61  nextA         ha
1a670 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  lt.**.** In the 
1a680 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20  AltB, AeqB, and 
1a690 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73  AgtB subroutines
1a6a0 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f  , an EOF on A fo
1a6b0 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a  llowing nextA.**
1a6c0 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64   causes an immed
1a6d0 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
1a6e0 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20  A and an EOF on 
1a6f0 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  B following next
1a700 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69  B causes.** an i
1a710 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
1a720 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45   EofB.  Within E
1a730 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e  ofA and EofB, an
1a740 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f  d EOF on entry o
1a750 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  r.** following n
1a760 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75  extX causes a ju
1a770 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
1a780 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63   the select proc
1a790 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75  essing..**.** Du
1a7a0 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
1a7b0 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58  in the UNION, EX
1a7c0 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
1a7d0 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e  ECT cases is han
1a7e0 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  dled.** within t
1a7f0 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
1a800 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72  tine.  The regPr
1a810 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20  ev register set 
1a820 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f  holds the previo
1a830 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76  usly.** output v
1a840 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69  alue.  A compari
1a850 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69  son is made agai
1a860 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61  nst this value a
1a870 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  nd the output.**
1a880 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
1a890 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20  he next results 
1a8a0 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d  would be the sam
1a8b0 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75  e as the previou
1a8c0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  s..**.** The imp
1a8d0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e  lementation plan
1a8e0 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74   is to implement
1a8f0 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
1a900 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a  nes and seven.**
1a910 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72   subroutines fir
1a920 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65  st, then put the
1a930 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61   control logic a
1a940 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c  t the bottom.  L
1a950 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1a960 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e           goto In
1a970 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63  it.**     coA: c
1a980 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66  oroutine for lef
1a990 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20  t query (A).**  
1a9a0 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e     coB: coroutin
1a9b0 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72  e for right quer
1a9c0 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41  y (B).**    outA
1a9d0 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
1a9e0 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42   of A.**    outB
1a9f0 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
1aa00 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64   of B (UNION and
1aa10 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29   UNION ALL only)
1aa20 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e  .**    EofA: ...
1aa30 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e  .**    EofB: ...
1aa40 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e  .**    AltB: ...
1aa50 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e  .**    AeqB: ...
1aa60 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e  .**    AgtB: ...
1aa70 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69  .**    Init: ini
1aa80 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e  tialize coroutin
1aa90 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20  e registers.**  
1aaa0 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
1aab0 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  A.**          if
1aac0 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66   eof(A) goto Eof
1aad0 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  A.**          yi
1aae0 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20  eld coB.**      
1aaf0 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f      if eof(B) go
1ab00 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d  to EofB.**    Cm
1ab10 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42  pr: Compare A, B
1ab20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d  .**          Jum
1ab30 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  p AltB, AeqB, Ag
1ab40 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e  tB.**     End: .
1ab50 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c  ...**.** We call
1ab60 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
1ab70 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66  B, EofA, and Eof
1ab80 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20  B "subroutines" 
1ab90 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74  but they are not
1aba0 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c  .** actually cal
1abb0 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20  led using Gosub 
1abc0 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  and they do not 
1abd0 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e  Return.  EofA an
1abe0 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75  d EofB loop.** u
1abf0 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73  ntil all data is
1ac00 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20   exhausted then 
1ac10 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64  jump to the "end
1ac20 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41  " labe.  AltB, A
1ac30 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42  eqB,.** and AgtB
1ac40 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20   jump to either 
1ac50 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20  L2 or to one of 
1ac60 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f  EofA or EofB..*/
1ac70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ac80 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
1ac90 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20  LECT.static int 
1aca0 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
1acb0 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
1acc0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
1acd0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1ace0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1acf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ad00 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
1ad10 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
1ad20 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
1ad30 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
1ad40 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
1ad50 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
1ad60 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
1ad70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ad80 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
1ad90 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
1ada0 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
1adb0 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
1adc0 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
1add0 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1adf0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1ae00 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
1ae10 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
1ae20 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e  A;     /* Destin
1ae30 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74  ation for corout
1ae40 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63  ine A */.  Selec
1ae50 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20  tDest destB;    
1ae60 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
1ae70 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20  for coroutine B 
1ae80 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72  */.  int regAddr
1ae90 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
1aea0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
1aeb0 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f  or select-A coro
1aec0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
1aed0 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20  egAddrB;        
1aee0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
1aef0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
1af00 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
1af10 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41   int addrSelectA
1af20 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
1af30 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
1af40 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
1af50 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42   int addrSelectB
1af60 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
1af70 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
1af80 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
1af90 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20   int regOutA;   
1afa0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1afb0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
1afc0 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
1afd0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1afe0 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20  regOutB;        
1aff0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
1b000 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
1b010 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  tput-B subroutin
1b020 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
1b030 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  utA;         /* 
1b040 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
1b050 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
1b060 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
1b070 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a  OutB = 0;     /*
1b080 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
1b090 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
1b0a0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1b0b0 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f  rEofA;         /
1b0c0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1b0d0 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73   select-A-exhaus
1b0e0 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ted subroutine *
1b0f0 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41  /.  int addrEofA
1b100 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74  _noB;     /* Alt
1b110 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20  ernate addrEofA 
1b120 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61  if B is uninitia
1b130 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  lized */.  int a
1b140 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20  ddrEofB;        
1b150 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1b160 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61  he select-B-exha
1b170 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
1b180 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c   */.  int addrAl
1b190 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tB;         /* A
1b1a0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c  ddress of the A<
1b1b0 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
1b1c0 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20    int addrAeqB; 
1b1d0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1b1e0 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73  ss of the A==B s
1b1f0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1b200 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20  nt addrAgtB;    
1b210 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1b220 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f  of the A>B subro
1b230 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
1b240 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20  egLimitA;       
1b250 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74   /* Limit regist
1b260 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
1b270 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
1b280 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  tB;        /* Li
1b290 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  mit register for
1b2a0 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69   select-A */.  i
1b2b0 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
1b2c0 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20       /* A range 
1b2d0 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
1b2e0 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75  hold previous ou
1b2f0 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  tput */.  int sa
1b300 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  vedLimit;       
1b310 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
1b320 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20  f p->iLimit */. 
1b330 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74   int savedOffset
1b340 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20  ;      /* Saved 
1b350 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66  value of p->iOff
1b360 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  set */.  int lab
1b370 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f  elCmpr;        /
1b380 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20  * Label for the 
1b390 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72  start of the mer
1b3a0 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a  ge algorithm */.
1b3b0 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20    int labelEnd; 
1b3c0 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
1b3d0 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
1b3e0 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45  the overall SELE
1b3f0 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74  CT stmt */.  int
1b400 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20   addr1;         
1b410 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72     /* Jump instr
1b420 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74  uctions that get
1b430 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a   retargetted */.
1b440 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
1b450 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
1b460 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49  f TK_ALL, TK_UNI
1b470 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54  ON, TK_EXCEPT, T
1b480 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20  K_INTERSECT */. 
1b490 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75   KeyInfo *pKeyDu
1b4a0 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72  p = 0; /* Compar
1b4b0 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
1b4c0 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72   for duplicate r
1b4d0 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49  emoval */.  KeyI
1b4e0 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20  nfo *pKeyMerge; 
1b4f0 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
1b500 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
1b510 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a  merging rows */.
1b520 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
1b530 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1b540 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1b550 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
1b560 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
1b570 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1b580 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
1b590 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
1b5a0 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
1b5b0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
1b5c0 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  lause */.  int *
1b5d0 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20  aPermute;       
1b5e0 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
1b5f0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
1b600 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  to result set co
1b610 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66  lumns */.#ifndef
1b620 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
1b630 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31  LAIN.  int iSub1
1b640 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1b650 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68  EQP id of left-h
1b660 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  and query */.  i
1b670 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20  nt iSub2;       
1b680 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
1b690 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65  f right-hand que
1b6a0 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ry */.#endif..  
1b6b0 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
1b6c0 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rBy!=0 );.  asse
1b6d0 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29  rt( pKeyDup==0 )
1b6e0 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63  ; /* "Managed" c
1b6f0 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20  ode needs this. 
1b700 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a   Ticket #3382. *
1b710 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
1b720 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  >db;.  v = pPars
1b730 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
1b740 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
1b750 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72    /* Already thr
1b760 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66  own the error if
1b770 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c   VDBE alloc fail
1b780 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64  ed */.  labelEnd
1b790 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1b7a0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61  keLabel(v);.  la
1b7b0 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65  belCmpr = sqlite
1b7c0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1b7d0 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20  );...  /* Patch 
1b7e0 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  up the ORDER BY 
1b7f0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70  clause.  */.  op
1b800 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50   = p->op;  .  pP
1b810 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
1b820 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
1b830 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  or->pOrderBy==0 
1b840 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
1b850 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61  p->pOrderBy;.  a
1b860 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20  ssert( pOrderBy 
1b870 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  );.  nOrderBy = 
1b880 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
1b890 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61  ..  /* For opera
1b8a0 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20  tors other than 
1b8b0 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76  UNION ALL we hav
1b8c0 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
1b8d0 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44  hat.  ** the ORD
1b8e0 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76  ER BY clause cov
1b8f0 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f  ers every term o
1b900 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
1b910 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d  .  Add.  ** term
1b920 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  s to the ORDER B
1b930 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65  Y clause as nece
1b940 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ssary..  */.  if
1b950 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op!=TK_ALL ){.
1b960 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d      for(i=1; db-
1b970 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
1b980 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74   && i<=p->pEList
1b990 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
1b9a0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
1b9b0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1b9c0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  ;.      for(j=0,
1b9d0 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
1b9e0 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20  >a; j<nOrderBy; 
1b9f0 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
1ba00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1ba10 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
1ba20 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  ByCol>0 );.     
1ba30 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e     if( pItem->u.
1ba40 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69  x.iOrderByCol==i
1ba50 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1ba60 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e  }.      if( j==n
1ba70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1ba80 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
1ba90 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
1baa0 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a  TK_INTEGER, 0);.
1bab0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1bac0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1bad0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
1bae0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
1baf0 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
1bb00 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
1bb10 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a  ->u.iValue = i;.
1bb20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65          p->pOrde
1bb30 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 20 3d  rBy = pOrderBy =
1bb40 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1bb50 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
1bb60 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a  OrderBy, pNew);.
1bb70 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64          if( pOrd
1bb80 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d  erBy ) pOrderBy-
1bb90 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75  >a[nOrderBy++].u
1bba0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  .x.iOrderByCol =
1bbb0 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d   (u16)i;.      }
1bbc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1bbd0 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
1bbe0 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74  parison permutat
1bbf0 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20  ion and keyinfo 
1bc00 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74  that is used wit
1bc10 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75  h.  ** the permu
1bc20 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64  tation used to d
1bc30 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
1bc40 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66  next.  ** row of
1bc50 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66   results comes f
1bc60 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73  rom selectA or s
1bc70 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64  electB.  Also ad
1bc80 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20  d explicit.  ** 
1bc90 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68  collations to th
1bca0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1bcb0 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20  e terms so that 
1bcc0 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72  when the subquer
1bcd0 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ies.  ** to the 
1bce0 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65  right and the le
1bcf0 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ft are evaluated
1bd00 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63  , they use the c
1bd10 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c  orrect.  ** coll
1bd20 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50  ation..  */.  aP
1bd30 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33  ermute = sqlite3
1bd40 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
1bd50 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e  , sizeof(int)*(n
1bd60 4f 72 64 65 72 42 79 20 2b 20 31 29 29 3b 0a 20  OrderBy + 1));. 
1bd70 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b   if( aPermute ){
1bd80 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
1bd90 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1bda0 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65 5b 30  ;.    aPermute[0
1bdb0 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  ] = nOrderBy;.  
1bdc0 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 74 65 6d    for(i=1, pItem
1bdd0 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c  =pOrderBy->a; i<
1bde0 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20  =nOrderBy; i++, 
1bdf0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1be00 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75  assert( pItem->u
1be10 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
1be20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1be30 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
1be40 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c  derByCol<=p->pEL
1be50 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
1be60 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20      aPermute[i] 
1be70 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  = pItem->u.x.iOr
1be80 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20  derByCol - 1;.  
1be90 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67    }.    pKeyMerg
1bea0 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  e = multiSelectO
1beb0 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50  rderByKeyInfo(pP
1bec0 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d  arse, p, 1);.  }
1bed0 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65  else{.    pKeyMe
1bee0 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rge = 0;.  }..  
1bef0 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65 20  /* Reattach the 
1bf00 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1bf10 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  to the query..  
1bf20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  */.  p->pOrderBy
1bf30 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
1bf40 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
1bf50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1bf60 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  tDup(pParse->db,
1bf70 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a   pOrderBy, 0);..
1bf80 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
1bf90 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61  range of tempora
1bfa0 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ry registers and
1bfb0 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65   the KeyInfo nee
1bfc0 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ded.  ** for the
1bfd0 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f   logic that remo
1bfe0 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72 65  ves duplicate re
1bff0 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74  sult rows when t
1c000 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  he.  ** operator
1c010 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50   is UNION, EXCEP
1c020 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20  T, or INTERSECT 
1c030 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41  (but not UNION A
1c040 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  LL)..  */.  if( 
1c050 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
1c060 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20    regPrev = 0;. 
1c070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1c080 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  nExpr = p->pELis
1c090 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73  t->nExpr;.    as
1c0a0 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d  sert( nOrderBy>=
1c0b0 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  nExpr || db->mal
1c0c0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1c0d0 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73   regPrev = pPars
1c0e0 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
1c0f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
1c100 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69  Expr+1;.    sqli
1c110 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c120 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
1c130 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b  regPrev);.    pK
1c140 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33 4b  eyDup = sqlite3K
1c150 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
1c160 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 69  nExpr, 1);.    i
1c170 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20  f( pKeyDup ){.  
1c180 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1c190 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
1c1a0 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29 20 29  eable(pKeyDup) )
1c1b0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1c1c0 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a   i<nExpr; i++){.
1c1d0 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d          pKeyDup-
1c1e0 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74  >aColl[i] = mult
1c1f0 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
1c200 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
1c210 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
1c220 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30  SortOrder[i] = 0
1c230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c240 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72    }. .  /* Separ
1c250 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64  ate the left and
1c260 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72 79   the right query
1c270 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65   from one anothe
1c280 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69  r.  */.  p->pPri
1c290 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72  or = 0;.  pPrior
1c2a0 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73  ->pNext = 0;.  s
1c2b0 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
1c2c0 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65  erGroupBy(pParse
1c2d0 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  , p, p->pOrderBy
1c2e0 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66  , "ORDER");.  if
1c2f0 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72  ( pPrior->pPrior
1c300 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1c310 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
1c320 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 50  oupBy(pParse, pP
1c330 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f  rior, pPrior->pO
1c340 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29  rderBy, "ORDER")
1c350 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
1c360 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65  ute the limit re
1c370 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d  gisters */.  com
1c380 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
1c390 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61  rs(pParse, p, la
1c3a0 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70  belEnd);.  if( p
1c3b0 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d  ->iLimit && op==
1c3c0 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65  TK_ALL ){.    re
1c3d0 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72  gLimitA = ++pPar
1c3e0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
1c3f0 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72  gLimitB = ++pPar
1c400 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
1c410 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1c420 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69  v, OP_Copy, p->i
1c430 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66  Offset ? p->iOff
1c440 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69  set+1 : p->iLimi
1c450 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c470 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b       regLimitA);
1c480 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c490 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
1c4a0 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65  y, regLimitA, re
1c4b0 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73  gLimitB);.  }els
1c4c0 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41  e{.    regLimitA
1c4d0 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30   = regLimitB = 0
1c4e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
1c4f0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
1c500 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70  >pLimit);.  p->p
1c510 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 72 65  Limit = 0;..  re
1c520 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73  gAddrA = ++pPars
1c530 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64  e->nMem;.  regAd
1c540 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  drB = ++pParse->
1c550 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20  nMem;.  regOutA 
1c560 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1c570 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b  ;.  regOutB = ++
1c580 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1c590 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
1c5a0 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52  tInit(&destA, SR
1c5b0 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  T_Coroutine, reg
1c5c0 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65  AddrA);.  sqlite
1c5d0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
1c5e0 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f  &destB, SRT_Coro
1c5f0 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29  utine, regAddrB)
1c600 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1c610 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20   a coroutine to 
1c620 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c  evaluate the SEL
1c630 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
1c640 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f   the.  ** left o
1c650 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f  f the compound o
1c660 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41  perator - the "A
1c670 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  " select..  */. 
1c680 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73   addrSelectA = s
1c690 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1c6a0 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20  tAddr(v) + 1;.  
1c6b0 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
1c6c0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1c6d0 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
1c6e0 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72  egAddrA, 0, addr
1c6f0 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65  SelectA);.  Vdbe
1c700 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66  Comment((v, "lef
1c710 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70  t SELECT"));.  p
1c720 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
1c730 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70  regLimitA;.  exp
1c740 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
1c750 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
1c760 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
1c770 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
1c780 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
1c790 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  estA);.  sqlite3
1c7a0 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
1c7b0 28 76 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  (v, regAddrA);. 
1c7c0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1c7d0 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
1c7e0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1c7f0 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
1c800 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
1c810 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a  T statement on .
1c820 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d    ** the right -
1c830 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a   the "B" select.
1c840 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63    */.  addrSelec
1c850 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
1c860 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
1c870 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71   1;.  addr1 = sq
1c880 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1c890 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
1c8a0 69 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30  ine, regAddrB, 0
1c8b0 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a  , addrSelectB);.
1c8c0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1c8d0 2c 20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22  , "right SELECT"
1c8e0 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74  ));.  savedLimit
1c8f0 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
1c900 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d  savedOffset = p-
1c910 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69  >iOffset;.  p->i
1c920 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
1c930 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20  B;.  p->iOffset 
1c940 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e  = 0;  .  explain
1c950 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
1c960 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
1c970 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69  electId);.  sqli
1c980 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
1c990 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20  , p, &destB);.  
1c9a0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65  p->iLimit = save
1c9b0 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66  dLimit;.  p->iOf
1c9c0 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73  fset = savedOffs
1c9d0 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  et;.  sqlite3Vdb
1c9e0 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c  eEndCoroutine(v,
1c9f0 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f   regAddrB);..  /
1ca00 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1ca10 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
1ca20 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
1ca30 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20   row of the A.  
1ca40 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
1ca50 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
1ca60 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
1ca70 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
1ca80 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1ca90 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74  (v, "Output rout
1caa0 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20  ine for A"));.  
1cab0 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72  addrOutA = gener
1cac0 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
1cad0 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
1cae0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
1caf0 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72  &destA, pDest, r
1cb00 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20  egOutA,.        
1cb10 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
1cb20 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c  , pKeyDup, label
1cb30 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65  End);.  .  /* Ge
1cb40 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1cb50 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
1cb60 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
1cb70 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73   of the B.  ** s
1cb80 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
1cb90 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
1cba0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
1cbb0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ect..  */.  if( 
1cbc0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
1cbd0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
1cbe0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1cbf0 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
1cc00 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a  utine for B"));.
1cc10 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67      addrOutB = g
1cc20 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
1cc30 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
1cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc50 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73   p, &destB, pDes
1cc60 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20  t, regOutB,.    
1cc70 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
1cc80 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c  Prev, pKeyDup, l
1cc90 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20  abelEnd);.  }.  
1cca0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
1ccb0 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20  ref(pKeyDup);.. 
1ccc0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1ccd0 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e  ubroutine to run
1cce0 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
1ccf0 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a  s from select A.
1cd00 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74    ** are exhaust
1cd10 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61  ed and only data
1cd20 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d   in select B rem
1cd30 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ains..  */.  if(
1cd40 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c   op==TK_EXCEPT |
1cd50 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  | op==TK_INTERSE
1cd60 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
1cd70 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66  fA_noB = addrEof
1cd80 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20  A = labelEnd;.  
1cd90 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62  }else{  .    Vdb
1cda0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1cdb0 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69   "eof-A subrouti
1cdc0 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45  ne"));.    addrE
1cdd0 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofA = sqlite3Vdb
1cde0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1cdf0 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64  sub, regOutB, ad
1ce00 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 61 64 64  drOutB);.    add
1ce10 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69  rEofA_noB = sqli
1ce20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ce30 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1ce40 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  drB, labelEnd);.
1ce50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce70 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1ce80 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
1ce90 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
1cea0 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e  rEofA);.    p->n
1ceb0 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
1cec0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e  te3LogEstAdd(p->
1ced0 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69  nSelectRow, pPri
1cee0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b  or->nSelectRow);
1cef0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
1cf00 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
1cf10 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
1cf20 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
1cf30 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20  lect B.  ** are 
1cf40 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
1cf50 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
1cf60 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t A remains..  *
1cf70 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  /.  if( op==TK_I
1cf80 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
1cf90 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45  addrEofB = addrE
1cfa0 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ofA;.    if( p->
1cfb0 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72  nSelectRow > pPr
1cfc0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ior->nSelectRow 
1cfd0 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
1cfe0 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
1cff0 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  tRow;.  }else{  
1d000 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1d010 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20  ment((v, "eof-B 
1d020 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1d030 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71     addrEofB = sq
1d040 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d050 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
1d060 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b  OutA, addrOutA);
1d070 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d080 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1d090 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61  ld, regAddrA, la
1d0a0 62 65 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76  belEnd); VdbeCov
1d0b0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
1d0c0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1d0d0 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a   addrEofB);.  }.
1d0e0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1d0f0 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
1d100 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20  e case of A<B.  
1d110 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
1d120 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42  ment((v, "A-lt-B
1d130 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1d140 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c    addrAltB = sql
1d150 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d160 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1d170 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a  utA, addrOutA);.
1d180 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d190 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1d1a0 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45   regAddrA, addrE
1d1b0 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofA); VdbeCovera
1d1c0 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
1d1d0 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65  VdbeGoto(v, labe
1d1e0 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65  lCmpr);..  /* Ge
1d1f0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
1d200 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
1d210 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66  f A==B.  */.  if
1d220 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op==TK_ALL ){.
1d230 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61      addrAeqB = a
1d240 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65  ddrAltB;.  }else
1d250 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45   if( op==TK_INTE
1d260 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
1d270 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42  rAeqB = addrAltB
1d280 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b  ;.    addrAltB++
1d290 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56  ;.  }else{.    V
1d2a0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1d2b0 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f  v, "A-eq-B subro
1d2c0 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
1d2d0 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c  drAeqB =.    sql
1d2e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d2f0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1d300 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b  ddrA, addrEofA);
1d310 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1d320 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1d330 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d  eGoto(v, labelCm
1d340 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  pr);.  }..  /* G
1d350 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1d360 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
1d370 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64  of A>B.  */.  Vd
1d380 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1d390 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75  , "A-gt-B subrou
1d3a0 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41  tine"));.  addrA
1d3b0 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  gtB = sqlite3Vdb
1d3c0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1d3d0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
1d3e0 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
1d3f0 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
1d400 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d410 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c  _Gosub, regOutB,
1d420 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a   addrOutB);.  }.
1d430 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d440 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1d450 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45   regAddrB, addrE
1d460 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofB); VdbeCovera
1d470 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
1d480 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65  VdbeGoto(v, labe
1d490 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68  lCmpr);..  /* Th
1d4a0 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63  is code runs onc
1d4b0 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
1d4c0 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f  everything..  */
1d4d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
1d4e0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
1d4f0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1d500 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1d510 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  d, regAddrA, add
1d520 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65  rEofA_noB); Vdbe
1d530 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
1d540 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d550 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1d560 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42  gAddrB, addrEofB
1d570 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1d580 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d  v);..  /* Implem
1d590 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72  ent the main mer
1d5a0 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  ge loop.  */.  s
1d5b0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1d5c0 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43  eLabel(v, labelC
1d5d0 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  mpr);.  sqlite3V
1d5e0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1d5f0 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20  Permutation, 0, 
1d600 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65  0, 0, (char*)aPe
1d610 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52  rmute, P4_INTARR
1d620 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  AY);.  sqlite3Vd
1d630 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
1d640 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53  ompare, destA.iS
1d650 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74  dst, destB.iSdst
1d660 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  , nOrderBy,.    
1d670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d680 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
1d690 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46  Merge, P4_KEYINF
1d6a0 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  O);.  sqlite3Vdb
1d6b0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
1d6c0 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20  LAG_PERMUTE);.  
1d6d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d6e0 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
1d6f0 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42  drAltB, addrAeqB
1d700 2c 20 61 64 64 72 41 67 74 42 29 3b 20 56 64 62  , addrAgtB); Vdb
1d710 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
1d720 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
1d730 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72  this point in or
1d740 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  der to terminate
1d750 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
1d760 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
1d770 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
1d780 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 52  belEnd);..  /* R
1d790 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f  eassembly the co
1d7a0 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20  mpound query so 
1d7b0 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
1d7c0 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a  freed correctly.
1d7d0 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c    ** by the call
1d7e0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
1d7f0 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
1d800 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
1d810 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1d820 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20  ->pPrior);.  }. 
1d830 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
1d840 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  ior;.  pPrior->p
1d850 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a  Next = p;..  /**
1d860 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73  * TBD:  Insert s
1d870 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20  ubroutine calls 
1d880 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73  to close cursors
1d890 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20   on incomplete. 
1d8a0 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73   **** subqueries
1d8b0 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e   ****/.  explain
1d8c0 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65  Composite(pParse
1d8d0 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20  , p->op, iSub1, 
1d8e0 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72 65 74  iSub2, 0);.  ret
1d8f0 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  urn pParse->nErr
1d900 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  !=0;.}.#endif..#
1d910 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1d920 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1d930 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1d940 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
1d950 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  ./* An instance 
1d960 6f 66 20 74 68 65 20 53 75 62 73 74 43 6f 6e 74  of the SubstCont
1d970 65 78 74 20 6f 62 6a 65 63 74 20 64 65 73 63 72  ext object descr
1d980 69 62 65 73 20 61 6e 20 73 75 62 73 74 69 74 75  ibes an substitu
1d990 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20 74 6f 20  tion edit.** to 
1d9a0 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20  be performed on 
1d9b0 61 20 70 61 72 73 65 20 74 72 65 65 2e 0a 2a 2a  a parse tree..**
1d9c0 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72 65 6e 63  .** All referenc
1d9d0 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  es to columns in
1d9e0 20 74 61 62 6c 65 20 69 54 61 62 6c 65 20 61 72   table iTable ar
1d9f0 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64  e to be replaced
1da00 20 62 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e   by correspondin
1da10 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  g.** expressions
1da20 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f 0a 74   in pEList..*/.t
1da30 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 75  ypedef struct Su
1da40 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a 20 20 50  bstContext {.  P
1da50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
1da60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1da70 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
1da80 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 3b  */.  int iTable;
1da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1daa0 2a 20 52 65 70 6c 61 63 65 20 72 65 66 65 72 65  * Replace refere
1dab0 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61 62  nces to this tab
1dac0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77  le */.  int iNew
1dad0 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
1dae0 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c 65 20 6e    /* New table n
1daf0 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  umber */.  int i
1db00 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20 20 20  sLeftJoin;      
1db10 20 20 20 20 20 2f 2a 20 41 64 64 20 54 4b 5f 49       /* Add TK_I
1db20 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63 6f 64  F_NULL_ROW opcod
1db30 65 73 20 6f 6e 20 65 61 63 68 20 72 65 70 6c 61  es on each repla
1db40 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72  cement */.  Expr
1db50 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
1db60 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65        /* Replace
1db70 6d 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  ment expressions
1db80 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f 6e 74 65   */.} SubstConte
1db90 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  xt;../* Forward 
1dba0 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a  Declarations */.
1dbb0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1dbc0 74 45 78 70 72 4c 69 73 74 28 53 75 62 73 74 43  tExprList(SubstC
1dbd0 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72 4c 69 73  ontext*, ExprLis
1dbe0 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  t*);.static void
1dbf0 20 73 75 62 73 74 53 65 6c 65 63 74 28 53 75 62   substSelect(Sub
1dc00 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53 65 6c 65  stContext*, Sele
1dc10 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  ct*, int);../*.*
1dc20 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74  * Scan through t
1dc30 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
1dc40 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76  xpr.  Replace ev
1dc50 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ery reference to
1dc60 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  .** a column in 
1dc70 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61  table number iTa
1dc80 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20  ble with a copy 
1dc90 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  of the iColumn-t
1dca0 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45  h.** entry in pE
1dcb0 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76  List.  (But leav
1dcc0 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
1dcd0 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  the ROWID column
1dce0 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29   .** unchanged.)
1dcf0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1dd00 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ine is part of t
1dd10 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72  he flattening pr
1dd20 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71  ocedure.  A subq
1dd30 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65  uery.** whose re
1dd40 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69  sult set is defi
1dd50 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70  ned by pEList ap
1dd60 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69  pears as entry i
1dd70 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c  n the.** FROM cl
1dd80 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
1dd90 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56   such that the V
1dda0 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67  DBE cursor assig
1ddb0 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46  ned to that.** F
1ddc0 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ORM clause entry
1ddd0 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69   is iTable.  Thi
1dde0 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20  s routine makes 
1ddf0 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a  the necessary .*
1de00 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78  * changes to pEx
1de10 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65  pr so that it re
1de20 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f  fers directly to
1de30 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
1de40 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71  e.** of the subq
1de50 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20  uery rather the 
1de60 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
1de70 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
1de80 74 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73  tatic Expr *subs
1de90 74 45 78 70 72 28 0a 20 20 53 75 62 73 74 43 6f  tExpr(.  SubstCo
1dea0 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20 20  ntext *pSubst,  
1deb0 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
1dec0 66 20 74 68 65 20 73 75 62 73 74 69 74 75 74 69  f the substituti
1ded0 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  on */.  Expr *pE
1dee0 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
1def0 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20  * Expr in which 
1df00 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63  substitution occ
1df10 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  urs */.){.  if( 
1df20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
1df30 6e 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  n 0;.  if( ExprH
1df40 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1df50 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20  , EP_FromJoin). 
1df60 20 20 26 26 20 70 45 78 70 72 2d 3e 69 52 69 67    && pExpr->iRig
1df70 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53 75  htJoinTable==pSu
1df80 62 73 74 2d 3e 69 54 61 62 6c 65 0a 20 20 29 7b  bst->iTable.  ){
1df90 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 52 69 67  .    pExpr->iRig
1dfa0 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 53  htJoinTable = pS
1dfb0 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b  ubst->iNewTable;
1dfc0 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72  .  }.  if( pExpr
1dfd0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
1dfe0 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
1dff0 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65  ==pSubst->iTable
1e000 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70   ){.    if( pExp
1e010 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
1e020 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
1e030 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d  = TK_NULL;.    }
1e040 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
1e050 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78   *pNew;.      Ex
1e060 70 72 20 2a 70 43 6f 70 79 20 3d 20 70 53 75 62  pr *pCopy = pSub
1e070 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45  st->pEList->a[pE
1e080 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
1e090 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20  xpr;.      Expr 
1e0a0 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20  ifNullRow;.     
1e0b0 20 61 73 73 65 72 74 28 20 70 53 75 62 73 74 2d   assert( pSubst-
1e0c0 3e 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45  >pEList!=0 && pE
1e0d0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53 75  xpr->iColumn<pSu
1e0e0 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  bst->pEList->nEx
1e0f0 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  pr );.      asse
1e100 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
1e110 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
1e120 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
1e130 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1e140 49 73 56 65 63 74 6f 72 28 70 43 6f 70 79 29 20  IsVector(pCopy) 
1e150 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e160 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67  e3VectorErrorMsg
1e170 28 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2c  (pSubst->pParse,
1e180 20 70 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 7d   pCopy);.      }
1e190 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1e1a0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 53 75 62  lite3 *db = pSub
1e1b0 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  st->pParse->db;.
1e1c0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
1e1d0 73 74 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 26  st->isLeftJoin &
1e1e0 26 20 70 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b 5f  & pCopy->op!=TK_
1e1f0 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
1e200 20 20 20 20 6d 65 6d 73 65 74 28 26 69 66 4e 75      memset(&ifNu
1e210 6c 6c 52 6f 77 2c 20 30 2c 20 73 69 7a 65 6f 66  llRow, 0, sizeof
1e220 28 69 66 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20 20  (ifNullRow));.  
1e230 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f          ifNullRo
1e240 77 2e 6f 70 20 3d 20 54 4b 5f 49 46 5f 4e 55 4c  w.op = TK_IF_NUL
1e250 4c 5f 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 20  L_ROW;.         
1e260 20 69 66 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66 74   ifNullRow.pLeft
1e270 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20   = pCopy;.      
1e280 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 69 54      ifNullRow.iT
1e290 61 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69  able = pSubst->i
1e2a0 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  NewTable;.      
1e2b0 20 20 20 20 70 43 6f 70 79 20 3d 20 26 69 66 4e      pCopy = &ifN
1e2c0 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  ullRow;.        
1e2d0 7d 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  }.        pNew =
1e2e0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
1e2f0 64 62 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20  db, pCopy, 0);. 
1e300 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
1e310 26 26 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66  && pSubst->isLef
1e320 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  tJoin ){.       
1e330 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
1e340 74 79 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e 42  ty(pNew, EP_CanB
1e350 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  eNull);.        
1e360 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  }.        if( pN
1e370 65 77 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  ew && ExprHasPro
1e380 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 46  perty(pExpr,EP_F
1e390 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
1e3a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 52 69 67        pNew->iRig
1e3b0 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 45  htJoinTable = pE
1e3c0 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
1e3d0 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
1e3e0 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
1e3f0 70 4e 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  pNew, EP_FromJoi
1e400 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n);.        }.  
1e410 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e420 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
1e430 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  r);.        pExp
1e440 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  r = pNew;.      
1e450 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
1e460 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
1e470 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52  op==TK_IF_NULL_R
1e480 4f 57 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  OW && pExpr->iTa
1e490 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61  ble==pSubst->iTa
1e4a0 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 45 78  ble ){.      pEx
1e4b0 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53 75  pr->iTable = pSu
1e4c0 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a  bst->iNewTable;.
1e4d0 20 20 20 20 7d 0a 20 20 20 20 70 45 78 70 72 2d      }.    pExpr-
1e4e0 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78  >pLeft = substEx
1e4f0 70 72 28 70 53 75 62 73 74 2c 20 70 45 78 70 72  pr(pSubst, pExpr
1e500 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 45  ->pLeft);.    pE
1e510 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75  xpr->pRight = su
1e520 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20  bstExpr(pSubst, 
1e530 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
1e540 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1e550 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1e560 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1e570 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
1e580 74 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d  t(pSubst, pExpr-
1e590 3e 78 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a  >x.pSelect, 1);.
1e5a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e5b0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
1e5c0 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e  Subst, pExpr->x.
1e5d0 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
1e5e0 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72  }.  return pExpr
1e5f0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
1e600 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20  substExprList(. 
1e610 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70   SubstContext *p
1e620 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69  Subst, /* Descri
1e630 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62  ption of the sub
1e640 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45  stitution */.  E
1e650 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20  xprList *pList  
1e660 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
1e670 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63  scan and in whic
1e680 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
1e690 74 75 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tutes */.){.  in
1e6a0 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
1e6b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1e6c0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
1e6d0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
1e6e0 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70     pList->a[i].p
1e6f0 45 78 70 72 20 3d 20 73 75 62 73 74 45 78 70 72  Expr = substExpr
1e700 28 70 53 75 62 73 74 2c 20 70 4c 69 73 74 2d 3e  (pSubst, pList->
1e710 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  a[i].pExpr);.  }
1e720 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
1e730 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 53 75  ubstSelect(.  Su
1e740 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62  bstContext *pSub
1e750 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69  st, /* Descripti
1e760 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69  on of the substi
1e770 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  tution */.  Sele
1e780 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1e790 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74    /* SELECT stat
1e7a0 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74  ement in which t
1e7b0 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
1e7c0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f  ions */.  int do
1e7d0 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20  Prior           
1e7e0 2f 2a 20 44 6f 20 73 75 62 73 74 69 74 75 74 65  /* Do substitute
1e7f0 73 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74  s on p->pPrior t
1e800 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69  oo */.){.  SrcLi
1e810 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75  st *pSrc;.  stru
1e820 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1e830 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
1e840 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
1e850 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75  rn;.  do{.    su
1e860 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62  bstExprList(pSub
1e870 73 74 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  st, p->pEList);.
1e880 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1e890 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 47 72  t(pSubst, p->pGr
1e8a0 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 75 62 73  oupBy);.    subs
1e8b0 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74  tExprList(pSubst
1e8c0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
1e8d0 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
1e8e0 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73   substExpr(pSubs
1e8f0 74 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  t, p->pHaving);.
1e900 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
1e910 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74  substExpr(pSubst
1e920 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  , p->pWhere);.  
1e930 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
1e940 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
1e950 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72  rc!=0 );.    for
1e960 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70  (i=pSrc->nSrc, p
1e970 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e  Item=pSrc->a; i>
1e980 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
1e990 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
1e9a0 65 63 74 28 70 53 75 62 73 74 2c 20 70 49 74 65  ect(pSubst, pIte
1e9b0 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a  m->pSelect, 1);.
1e9c0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
1e9d0 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b  >fg.isTabFunc ){
1e9e0 0a 20 20 20 20 20 20 20 20 73 75 62 73 74 45 78  .        substEx
1e9f0 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70  prList(pSubst, p
1ea00 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
1ea10 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1ea20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72  }.  }while( doPr
1ea30 69 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70  ior && (p = p->p
1ea40 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23  Prior)!=0 );.}.#
1ea50 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
1ea60 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1ea70 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
1ea80 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1ea90 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64  VIEW) */..#if !d
1eaa0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1eab0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1eac0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1ead0 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a  OMIT_VIEW)./*.**
1eae0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
1eaf0 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65  tempts to flatte
1eb00 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20  n subqueries as 
1eb10 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70  a performance op
1eb20 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54  timization..** T
1eb30 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1eb40 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65  rns 1 if it make
1eb50 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20  s changes and 0 
1eb60 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67  if no flattening
1eb70 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
1eb80 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65  o understand the
1eb90 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74   concept of flat
1eba0 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72  tening, consider
1ebb0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
1ebc0 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  * query:.**.**  
1ebd0 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
1ebe0 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20   (SELECT x+y AS 
1ebf0 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
1ec00 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35  z<100) WHERE a>5
1ec10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
1ec20 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d  lt way of implem
1ec30 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72  enting this quer
1ec40 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20  y is to execute 
1ec50 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  the.** subquery 
1ec60 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20  first and store 
1ec70 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
1ec80 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1ec90 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68  , then.** run th
1eca0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e  e outer query on
1ecb0 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
1ecc0 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71  table.  This req
1ecd0 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73  uires two.** pas
1ece0 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74  ses over the dat
1ecf0 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  a.  Furthermore,
1ed00 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d   because the tem
1ed10 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20  porary table.** 
1ed20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20  has no indices, 
1ed30 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1ed40 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   on the outer qu
1ed50 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ery cannot be.**
1ed60 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a   optimized..**.*
1ed70 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1ed80 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69  ttempts to rewri
1ed90 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20  te queries such 
1eda0 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74  as the above int
1edb0 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c  o.** a single fl
1edc0 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20  at select, like 
1edd0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
1ede0 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
1edf0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
1ee00 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a  100 AND a>5.**.*
1ee10 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
1ee20 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69  ated for this si
1ee30 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76  mplification giv
1ee40 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  es the same resu
1ee50 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68  lt.** but only h
1ee60 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64  as to scan the d
1ee70 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62  ata once.  And b
1ee80 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d  ecause indices m
1ee90 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f  ight .** exist o
1eea0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20  n the table t1, 
1eeb0 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20  a complete scan 
1eec0 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68  of the data migh
1eed0 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e  t be.** avoided.
1eee0 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e  .**.** Flattenin
1eef0 67 20 69 73 20 73 75 62 6a 65 63 74 20 74 6f 20  g is subject to 
1ef00 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
1ef10 6e 73 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a  nstraints:.**.**
1ef20 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f    (**)  We no lo
1ef30 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20  nger attempt to 
1ef40 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74  flatten aggregat
1ef50 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 57 61  e subqueries. Wa
1ef60 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65  s:.**        The
1ef70 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
1ef80 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61  e outer query ca
1ef90 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 61 67 67  nnot both be agg
1efa0 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
1efb0 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67  (**)  We no long
1efc0 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c  er attempt to fl
1efd0 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20  atten aggregate 
1efe0 73 75 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a  subqueries. Was:
1eff0 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 29 20 49  .**        (2) I
1f000 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
1f010 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 74  s an aggregate t
1f020 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 32  hen.**        (2
1f030 61 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  a) the outer que
1f040 72 79 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61  ry must not be a
1f050 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20   join and.**    
1f060 20 20 20 20 28 32 62 29 20 74 68 65 20 6f 75 74      (2b) the out
1f070 65 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f  er query must no
1f080 74 20 75 73 65 20 73 75 62 71 75 65 72 69 65 73  t use subqueries
1f090 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1f0a0 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f  other than the o
1f0b0 6e 65 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ne FROM-clause s
1f0c0 75 62 71 75 65 72 79 20 74 68 61 74 20 69 73 20  ubquery that is 
1f0d0 61 20 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20 20  a candidate.**  
1f0e0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 66             for f
1f0f0 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28 54 68 69  lattening.  (Thi
1f100 73 20 69 73 20 64 75 65 20 74 6f 20 74 69 63 6b  s is due to tick
1f110 65 74 20 5b 32 66 37 31 37 30 64 37 33 62 66 39  et [2f7170d73bf9
1f120 61 62 66 38 30 5d 0a 2a 2a 20 20 20 20 20 20 20  abf80].**       
1f130 20 20 20 20 20 20 66 72 6f 6d 20 32 30 31 35 2d        from 2015-
1f140 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20  02-09.).**.**   
1f150 28 33 29 20 20 49 66 20 74 68 65 20 73 75 62 71  (3)  If the subq
1f160 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
1f170 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c  t operand of a L
1f180 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a 2a  EFT JOIN then.**
1f190 20 20 20 20 20 20 20 20 28 33 61 29 20 74 68 65          (3a) the
1f1a0 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
1f1b0 74 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a  t be a join and.
1f1c0 2a 2a 20 20 20 20 20 20 20 20 28 33 62 29 20 74  **        (3b) t
1f1d0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1f1e0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6d  f the subquery m
1f1f0 61 79 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ay not contain a
1f200 20 76 69 72 74 75 61 6c 0a 2a 2a 20 20 20 20 20   virtual.**     
1f210 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 61 6e          table an
1f220 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 63 29  d.**        (3c)
1f230 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f240 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e 20 61   may not be an a
1f250 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ggregate..**.** 
1f260 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75    (4)  The subqu
1f270 65 72 79 20 63 61 6e 20 6e 6f 74 20 62 65 20 44  ery can not be D
1f280 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20  ISTINCT..**.**  
1f290 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69  (**)  At one poi
1f2a0 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  nt restrictions 
1f2b0 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66 69  (4) and (5) defi
1f2c0 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66 20  ned a subset of 
1f2d0 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20  DISTINCT.**     
1f2e0 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20 74     sub-queries t
1f2f0 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64 65  hat were exclude
1f300 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69  d from this opti
1f310 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69  mization. Restri
1f320 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20  ction .**       
1f330 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20 62   (4) has since b
1f340 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20  een expanded to 
1f350 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54  exclude all DIST
1f360 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73 2e  INCT subqueries.
1f370 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65  .**.**  (**)  We
1f380 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d   no longer attem
1f390 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67  pt to flatten ag
1f3a0 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69  gregate subqueri
1f3b0 65 73 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20  es.  Was:.**    
1f3c0 20 20 20 20 49 66 20 74 68 65 20 73 75 62 71 75      If the subqu
1f3d0 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65  ery is aggregate
1f3e0 2c 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  , the outer quer
1f3f0 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 44 49 53  y may not be DIS
1f400 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  TINCT..**.**   (
1f410 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  7)  The subquery
1f420 20 6d 75 73 74 20 68 61 76 65 20 61 20 46 52 4f   must have a FRO
1f430 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a  M clause.  TODO:
1f440 20 20 46 6f 72 20 73 75 62 71 75 65 72 69 65 73    For subqueries
1f450 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20   without.**     
1f460 20 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65     A FROM clause
1f470 2c 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e  , consider addin
1f480 67 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  g a FROM clause 
1f490 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
1f4a0 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65  .**        table
1f4b0 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61   sqlite_once tha
1f4c0 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  t consists of a 
1f4d0 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61  single row conta
1f4e0 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  ining a.**      
1f4f0 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a    single NULL..*
1f500 2a 0a 2a 2a 20 20 20 28 38 29 20 20 49 66 20 74  *.**   (8)  If t
1f510 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1f520 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20   LIMIT then the 
1f530 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20  outer query may 
1f540 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a 2a  not be a join..*
1f550 2a 0a 2a 2a 20 20 20 28 39 29 20 20 49 66 20 74  *.**   (9)  If t
1f560 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1f570 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20   LIMIT then the 
1f580 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20  outer query may 
1f590 6e 6f 74 20 62 65 20 61 67 67 72 65 67 61 74 65  not be aggregate
1f5a0 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52  ..**.**  (**)  R
1f5b0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20  estriction (10) 
1f5c0 77 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  was removed from
1f5d0 20 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30   the code on 200
1f5e0 35 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a  5-02-05 but we.*
1f5f0 2a 20 20 20 20 20 20 20 20 61 63 63 69 64 65 6e  *        acciden
1f600 74 6c 79 20 63 61 72 72 69 65 64 20 74 68 65 20  tly carried the 
1f610 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20  comment forward 
1f620 75 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35  until 2014-09-15
1f630 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  .  Original.**  
1f640 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74        constraint
1f650 3a 20 22 49 66 20 74 68 65 20 73 75 62 71 75 65  : "If the subque
1f660 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65 20  ry is aggregate 
1f670 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71  then the outer q
1f680 75 65 72 79 20 0a 2a 2a 20 20 20 20 20 20 20 20  uery .**        
1f690 6d 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  may not use LIMI
1f6a0 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20  T.".**.**  (11) 
1f6b0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1f6c0 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1f6d0 79 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20 68  y may not both h
1f6e0 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  ave ORDER BY cla
1f6f0 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  uses..**.**  (**
1f700 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74  )  Not implement
1f710 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e  ed.  Subsumed in
1f720 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  to restriction (
1f730 33 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75  3).  Was previou
1f740 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20  sly.**        a 
1f750 73 65 70 61 72 61 74 65 20 72 65 73 74 72 69 63  separate restric
1f760 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72  tion deriving fr
1f770 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a  om ticket #350..
1f780 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65  **.**  (13)  The
1f790 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75   subquery and ou
1f7a0 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1f7b0 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54  t both use LIMIT
1f7c0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54  ..**.**  (14)  T
1f7d0 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20  he subquery may 
1f7e0 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a  not use OFFSET..
1f7f0 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 49 66 20  **.**  (15)  If 
1f800 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1f810 69 73 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  is part of a com
1f820 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
1f830 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  en the.**       
1f840 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
1f850 74 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 20  t use LIMIT..** 
1f860 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b         (See tick
1f870 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69 63  et #2339 and tic
1f880 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d  ket [02a8e81d44]
1f890 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20  )..**.**  (16)  
1f8a0 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  If the outer que
1f8b0 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c  ry is aggregate,
1f8c0 20 74 68 65 6e 20 74 68 65 20 73 75 62 71 75 65   then the subque
1f8d0 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20  ry may not.**   
1f8e0 20 20 20 20 20 75 73 65 20 4f 52 44 45 52 20 42       use ORDER B
1f8f0 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39 34  Y.  (Ticket #294
1f900 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74 6f  2)  This used to
1f910 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20   not matter.**  
1f920 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69        until we i
1f930 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67 72  ntroduced the gr
1f940 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e  oup_concat() fun
1f950 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20  ction.  .**.**  
1f960 28 31 37 29 20 20 49 66 20 74 68 65 20 73 75 62  (17)  If the sub
1f970 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1f980 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
1f990 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 61 29  .**        (17a)
1f9a0 20 61 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f 70   all compound op
1f9b0 65 72 61 74 6f 72 73 20 6d 75 73 74 20 62 65 20  erators must be 
1f9c0 61 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e 64  a UNION ALL, and
1f9d0 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 62 29  .**        (17b)
1f9e0 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 69 6e   no terms within
1f9f0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63 6f   the subquery co
1fa00 6d 70 6f 75 6e 64 20 6d 61 79 20 62 65 20 61 67  mpound may be ag
1fa10 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 20 20 20  gregate.**      
1fa20 20 20 20 20 20 20 20 20 6f 72 20 44 49 53 54 49          or DISTI
1fa30 4e 43 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20  NCT, and.**     
1fa40 20 20 20 28 31 37 63 29 20 65 76 65 72 79 20 74     (17c) every t
1fa50 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 73  erm within the s
1fa60 75 62 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64  ubquery compound
1fa70 20 6d 75 73 74 20 68 61 76 65 20 61 20 46 52 4f   must have a FRO
1fa80 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20  M clause.**     
1fa90 20 20 20 28 31 37 64 29 20 74 68 65 20 6f 75 74     (17d) the out
1faa0 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1fab0 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
1fac0 20 20 20 20 28 31 37 64 31 29 20 61 67 67 72 65      (17d1) aggre
1fad0 67 61 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20 20  gate, or.**     
1fae0 20 20 20 20 20 20 20 20 20 28 31 37 64 32 29 20           (17d2) 
1faf0 44 49 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a 20  DISTINCT, or.** 
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31 37               (17
1fb10 64 33 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  d3) a join..**.*
1fb20 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72  *        The par
1fb30 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72  ent and sub-quer
1fb40 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48  y may contain WH
1fb50 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62  ERE clauses. Sub
1fb60 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20  ject to.**      
1fb70 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31    rules (11), (1
1fb80 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65  3) and (14), the
1fb90 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61  y may also conta
1fba0 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20  in ORDER BY,.** 
1fbb0 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64         LIMIT and
1fbc0 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
1fbd0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63    The subquery c
1fbe0 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f  annot use any co
1fbf0 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
1fc00 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20   operator other 
1fc10 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62  than UNION ALL b
1fc20 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f  ecause all the o
1fc30 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a  ther compound.**
1fc40 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72          operator
1fc50 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65  s have an implie
1fc60 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68  d DISTINCT which
1fc70 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62   is disallowed b
1fc80 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74  y.**        rest
1fc90 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a  riction (4)..**.
1fca0 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20  **        Also, 
1fcb0 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f  each component o
1fcc0 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1fcd0 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20  must return the 
1fce0 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20  same number.**  
1fcf0 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20        of result 
1fd00 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73  columns. This is
1fd10 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75   actually a requ
1fd20 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20  irement for any 
1fd30 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  compound.**     
1fd40 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d     SELECT statem
1fd50 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65  ent, but all the
1fd60 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20   code here does 
1fd70 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  is make sure tha
1fd80 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73  t no.**        s
1fd90 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75  uch (illegal) su
1fda0 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74  b-query is flatt
1fdb0 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  ened. The caller
1fdc0 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65   will detect the
1fdd0 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61  .**        synta
1fde0 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75  x error and retu
1fdf0 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65  rn a detailed me
1fe00 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  ssage..**.**  (1
1fe10 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71  8)  If the sub-q
1fe20 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1fe30 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
1fe40 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
1fe50 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52  .**        ORDER
1fe60 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 74 68   BY clause of th
1fe70 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65  e parent must be
1fe80 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63   simple referenc
1fe90 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20  es to .**       
1fea0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
1feb0 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  sub-query..**.**
1fec0 20 20 28 31 39 29 20 20 49 66 20 74 68 65 20 73    (19)  If the s
1fed0 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d  ubquery uses LIM
1fee0 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65  IT then the oute
1fef0 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a  r query may not.
1ff00 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 61  **        have a
1ff10 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
1ff20 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74  *.**  (20)  If t
1ff30 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
1ff40 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1ff50 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20  t, then it must 
1ff60 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
1ff70 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c    an ORDER BY cl
1ff80 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33  ause.  Ticket #3
1ff90 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72  773.  We could r
1ffa0 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72  elax this constr
1ffb0 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73  aint.**        s
1ffc0 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79 69 6e  omewhat by sayin
1ffd0 67 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73  g that the terms
1ffe0 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1fff0 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20   clause must.** 
20000 20 20 20 20 20 20 20 61 70 70 65 61 72 20 61 73         appear as
20010 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75   unmodified resu
20020 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  lt columns in th
20030 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20  e outer query.  
20040 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20  But we.**       
20050 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69   have other opti
20060 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e  mizations in min
20070 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  d to deal with t
20080 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  hat case..**.** 
20090 20 28 32 31 29 20 20 49 66 20 74 68 65 20 73 75   (21)  If the su
200a0 62 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49  bquery uses LIMI
200b0 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72  T then the outer
200c0 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
200d0 65 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54  e.**        DIST
200e0 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b  INCT.  (See tick
200f0 65 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29  et [752e1646fc])
20100 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54  ..**.**  (22)  T
20110 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20  he subquery may 
20120 6e 6f 74 20 62 65 20 61 20 72 65 63 75 72 73 69  not be a recursi
20130 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28  ve CTE..**.**  (
20140 2a 2a 29 20 20 53 75 62 73 75 6d 65 64 20 69 6e  **)  Subsumed in
20150 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  to restriction (
20160 31 37 64 33 29 2e 20 20 57 61 73 3a 20 49 66 20  17d3).  Was: If 
20170 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
20180 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 72  is.**        a r
20190 65 63 75 72 73 69 76 65 20 43 54 45 2c 20 74 68  ecursive CTE, th
201a0 65 6e 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  en the sub-query
201b0 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f   may not be a co
201c0 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a  mpound query..**
201d0 20 20 20 20 20 20 20 20 54 68 69 73 20 72 65 73          This res
201e0 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61  triction is beca
201f0 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67  use transforming
20200 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70   the.**        p
20210 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f  arent to a compo
20220 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73  und query confus
20230 65 73 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  es the code that
20240 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20   handles.**     
20250 20 20 20 72 65 63 75 72 73 69 76 65 20 71 75 65     recursive que
20260 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c  ries in multiSel
20270 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  ect()..**.**  (*
20280 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72  *)  We no longer
20290 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74   attempt to flat
202a0 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75  ten aggregate su
202b0 62 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a  bqueries.  Was:.
202c0 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 73 75  **        The su
202d0 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62  bquery may not b
202e0 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 74  e an aggregate t
202f0 68 61 74 20 75 73 65 73 20 74 68 65 20 62 75 69  hat uses the bui
20300 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a  lt-in min() or .
20310 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78  **        or max
20320 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28  () functions.  (
20330 57 69 74 68 6f 75 74 20 74 68 69 73 20 72 65 73  Without this res
20340 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72  triction, a quer
20350 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20  y like:.**      
20360 20 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d    "SELECT x FROM
20370 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c   (SELECT max(y),
20380 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75   x FROM t1)" wou
20390 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  ld not necessari
203a0 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74  ly.**        ret
203b0 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20  urn the value X 
203c0 66 6f 72 20 77 68 69 63 68 20 59 20 77 61 73 20  for which Y was 
203d0 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a  maximal.).**.**.
203e0 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
203f0 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
20400 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
20410 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
20420 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
20430 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
20440 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
20450 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
20460 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
20470 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
20480 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74  s..**.** If flat
20490 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74  tening is not at
204a0 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f  tempted, this ro
204b0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
204c0 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a   and returns 0..
204d0 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
204e0 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68   is attempted th
204f0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
20500 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ns 1..**.** All 
20510 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
20520 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20  n analysis must 
20530 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68  occur on both th
20540 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
20550 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72  d.** the subquer
20560 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  y before this ro
20570 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73  utine runs..*/.s
20580 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65  tatic int flatte
20590 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72  nSubquery(.  Par
205a0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
205b0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
205c0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
205d0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
205e0 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20  * The parent or 
205f0 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61  outer SELECT sta
20600 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
20610 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
20620 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e   /* Index in p->
20630 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65  pSrc->a[] of the
20640 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20   inner subquery 
20650 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 20 20  */.  int isAgg  
20660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
20670 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43  e if outer SELEC
20680 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  T uses aggregate
20690 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
206a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
206b0 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
206c0 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
206d0 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63  Context;.  Selec
206e0 74 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f  t *pParent;    /
206f0 2a 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20  * Current UNION 
20700 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ALL term of the 
20710 6f 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  other query */. 
20720 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20   Select *pSub;  
20730 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65       /* The inne
20740 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71  r query or "subq
20750 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63  uery" */.  Selec
20760 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f  t *pSub1;      /
20770 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
20780 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63   rightmost selec
20790 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a  t in sub-query *
207a0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
207b0 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46  c;      /* The F
207c0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
207d0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
207e0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62  .  SrcList *pSub
207f0 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52  Src;   /* The FR
20800 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
20810 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
20820 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  nt iParent;     
20830 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
20840 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
20850 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20  pSub result set 
20860 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
20870 69 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20 3d  int iNewParent =
20880 20 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d 65   -1;/* Replaceme
20890 6e 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50 61  nt table for iPa
208a0 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73  rent */.  int is
208b0 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f 2a  LeftJoin = 0; /*
208c0 20 54 72 75 65 20 69 66 20 70 53 75 62 20 69 73   True if pSub is
208d0 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20   the right side 
208e0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a  of a LEFT JOIN *
208f0 2f 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20 20  /    .  int i;  
20900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
20910 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
20920 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
20930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20940 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
20950 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
20960 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
20970 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54  pSubitem;   /* T
20980 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
20990 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
209a0 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
209b0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
209c0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
209d0 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72  ermitted.  Retur
209e0 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f  n 0 if not..  */
209f0 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
20a00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
20a10 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 69  pPrior==0 );.  i
20a20 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
20a30 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
20a40 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65  TE_QueryFlattene
20a50 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  r) ) return 0;. 
20a60 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
20a70 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
20a80 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69  && iFrom>=0 && i
20a90 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20  From<pSrc->nSrc 
20aa0 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20  );.  pSubitem = 
20ab0 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b  &pSrc->a[iFrom];
20ac0 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75  .  iParent = pSu
20ad0 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bitem->iCursor;.
20ae0 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65    pSub = pSubite
20af0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73  m->pSelect;.  as
20b00 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b  sert( pSub!=0 );
20b10 0a 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  ..  pSubSrc = pS
20b20 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
20b30 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
20b40 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72   /* Prior to ver
20b50 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e  sion 3.1.2, when
20b60 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
20b70 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70  T had to be simp
20b80 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20  le constants,.  
20b90 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79  ** not arbitrary
20ba0 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65   expressions, we
20bb0 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f   allowed some co
20bc0 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54  mbining of LIMIT
20bd0 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
20be0 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f   because they co
20bf0 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
20c00 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
20c10 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54    But when LIMIT
20c20 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
20c30 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72   became arbitrar
20c40 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
20c50 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f  e were forced to
20c60 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e   add restriction
20c70 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20  s (13).  ** and 
20c80 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70  (14). */.  if( p
20c90 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
20ca0 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
20cb0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
20cc0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
20cd0 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70   (13) */.  if( p
20ce0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
20cf0 53 75 62 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52 69  Sub->pLimit->pRi
20d00 67 68 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ght ) return 0; 
20d10 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
20d20 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 28   (14) */.  if( (
20d30 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
20d40 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26  _Compound)!=0 &&
20d50 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
20d60 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
20d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
20da0 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f  triction (15) */
20db0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53  .  }.  if( pSubS
20dc0 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65  rc->nSrc==0 ) re
20dd0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
20de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20df0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29   Restriction (7)
20e00 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
20e10 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
20e20 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
20e30 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
20e40 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   Restriction (4)
20e50 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
20e60 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63  >pLimit && (pSrc
20e70 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67  ->nSrc>1 || isAg
20e80 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  g) ){.     retur
20e90 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  n 0;         /* 
20ea0 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29  Restrictions (8)
20eb0 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  (9) */.  }.  if(
20ec0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20   p->pOrderBy && 
20ed0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
20ee0 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
20ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
20f20 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a  striction (11) *
20f30 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  /.  }.  if( isAg
20f40 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  g && pSub->pOrde
20f50 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20  rBy ) return 0; 
20f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20f70 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
20f80 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  6) */.  if( pSub
20f90 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
20fa0 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
20fb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
20fc0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
20fd0 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  9) */.  if( pSub
20fe0 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e  ->pLimit && (p->
20ff0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
21000 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20  stinct)!=0 ){.  
21010 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
21020 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
21030 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a  ion (21) */.  }.
21040 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
21050 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72  lags & (SF_Recur
21060 73 69 76 65 29 20 29 7b 0a 20 20 20 20 72 65 74  sive) ){.    ret
21070 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69  urn 0; /* Restri
21080 63 74 69 6f 6e 73 20 28 32 32 29 20 2a 2f 0a 20  ctions (22) */. 
21090 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
210a0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
210b0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
210c0 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  nd of a LEFT JOI
210d0 4e 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  N, then the.  **
210e0 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
210f0 74 20 62 65 20 61 20 6a 6f 69 6e 20 69 74 73 65  t be a join itse
21100 6c 66 20 28 33 61 29 2e 20 45 78 61 6d 70 6c 65  lf (3a). Example
21110 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20   of why this is 
21120 6e 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65 64  not.  ** allowed
21130 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
21140 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
21150 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20  R JOIN (t2 JOIN 
21160 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  t3).  **.  ** If
21170 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
21180 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
21190 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
211a0 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
211b0 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f  UTER JOIN t2) JO
211c0 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20  IN t3.  **.  ** 
211d0 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20  which is not at 
211e0 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69  all the same thi
211f0 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ng..  **.  ** If
21200 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
21210 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
21220 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  nd of a LEFT JOI
21230 4e 2c 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65  N, then the oute
21240 72 0a 20 20 2a 2a 20 71 75 65 72 79 20 63 61 6e  r.  ** query can
21250 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67  not be an aggreg
21260 61 74 65 2e 20 28 33 63 29 20 20 54 68 69 73 20  ate. (3c)  This 
21270 69 73 20 61 6e 20 61 72 74 69 66 61 63 74 20 6f  is an artifact o
21280 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 61  f the way.  ** a
21290 67 67 72 65 67 61 74 65 73 20 61 72 65 20 70 72  ggregates are pr
212a0 6f 63 65 73 73 65 64 20 2d 20 74 68 65 72 65 20  ocessed - there 
212b0 69 73 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d 20  is no mechanism 
212c0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 0a  to determine if.
212d0 20 20 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a 4f    ** the LEFT JO
212e0 49 4e 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  IN table should 
212f0 62 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a  be all-NULL..  *
21300 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 20  *.  ** See also 
21310 74 69 63 6b 65 74 73 20 23 33 30 36 2c 20 23 33  tickets #306, #3
21320 35 30 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a 20  50, and #3300.. 
21330 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69   */.  if( (pSubi
21340 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
21350 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
21360 29 7b 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69  ){.    isLeftJoi
21370 6e 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  n = 1;.    if( p
21380 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c  SubSrc->nSrc>1 |
21390 7c 20 69 73 41 67 67 20 7c 7c 20 49 73 56 69 72  | isAgg || IsVir
213a0 74 75 61 6c 28 70 53 75 62 53 72 63 2d 3e 61 5b  tual(pSubSrc->a[
213b0 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  0].pTab) ){.    
213c0 20 20 2f 2a 20 20 28 33 61 29 20 20 20 20 20 20    /*  (3a)      
213d0 20 20 20 20 20 20 20 28 33 63 29 20 20 20 20 20         (3c)     
213e0 28 33 62 29 20 2a 2f 0a 20 20 20 20 20 20 72 65  (3b) */.      re
213f0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
21400 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
21410 45 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a  EXTRA_IFNULLROW.
21420 20 20 65 6c 73 65 20 69 66 28 20 69 46 72 6f 6d    else if( iFrom
21430 3e 30 20 26 26 20 21 69 73 41 67 67 20 29 7b 0a  >0 && !isAgg ){.
21440 20 20 20 20 2f 2a 20 53 65 74 74 69 6e 67 20 69      /* Setting i
21450 73 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31 20  sLeftJoin to -1 
21460 63 61 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c 6c  causes OP_IfNull
21470 52 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f 20 62  Row opcodes to b
21480 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 0a  e generated for.
21490 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 65 66      ** every ref
214a0 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 72 65  erence to any re
214b0 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  sult column from
214c0 20 73 75 62 71 75 65 72 79 20 69 6e 20 61 20 6a   subquery in a j
214d0 6f 69 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a 2a  oin, even.    **
214e0 20 74 68 6f 75 67 68 20 74 68 65 79 20 61 72 65   though they are
214f0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20   not necessary. 
21500 20 54 68 69 73 20 77 69 6c 6c 20 73 74 72 65 73   This will stres
21510 73 2d 74 65 73 74 20 74 68 65 20 4f 50 5f 49 66  s-test the OP_If
21520 4e 75 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a 20  NullRow .    ** 
21530 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69  opcode. */.    i
21540 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b 0a  sLeftJoin = -1;.
21550 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
21560 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37   Restriction (17
21570 29 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  ): If the sub-qu
21580 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
21590 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69  d SELECT, then i
215a0 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20  t must.  ** use 
215b0 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41  only the UNION A
215c0 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64  LL operator. And
215d0 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d   none of the sim
215e0 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69  ple select queri
215f0 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b  es.  ** that mak
21600 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e  e up the compoun
21610 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c  d SELECT are all
21620 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65  owed to be aggre
21630 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74  gate or distinct
21640 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
21650 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
21660 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
21670 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
21680 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
21690 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74   0;  /* Restrict
216a0 69 6f 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20 20  ion (20) */.    
216b0 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  }.    if( isAgg 
216c0 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  || (p->selFlags 
216d0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
216e0 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21  0 || pSrc->nSrc!
216f0 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =1 ){.      retu
21700 72 6e 20 30 3b 20 2f 2a 20 28 31 37 64 31 29 2c  rn 0; /* (17d1),
21710 20 28 31 37 64 32 29 2c 20 6f 72 20 28 31 37 64   (17d2), or (17d
21720 33 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  3) */.    }.    
21730 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20  for(pSub1=pSub; 
21740 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75  pSub1; pSub1=pSu
21750 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  b1->pPrior){.   
21760 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
21770 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
21780 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
21790 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
217a0 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
217b0 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
217c0 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
217d0 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
217e0 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
217f0 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
21800 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
21810 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSrc!=0 );.     
21820 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
21830 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53  EList->nExpr==pS
21840 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ub1->pEList->nEx
21850 70 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pr );.      if( 
21860 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
21870 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
21880 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d  SF_Aggregate))!=
21890 30 20 20 20 20 2f 2a 20 28 31 37 62 29 20 2a 2f  0    /* (17b) */
218a0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62  .       || (pSub
218b0 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75  1->pPrior && pSu
218c0 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  b1->op!=TK_ALL) 
218d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218e0 2f 2a 20 28 31 37 61 29 20 2a 2f 0a 20 20 20 20  /* (17a) */.    
218f0 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72     || pSub1->pSr
21900 63 2d 3e 6e 53 72 63 3c 31 20 20 20 20 20 20 20  c->nSrc<1       
21910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
21930 37 63 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b 0a  7c) */.      ){.
21940 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
21950 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21960 74 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d  testcase( pSub1-
21970 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b  >pSrc->nSrc>1 );
21980 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
21990 65 73 74 72 69 63 74 69 6f 6e 20 28 31 38 29 2e  estriction (18).
219a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
219b0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
219c0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66   int ii;.      f
219d0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70  or(ii=0; ii<p->p
219e0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
219f0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ii++){.        i
21a00 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  f( p->pOrderBy->
21a10 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  a[ii].u.x.iOrder
21a20 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72  ByCol==0 ) retur
21a30 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
21a40 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 2d   }.  }..  /* Ex-
21a50 72 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29  restriction (23)
21a60 3a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  :.  ** The only 
21a70 77 61 79 20 74 68 61 74 20 74 68 65 20 72 65 63  way that the rec
21a80 75 72 73 69 76 65 20 70 61 72 74 20 6f 66 20 61  ursive part of a
21a90 20 43 54 45 20 63 61 6e 20 63 6f 6e 74 61 69 6e   CTE can contain
21aa0 20 61 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 2a 2a   a compound.  **
21ab0 20 73 75 62 71 75 65 72 79 20 69 73 20 66 6f 72   subquery is for
21ac0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f   the subquery to
21ad0 20 62 65 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20   be one term of 
21ae0 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20  a join.  But if 
21af0 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
21b00 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 74 68 65  y is a join, the
21b10 6e 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  n the flattening
21b20 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
21b30 6e 20 73 74 6f 70 70 65 64 20 62 79 0a 20 20 2a  n stopped by.  *
21b40 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * restriction (1
21b50 37 64 33 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65  7d3).  */.  asse
21b60 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  rt( (p->selFlags
21b70 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29   & SF_Recursive)
21b80 3d 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70 50 72  ==0 || pSub->pPr
21b90 69 6f 72 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 2a  ior==0 );..  /**
21ba0 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20  *** If we reach 
21bb0 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74  this point, flat
21bc0 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
21bd0 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45  ted. *****/.  SE
21be0 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
21bf0 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25  se,p,("flatten %
21c00 73 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25  s.%p from term %
21c10 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
21c20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 7a           pSub->z
21c30 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20 69  SelName, pSub, i
21c40 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75  From));..  /* Au
21c50 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71  thorize the subq
21c60 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65  uery */.  pParse
21c70 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
21c80 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
21c90 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d  ;.  TESTONLY(i =
21ca0 29 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ) sqlite3AuthChe
21cb0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
21cc0 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
21cd0 30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  0);.  testcase( 
21ce0 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29  i==SQLITE_DENY )
21cf0 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  ;.  pParse->zAut
21d00 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65  hContext = zSave
21d10 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20  dAuthContext;.. 
21d20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71   /* If the sub-q
21d30 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
21d40 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
21d50 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65  ent, then (by re
21d60 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20  strictions.  ** 
21d70 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29  17 and 18 above)
21d80 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e   it must be a UN
21d90 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20  ION ALL and the 
21da0 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73  parent query mus
21db0 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68  t .  ** be of th
21dc0 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a  e form:.  **.  *
21dd0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78  *     SELECT <ex
21de0 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c  pr-list> FROM (<
21df0 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65  sub-query>) <whe
21e00 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a  re-clause> .  **
21e10 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62  .  ** followed b
21e20 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20  y any ORDER BY, 
21e30 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46  LIMIT and/or OFF
21e40 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69  SET clauses. Thi
21e50 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65  s block.  ** cre
21e60 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20  ates N-1 copies 
21e70 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  of the parent qu
21e80 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ery without any 
21e90 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20  ORDER BY, LIMIT 
21ea0 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20  or .  ** OFFSET 
21eb0 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e  clauses and join
21ec0 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65  s them to the le
21ed0 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20  ft-hand-side of 
21ee0 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  the original.  *
21ef0 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c  * using UNION AL
21f00 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20  L operators. In 
21f10 74 68 69 73 20 63 61 73 65 20 4e 20 69 73 20 74  this case N is t
21f20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d  he number of sim
21f30 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  ple.  ** select 
21f40 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68  statements in th
21f50 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71  e compound sub-q
21f60 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  uery..  **.  ** 
21f70 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  Example:.  **.  
21f80 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b  **     SELECT a+
21f90 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20  1 FROM (.  **   
21fa0 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52       SELECT x FR
21fb0 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
21fc0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
21fd0 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
21fe0 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20  y FROM tab.  ** 
21ff0 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
22000 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
22010 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f  ECT abs(z*2) FRO
22020 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20  M tab2.  **     
22030 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44  ) WHERE a!=5 ORD
22040 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a  ER BY 1.  **.  *
22050 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  * Transformed in
22060 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
22070 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f    SELECT x+1 FRO
22080 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b 31 21  M tab WHERE x+1!
22090 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
220a0 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
220b0 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74  ELECT y+1 FROM t
220c0 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a  ab WHERE y+1!=5.
220d0 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41    **     UNION A
220e0 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  LL.  **     SELE
220f0 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52  CT abs(z*2)+1 FR
22100 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20 61 62  OM tab2 WHERE ab
22110 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a  s(z*2)+1!=5.  **
22120 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a       ORDER BY 1.
22130 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c    **.  ** We cal
22140 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70  l this the "comp
22150 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
22160 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a  attening"..  */.
22170 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d    for(pSub=pSub-
22180 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70  >pPrior; pSub; p
22190 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
221a0 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
221b0 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  New;.    ExprLis
221c0 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
221d0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45  >pOrderBy;.    E
221e0 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d  xpr *pLimit = p-
221f0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c  >pLimit;.    Sel
22200 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d  ect *pPrior = p-
22210 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e  >pPrior;.    p->
22220 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
22230 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20    p->pSrc = 0;. 
22240 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
22250 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20  ;.    p->pLimit 
22260 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  = 0;.    pNew = 
22270 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
22280 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  (db, p, 0);.    
22290 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74  sqlite3SelectSet
222a0 4e 61 6d 65 28 70 4e 65 77 2c 20 70 53 75 62 2d  Name(pNew, pSub-
222b0 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  >zSelName);.    
222c0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
222d0 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  it;.    p->pOrde
222e0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
222f0 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53      p->pSrc = pS
22300 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20  rc;.    p->op = 
22310 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20  TK_ALL;.    if( 
22320 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
22330 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
22340 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ior;.    }else{.
22350 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69        pNew->pPri
22360 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
22370 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20     if( pPrior ) 
22380 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
22390 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77  pNew;.      pNew
223a0 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
223b0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
223c0 4e 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  New;.      SELEC
223d0 54 54 52 41 43 45 28 32 2c 70 50 61 72 73 65 2c  TTRACE(2,pParse,
223e0 70 2c 0a 20 20 20 20 20 20 20 20 20 28 22 63 6f  p,.         ("co
223f0 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20  mpound-subquery 
22400 66 6c 61 74 74 65 6e 65 72 20 63 72 65 61 74 65  flattener create
22410 73 20 25 73 2e 25 70 20 61 73 20 70 65 65 72 5c  s %s.%p as peer\
22420 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 4e 65  n",.         pNe
22430 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e 65  w->zSelName, pNe
22440 77 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  w));.    }.    i
22450 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
22460 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  led ) return 1;.
22470 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
22480 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69  flattening the i
22490 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66  From-th entry of
224a0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
224b0 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75   .  ** in the ou
224c0 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  ter query..  */.
224d0 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d    pSub = pSub1 =
224e0 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
224f0 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  ct;..  /* Delete
22500 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74   the transient t
22510 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61  able structure a
22520 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
22530 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
22540 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
22550 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
22560 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
22570 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
22580 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  db, pSubitem->zN
22590 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
225a0 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
225b0 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70  em->zAlias);.  p
225c0 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
225d0 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  se = 0;.  pSubit
225e0 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  em->zName = 0;. 
225f0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
22600 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  s = 0;.  pSubite
22610 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a  m->pSelect = 0;.
22620 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65  .  /* Defer dele
22630 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f  ting the Table o
22640 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64  bject associated
22650 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
22660 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f  ubquery until co
22670 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73  de generation is
22680 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20  .  ** complete, 
22690 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20  since there may 
226a0 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72  still exist Expr
226b0 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20 74 68  .pTab entries th
226c0 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f  at.  ** refer to
226d0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65 76   the subquery ev
226e0 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e  en after flatten
226f0 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33  ing.  Ticket #33
22700 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53  46..  **.  ** pS
22710 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20  ubitem->pTab is 
22720 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20  always non-NULL 
22730 62 79 20 74 65 73 74 20 72 65 73 74 72 69 63 74  by test restrict
22740 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61  ions and tests a
22750 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  bove..  */.  if(
22760 20 41 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d   ALWAYS(pSubitem
22770 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20  ->pTab!=0) ){.  
22780 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44    Table *pTabToD
22790 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  el = pSubitem->p
227a0 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Tab;.    if( pTa
227b0 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d  bToDel->nTabRef=
227c0 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73  =1 ){.      Pars
227d0 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
227e0 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
227f0 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  vel(pParse);.   
22800 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e     pTabToDel->pN
22810 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70  extZombie = pTop
22820 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61  level->pZombieTa
22830 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76  b;.      pToplev
22840 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d  el->pZombieTab =
22850 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20   pTabToDel;.    
22860 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
22870 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d  bToDel->nTabRef-
22880 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75  -;.    }.    pSu
22890 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  bitem->pTab = 0;
228a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
228b0 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75  ollowing loop ru
228c0 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
228d0 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f   term in a compo
228e0 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a  und-subquery.  *
228f0 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73  * flattening (as
22900 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
22910 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f  ).  If we are do
22920 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20  ing a different 
22930 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61  kind.  ** of fla
22940 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74  ttening - a flat
22950 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61  tening other tha
22960 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
22970 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  query flattening
22980 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69   -.  ** then thi
22990 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73  s loop only runs
229a0 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   once..  **.  **
229b0 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73   This loop moves
229c0 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d   all of the FROM
229d0 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
229e0 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
229f0 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  he.  ** the FROM
22a00 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
22a10 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66  uter query.  Bef
22a20 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20  ore doing this, 
22a30 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68  remember.  ** th
22a40 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
22a50 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  for the original
22a60 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f   outer query FRO
22a70 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a  M element in.  *
22a80 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20  * iParent.  The 
22a90 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77  iParent cursor w
22aa0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
22ab0 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63  d.  Subsequent c
22ac0 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63  ode.  ** will sc
22ad0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c  an expressions l
22ae0 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65  ooking for iPare
22af0 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  nt references an
22b00 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74  d replace.  ** t
22b10 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20  hose references 
22b20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73  with expressions
22b30 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f   that resolve to
22b40 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52   the subquery FR
22b50 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73  OM.  ** elements
22b60 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79   we are now copy
22b70 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66  ing in..  */.  f
22b80 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50  or(pParent=p; pP
22b90 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70  arent; pParent=p
22ba0 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20  Parent->pPrior, 
22bb0 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
22bc0 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62  r){.    int nSub
22bd0 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e  Src;.    u8 join
22be0 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53  type = 0;.    pS
22bf0 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
22c00 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  rc;     /* FROM 
22c10 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65  clause of subque
22c20 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72  ry */.    nSubSr
22c30 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  c = pSubSrc->nSr
22c40 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  c;  /* Number of
22c50 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65   terms in subque
22c60 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  ry FROM clause *
22c70 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61  /.    pSrc = pPa
22c80 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20  rent->pSrc;     
22c90 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  /* FROM clause o
22ca0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
22cb0 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53  y */..    if( pS
22cc0 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  rc ){.      asse
22cd0 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29  rt( pParent==p )
22ce0 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65  ;  /* First time
22cf0 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f   through the loo
22d00 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74  p */.      joint
22d10 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ype = pSubitem->
22d20 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  fg.jointype;.   
22d30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
22d40 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70  sert( pParent!=p
22d50 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20   );  /* 2nd and 
22d60 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73  subsequent times
22d70 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f   through the loo
22d80 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20  p */.      pSrc 
22d90 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20  = pParent->pSrc 
22da0 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
22db0 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c  Append(db, 0, 0,
22dc0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
22dd0 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Src==0 ){.      
22de0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
22df0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
22e00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22e10 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
22e20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
22e30 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c  uses a single sl
22e40 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ot of the FROM c
22e50 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
22e60 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e  er.    ** query.
22e70 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
22e80 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  y has more than 
22e90 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69  one element in i
22ea0 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a  ts FROM clause,.
22eb0 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61      ** then expa
22ec0 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
22ed0 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65  ry to make space
22ee0 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20   for it to hold 
22ef0 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20  all elements.   
22f00 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75   ** of the subqu
22f10 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ery..    **.    
22f20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20  ** Example:.    
22f30 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c  **.    **    SEL
22f40 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c  ECT * FROM tabA,
22f50 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
22f60 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62  sub1, sub2), tab
22f70 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  B;.    **.    **
22f80 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
22f90 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20   has 3 slots in 
22fa0 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  its FROM clause.
22fb0 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68    One slot of th
22fc0 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
22fd0 75 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65  uery (the middle
22fe0 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62   slot) is used b
22ff0 79 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20  y the subquery. 
23000 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   The next.    **
23010 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77   block of code w
23020 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f  ill expand the o
23030 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
23040 63 6c 61 75 73 65 20 74 6f 20 34 20 73 6c 6f 74  clause to 4 slot
23050 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d 69  s..    ** The mi
23060 64 64 6c 65 20 73 6c 6f 74 20 69 73 20 65 78 70  ddle slot is exp
23070 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f  anded to two slo
23080 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d  ts in order to m
23090 61 6b 65 20 73 70 61 63 65 0a 20 20 20 20 2a 2a  ake space.    **
230a0 20 66 6f 72 20 74 68 65 20 74 77 6f 20 65 6c 65   for the two ele
230b0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f  ments in the FRO
230c0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
230d0 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f  subquery..    */
230e0 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63  .    if( nSubSrc
230f0 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  >1 ){.      pPar
23100 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  ent->pSrc = pSrc
23110 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
23120 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72  tEnlarge(db, pSr
23130 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72  c, nSubSrc-1,iFr
23140 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28  om+1);.      if(
23150 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
23160 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  d ){.        bre
23170 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
23180 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66  }..    /* Transf
23190 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  er the FROM clau
231a0 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68  se terms from th
231b0 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
231c0 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
231d0 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20   query..    */. 
231e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
231f0 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubSrc; i++){.   
23200 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
23210 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d  Delete(db, pSrc-
23220 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69  >a[i+iFrom].pUsi
23230 6e 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ng);.      asser
23240 74 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72  t( pSrc->a[i+iFr
23250 6f 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e 63  om].fg.isTabFunc
23260 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53 72  ==0 );.      pSr
23270 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20  c->a[i+iFrom] = 
23280 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  pSubSrc->a[i];. 
23290 20 20 20 20 20 69 4e 65 77 50 61 72 65 6e 74 20       iNewParent 
232a0 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e  = pSubSrc->a[i].
232b0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 6d  iCursor;.      m
232c0 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e  emset(&pSubSrc->
232d0 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  a[i], 0, sizeof(
232e0 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b  pSubSrc->a[i]));
232f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d  .    }.    pSrc-
23300 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69  >a[iFrom].fg.joi
23310 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65  ntype = jointype
23320 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  ;.  .    /* Now 
23330 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69  begin substituti
23340 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75  ng subquery resu
23350 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt set expressio
23360 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72  ns for .    ** r
23370 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
23380 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
23390 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
233a0 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d   ** .    ** Exam
233b0 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
233c0 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c  **   SELECT a+5,
233d0 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45   b*10 FROM (SELE
233e0 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31  CT x*3 AS a, y+1
233f0 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20  0 AS b FROM t1) 
23400 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a  WHERE a>b;.    *
23410 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20  *   \           
23420 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
23430 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  ________ subquer
23440 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  y __________/   
23450 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20         /.    ** 
23460 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
23470 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
23480 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
23490 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
234a0 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20  ____/.    **.   
234b0 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
234c0 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
234d0 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
234e0 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
234f0 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a  ce we see.    **
23500 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75   "a" we substitu
23510 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65  te "x*3" and eve
23520 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20  ry place we see 
23530 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "b" we substitut
23540 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f  e "y+10"..    */
23550 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
23560 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
23570 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
23580 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20  t, any non-zero 
23590 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75  iOrderByCol valu
235a0 65 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  es indicate that
235b0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52   the.      ** OR
235c0 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78  DER BY column ex
235d0 70 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e  pression is iden
235e0 74 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72  tical to the iOr
235f0 64 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20  derByCol'th.    
23600 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
23610 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45  returned by SELE
23620 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75  CT statement pSu
23630 62 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20 76  b. Since these v
23640 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64  alues.      ** d
23650 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  o not necessaril
23660 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  y correspond to 
23670 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43  columns in SELEC
23680 54 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72  T statement pPar
23690 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65  ent,.      ** ze
236a0 72 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74  ro them before t
236b0 72 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f  ransfering the O
236c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
236d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
236e0 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73  * Not doing this
236f0 20 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65 72   may cause an er
23700 72 6f 72 20 69 66 20 61 20 73 75 62 73 65 71 75  ror if a subsequ
23710 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ent call to this
23720 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
23730 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  on attempts to f
23740 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e  latten a compoun
23750 64 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f  d sub-query into
23760 20 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a   pParent.      *
23770 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  * (the only way 
23780 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
23790 69 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75  is if the compou
237a0 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a  nd sub-query is.
237b0 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
237c0 6c 79 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d  ly part of pSub-
237d0 3e 70 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b  >pSrc). See tick
237e0 65 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e  et [d11a6e908f].
237f0 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c    */.      ExprL
23800 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
23810 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  pSub->pOrderBy;.
23820 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
23830 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
23840 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
23850 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75  pOrderBy->a[i].u
23860 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  .x.iOrderByCol =
23870 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
23880 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
23890 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t->pOrderBy==0 )
238a0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
238b0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
238c0 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62  erBy;.      pSub
238d0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
238e0 20 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65      }.    pWhere
238f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
23900 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65  p(db, pSub->pWhe
23910 72 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  re, 0);.    if( 
23920 69 73 4c 65 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a  isLeftJoin>0 ){.
23930 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70        setJoinExp
23940 72 28 70 57 68 65 72 65 2c 20 69 4e 65 77 50 61  r(pWhere, iNewPa
23950 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rent);.    }.   
23960 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
23970 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
23980 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70 50  d(db, pWhere, pP
23990 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 29 3b 0a  arent->pWhere);.
239a0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
239b0 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20  ocFailed==0 ){. 
239c0 20 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78       SubstContex
239d0 74 20 78 3b 0a 20 20 20 20 20 20 78 2e 70 50 61  t x;.      x.pPa
239e0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
239f0 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69      x.iTable = i
23a00 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e  Parent;.      x.
23a10 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 4e 65 77  iNewTable = iNew
23a20 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e  Parent;.      x.
23a30 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 69 73 4c  isLeftJoin = isL
23a40 65 66 74 4a 6f 69 6e 3b 0a 20 20 20 20 20 20 78  eftJoin;.      x
23a50 2e 70 45 4c 69 73 74 20 3d 20 70 53 75 62 2d 3e  .pEList = pSub->
23a60 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 75  pEList;.      su
23a70 62 73 74 53 65 6c 65 63 74 28 26 78 2c 20 70 50  bstSelect(&x, pP
23a80 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 7d  arent, 0);.    }
23a90 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  .  .    /* The f
23aa0 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69  lattened query i
23ab0 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69  s distinct if ei
23ac0 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f  ther the inner o
23ad0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  r the.    ** out
23ae0 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74  er query is dist
23af0 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  inct. .    */.  
23b00 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c    pParent->selFl
23b10 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c  ags |= pSub->sel
23b20 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
23b30 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20  nct;.  .    /*. 
23b40 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e     ** SELECT ...
23b50 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
23b60 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54  . LIMIT a OFFSET
23b70 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53   b) LIMIT x OFFS
23b80 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ET y;.    **.   
23b90 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74   ** One is tempt
23ba0 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64  ed to try to add
23bb0 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62   a and b to comb
23bc0 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20  ine the limits. 
23bd0 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a   But this.    **
23be0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69   does not work i
23bf0 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69  f either limit i
23c00 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20  s negative..    
23c10 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
23c20 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >pLimit ){.     
23c30 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74   pParent->pLimit
23c40 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b   = pSub->pLimit;
23c50 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69  .      pSub->pLi
23c60 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  mit = 0;.    }. 
23c70 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c   }..  /* Finiall
23c80 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
23c90 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
23ca0 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
23cb0 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
23cc0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65    */.  sqlite3Se
23cd0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
23ce0 53 75 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45  Sub1);..#if SELE
23cf0 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
23d00 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
23d10 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
23d20 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
23d30 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
23d40 2c 70 2c 28 22 41 66 74 65 72 20 66 6c 61 74 74  ,p,("After flatt
23d50 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20  ening:\n"));.   
23d60 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
23d70 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
23d80 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
23d90 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
23da0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
23db0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
23dc0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
23dd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
23de0 29 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66  ) */....#if !def
23df0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
23e00 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
23e10 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
23e20 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d  IT_VIEW)./*.** M
23e30 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72 65  ake copies of re
23e40 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c 61  levant WHERE cla
23e50 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  use terms of the
23e60 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e 74   outer query int
23e70 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  o.** the WHERE c
23e80 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
23e90 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  y.  Example:.**.
23ea0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
23eb0 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53  ROM (SELECT a AS
23ec0 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f   x, c-d AS y FRO
23ed0 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d 35 20  M t1) WHERE x=5 
23ee0 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20  AND y=10;.**.** 
23ef0 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
23f00 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
23f10 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T * FROM (SELECT
23f20 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20   a AS x, c-d AS 
23f30 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  y FROM t1 WHERE 
23f40 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a  a=5 AND c-d=10).
23f50 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d 35  **     WHERE x=5
23f60 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a   AND y=10;.**.**
23f70 20 54 68 65 20 68 6f 70 65 20 69 73 20 74 68 61   The hope is tha
23f80 74 20 74 68 65 20 74 65 72 6d 73 20 61 64 64 65  t the terms adde
23f90 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20 71  d to the inner q
23fa0 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69  uery will make i
23fb0 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69  t more.** effici
23fc0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f  ent..**.** Do no
23fd0 74 20 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f  t attempt this o
23fe0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a  ptimization if:.
23ff0 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 28 2a 2a 20  **.**   (1) (** 
24000 54 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  This restriction
24010 20 77 61 73 20 72 65 6d 6f 76 65 64 20 6f 6e 20   was removed on 
24020 32 30 31 37 2d 30 39 2d 32 39 2e 20 20 57 65 20  2017-09-29.  We 
24030 75 73 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20  used to.**      
24040 20 20 20 20 20 64 69 73 61 6c 6c 6f 77 20 74 68       disallow th
24050 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
24060 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 73 75  for aggregate su
24070 62 71 75 65 72 69 65 73 2c 20 62 75 74 20 6e 6f  bqueries, but no
24080 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 69  w.**           i
24090 74 20 69 73 20 61 6c 6c 6f 77 65 64 20 62 79 20  t is allowed by 
240a0 70 75 74 74 69 6e 67 20 74 68 65 20 65 78 74 72  putting the extr
240b0 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 48  a terms on the H
240c0 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a  AVING clause..**
240d0 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20 61             The a
240e0 64 64 65 64 20 48 41 56 49 4e 47 20 63 6c 61 75  dded HAVING clau
240f0 73 65 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 20  se is pointless 
24100 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
24110 6c 61 63 6b 73 0a 2a 2a 20 20 20 20 20 20 20 20  lacks.**        
24120 20 20 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c     a GROUP BY cl
24130 61 75 73 65 2e 20 20 42 75 74 20 73 75 63 68 20  ause.  But such 
24140 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  a HAVING clause 
24150 69 73 20 61 6c 73 6f 20 68 61 72 6d 6c 65 73 73  is also harmless
24160 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 73 6f  .**           so
24170 20 74 68 65 72 65 20 64 6f 65 73 20 6e 6f 74 20   there does not 
24180 61 70 70 65 61 72 20 74 6f 20 62 65 20 61 6e 79  appear to be any
24190 20 72 65 61 73 6f 6e 20 74 6f 20 61 64 64 20 65   reason to add e
241a0 78 74 72 61 20 6c 6f 67 69 63 0a 2a 2a 20 20 20  xtra logic.**   
241b0 20 20 20 20 20 20 20 20 74 6f 20 73 75 70 70 72          to suppr
241c0 65 73 73 20 69 74 2e 20 2a 2a 29 0a 2a 2a 0a 2a  ess it. **).**.*
241d0 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e 6e 65  *   (2) The inne
241e0 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20 72  r query is the r
241f0 65 63 75 72 73 69 76 65 20 70 61 72 74 20 6f 66  ecursive part of
24200 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20   a common table 
24210 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
24220 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e 6e 65  *   (3) The inne
24230 72 20 71 75 65 72 79 20 68 61 73 20 61 20 4c 49  r query has a LI
24240 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69 6e 63  MIT clause (sinc
24250 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  e the changes to
24260 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 20 20   the WHERE.**   
24270 20 20 20 20 63 6c 6f 73 65 20 77 6f 75 6c 64 20      close would 
24280 63 68 61 6e 67 65 20 74 68 65 20 6d 65 61 6e 69  change the meani
24290 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 29  ng of the LIMIT)
242a0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54 68  ..**.**   (4) Th
242b0 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73  e inner query is
242c0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
242d0 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  nd of a LEFT JOI
242e0 4e 20 61 6e 64 20 74 68 65 0a 2a 2a 20 20 20 20  N and the.**    
242f0 20 20 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f     expression to
24300 20 62 65 20 70 75 73 68 65 64 20 64 6f 77 6e 20   be pushed down 
24310 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 66 72  does not come fr
24320 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  om the ON clause
24330 0a 2a 2a 20 20 20 20 20 20 20 6f 6e 20 74 68 61  .**       on tha
24340 74 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a  t LEFT JOIN..**.
24350 2a 2a 20 20 20 28 35 29 20 54 68 65 20 57 48 45  **   (5) The WHE
24360 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  RE clause expres
24370 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 73 20  sion originates 
24380 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
24390 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20  NG clause.**    
243a0 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49     of a LEFT JOI
243b0 4e 20 77 68 65 72 65 20 69 43 75 72 73 6f 72 20  N where iCursor 
243c0 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
243d0 2d 68 61 6e 64 20 74 61 62 6c 65 20 6f 66 20 74  -hand table of t
243e0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 6c 65 66  hat.**       lef
243f0 74 20 6a 6f 69 6e 2e 20 20 41 6e 20 65 78 61 6d  t join.  An exam
24400 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
24410 20 20 20 20 20 53 45 4c 45 43 54 20 2a 0a 2a 2a       SELECT *.**
24420 20 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d 20             FROM 
24430 28 53 45 4c 45 43 54 20 31 20 41 53 20 61 31 20  (SELECT 1 AS a1 
24440 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
24450 20 32 29 20 41 53 20 61 61 0a 2a 2a 20 20 20 20   2) AS aa.**    
24460 20 20 20 20 20 20 20 4a 4f 49 4e 20 28 53 45 4c         JOIN (SEL
24470 45 43 54 20 31 20 41 53 20 62 32 20 55 4e 49 4f  ECT 1 AS b2 UNIO
24480 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 32 29 20  N ALL SELECT 2) 
24490 41 53 20 62 62 20 4f 4e 20 28 61 31 3d 62 32 29  AS bb ON (a1=b2)
244a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4c 45  .**           LE
244b0 46 54 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20  FT JOIN (SELECT 
244c0 38 20 41 53 20 63 33 20 55 4e 49 4f 4e 20 41 4c  8 AS c3 UNION AL
244d0 4c 20 53 45 4c 45 43 54 20 39 29 20 41 53 20 63  L SELECT 9) AS c
244e0 63 20 4f 4e 20 28 62 32 3d 32 29 3b 0a 2a 2a 0a  c ON (b2=2);.**.
244f0 2a 2a 20 20 20 20 20 20 20 54 68 65 20 63 6f 72  **       The cor
24500 72 65 63 74 20 61 6e 73 77 65 72 20 69 73 20 74  rect answer is t
24510 68 72 65 65 20 72 6f 77 73 3a 20 20 28 31 2c 31  hree rows:  (1,1
24520 2c 4e 55 4c 4c 29 2c 28 32 2c 32 2c 38 29 2c 28  ,NULL),(2,2,8),(
24530 32 2c 32 2c 39 29 2e 0a 2a 2a 20 20 20 20 20 20  2,2,9)..**      
24540 20 42 75 74 20 69 66 20 74 68 65 20 28 62 32 3d   But if the (b2=
24550 32 29 20 74 65 72 6d 20 77 65 72 65 20 74 6f 20  2) term were to 
24560 62 65 20 70 75 73 68 65 64 20 64 6f 77 6e 20 69  be pushed down i
24570 6e 74 6f 20 74 68 65 20 62 62 20 73 75 62 71 75  nto the bb subqu
24580 65 72 79 2c 0a 2a 2a 20 20 20 20 20 20 20 74 68  ery,.**       th
24590 65 6e 20 74 68 65 20 28 31 2c 31 2c 4e 55 4c 4c  en the (1,1,NULL
245a0 29 20 72 6f 77 20 77 6f 75 6c 64 20 62 65 20 73  ) row would be s
245b0 75 70 70 72 65 73 73 65 64 2e 0a 2a 2a 0a 2a 2a  uppressed..**.**
245c0 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20   Return 0 if no 
245d0 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
245e0 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66   and non-zero if
245f0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45   one or more WHE
24600 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72  RE clause.** ter
24610 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61 74 65  ms are duplicate
24620 64 20 69 6e 74 6f 20 74 68 65 20 73 75 62 71 75  d into the subqu
24630 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
24640 6e 74 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65  nt pushDownWhere
24650 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a  Terms(.  Parse *
24660 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
24670 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
24680 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  (for malloc() an
24690 64 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e  d error reportin
246a0 67 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  g) */.  Select *
246b0 70 53 75 62 71 2c 20 20 20 20 20 20 20 20 2f 2a  pSubq,        /*
246c0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 77 68   The subquery wh
246d0 6f 73 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ose WHERE clause
246e0 20 69 73 20 74 6f 20 62 65 20 61 75 67 6d 65 6e   is to be augmen
246f0 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ted */.  Expr *p
24700 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
24710 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
24720 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
24730 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
24740 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20  Cursor,         
24750 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
24760 72 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  r of the subquer
24770 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66  y */.  int isLef
24780 74 4a 6f 69 6e 20 20 20 20 20 20 20 20 2f 2a 20  tJoin        /* 
24790 54 72 75 65 20 69 66 20 70 53 75 62 71 20 69 73  True if pSubq is
247a0 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
247b0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a  of a LEFT JOIN *
247c0 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  /.){.  Expr *pNe
247d0 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d  w;.  int nChng =
247e0 20 30 3b 0a 20 20 69 66 28 20 70 57 68 65 72 65   0;.  if( pWhere
247f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
24800 20 20 69 66 28 20 70 53 75 62 71 2d 3e 73 65 6c    if( pSubq->sel
24810 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
24820 73 69 76 65 20 29 20 72 65 74 75 72 6e 20 30 3b  sive ) return 0;
24830 20 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e    /* restriction
24840 20 28 32 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20   (2) */..#ifdef 
24850 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
24860 2a 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  * Only the first
24870 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f   term of a compo
24880 75 6e 64 20 63 61 6e 20 68 61 76 65 20 61 20 57  und can have a W
24890 49 54 48 20 63 6c 61 75 73 65 2e 20 20 42 75 74  ITH clause.  But
248a0 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20   make.  ** sure 
248b0 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 73 20 61  no other terms a
248c0 72 65 20 6d 61 72 6b 65 64 20 53 46 5f 52 65 63  re marked SF_Rec
248d0 75 72 73 69 76 65 20 69 6e 20 63 61 73 65 20 73  ursive in case s
248e0 6f 6d 65 74 68 69 6e 67 20 63 68 61 6e 67 65 73  omething changes
248f0 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 75 74  .  ** in the fut
24900 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20  ure..  */.  {.  
24910 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 20 20 0a    Select *pX;  .
24920 20 20 20 20 66 6f 72 28 70 58 3d 70 53 75 62 71      for(pX=pSubq
24930 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50 72  ; pX; pX=pX->pPr
24940 69 6f 72 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ior){.      asse
24950 72 74 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61 67  rt( (pX->selFlag
24960 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76  s & (SF_Recursiv
24970 65 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  e))==0 );.    }.
24980 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
24990 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21  ( pSubq->pLimit!
249a0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
249b0 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69   0; /* restricti
249c0 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20  on (3) */.  }.  
249d0 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f  while( pWhere->o
249e0 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p==TK_AND ){.   
249f0 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f   nChng += pushDo
24a00 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50 61  wnWhereTerms(pPa
24a10 72 73 65 2c 20 70 53 75 62 71 2c 20 70 57 68 65  rse, pSubq, pWhe
24a20 72 65 2d 3e 70 52 69 67 68 74 2c 0a 20 20 20 20  re->pRight,.    
24a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a40 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72              iCur
24a50 73 6f 72 2c 20 69 73 4c 65 66 74 4a 6f 69 6e 29  sor, isLeftJoin)
24a60 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70  ;.    pWhere = p
24a70 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20 20  Where->pLeft;.  
24a80 7d 0a 20 20 69 66 28 20 69 73 4c 65 66 74 4a 6f  }.  if( isLeftJo
24a90 69 6e 0a 20 20 20 26 26 20 28 45 78 70 72 48 61  in.   && (ExprHa
24aa0 73 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65  sProperty(pWhere
24ab0 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3d 3d 30  ,EP_FromJoin)==0
24ac0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57 68  .         || pWh
24ad0 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  ere->iRightJoinT
24ae0 61 62 6c 65 21 3d 69 43 75 72 73 6f 72 29 0a 20  able!=iCursor). 
24af0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
24b00 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
24b10 20 28 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66   (4) */.  }.  if
24b20 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
24b30 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d  y(pWhere,EP_From
24b40 4a 6f 69 6e 29 20 26 26 20 70 57 68 65 72 65 2d  Join) && pWhere-
24b50 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
24b60 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  !=iCursor ){.   
24b70 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
24b80 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20 2a 2f  striction (5) */
24b90 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
24ba0 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
24bb0 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43  stant(pWhere, iC
24bc0 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43  ursor) ){.    nC
24bd0 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65  hng++;.    while
24be0 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20  ( pSubq ){.     
24bf0 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b   SubstContext x;
24c00 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
24c10 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
24c20 72 73 65 2d 3e 64 62 2c 20 70 57 68 65 72 65 2c  rse->db, pWhere,
24c30 20 30 29 3b 0a 20 20 20 20 20 20 75 6e 73 65 74   0);.      unset
24c40 4a 6f 69 6e 45 78 70 72 28 70 4e 65 77 2c 20 2d  JoinExpr(pNew, -
24c50 31 29 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72  1);.      x.pPar
24c60 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
24c70 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 43     x.iTable = iC
24c80 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69  ursor;.      x.i
24c90 4e 65 77 54 61 62 6c 65 20 3d 20 69 43 75 72 73  NewTable = iCurs
24ca0 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c 65  or;.      x.isLe
24cb0 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20 20 20  ftJoin = 0;.    
24cc0 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75    x.pEList = pSu
24cd0 62 71 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  bq->pEList;.    
24ce0 20 20 70 4e 65 77 20 3d 20 73 75 62 73 74 45 78    pNew = substEx
24cf0 70 72 28 26 78 2c 20 70 4e 65 77 29 3b 0a 20 20  pr(&x, pNew);.  
24d00 20 20 20 20 69 66 28 20 70 53 75 62 71 2d 3e 73      if( pSubq->s
24d10 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
24d20 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20  regate ){.      
24d30 20 20 70 53 75 62 71 2d 3e 70 48 61 76 69 6e 67    pSubq->pHaving
24d40 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
24d50 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  d(pParse->db, pS
24d60 75 62 71 2d 3e 70 48 61 76 69 6e 67 2c 20 70 4e  ubq->pHaving, pN
24d70 65 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ew);.      }else
24d80 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 71 2d  {.        pSubq-
24d90 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
24da0 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
24db0 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 57 68 65  >db, pSubq->pWhe
24dc0 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  re, pNew);.     
24dd0 20 7d 0a 20 20 20 20 20 20 70 53 75 62 71 20 3d   }.      pSubq =
24de0 20 70 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b 0a   pSubq->pPrior;.
24df0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
24e00 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64  rn nChng;.}.#end
24e10 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
24e20 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
24e30 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
24e40 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
24e50 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  W) */../*.** The
24e60 20 70 46 75 6e 63 20 69 73 20 74 68 65 20 6f 6e   pFunc is the on
24e70 6c 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ly aggregate fun
24e80 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 71 75 65  ction in the que
24e90 72 79 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  ry.  Check to se
24ea0 65 0a 2a 2a 20 69 66 20 74 68 65 20 71 75 65 72  e.** if the quer
24eb0 79 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  y is a candidate
24ec0 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78   for the min/max
24ed0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 0a   optimization. .
24ee0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65  **.** If the que
24ef0 72 79 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ry is a candidat
24f00 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61  e for the min/ma
24f10 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  x optimization, 
24f20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 2a 70 70 4d  then set.** *ppM
24f30 69 6e 4d 61 78 20 74 6f 20 62 65 20 61 6e 20 4f  inMax to be an O
24f40 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
24f50 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  o be used for th
24f60 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
24f70 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 65 69 74  * and return eit
24f80 68 65 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42  her WHERE_ORDERB
24f90 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f  Y_MIN or WHERE_O
24fa0 52 44 45 52 42 59 5f 4d 41 58 20 64 65 70 65 6e  RDERBY_MAX depen
24fb0 64 69 6e 67 20 6f 6e 0a 2a 2a 20 77 68 65 74 68  ding on.** wheth
24fc0 65 72 20 70 46 75 6e 63 20 69 73 20 61 20 6d 69  er pFunc is a mi
24fd0 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
24fe0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
24ff0 74 68 65 20 71 75 65 72 79 20 69 73 20 6e 6f 74  the query is not
25000 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
25010 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74   the min/max opt
25020 69 6d 69 7a 61 74 69 6f 6e 2c 20 72 65 74 75 72  imization, retur
25030 6e 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52  n.** WHERE_ORDER
25040 42 59 5f 4e 4f 52 4d 41 4c 20 28 77 68 69 63 68  BY_NORMAL (which
25050 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 29 2e 0a   must be zero)..
25060 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
25070 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
25080 64 20 61 66 74 65 72 20 61 67 67 72 65 67 61 74  d after aggregat
25090 65 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65  e functions have
250a0 20 62 65 65 6e 0a 2a 2a 20 6c 6f 63 61 74 65 64   been.** located
250b0 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 65 69   but before thei
250c0 72 20 61 72 67 75 6d 65 6e 74 73 20 68 61 76 65  r arguments have
250d0 20 62 65 65 6e 20 73 75 62 6a 65 63 74 65 64 20   been subjected 
250e0 74 6f 20 61 67 67 72 65 67 61 74 65 0a 2a 2a 20  to aggregate.** 
250f0 61 6e 61 6c 79 73 69 73 2e 0a 2a 2f 0a 73 74 61  analysis..*/.sta
25100 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65  tic u8 minMaxQue
25110 72 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ry(sqlite3 *db, 
25120 45 78 70 72 20 2a 70 46 75 6e 63 2c 20 45 78 70  Expr *pFunc, Exp
25130 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78  rList **ppMinMax
25140 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20  ){.  int eRet = 
25150 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
25160 52 4d 41 4c 3b 20 20 20 20 20 20 2f 2a 20 52 65  RMAL;      /* Re
25170 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20  turn value */.  
25180 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
25190 20 3d 20 70 46 75 6e 63 2d 3e 78 2e 70 4c 69 73   = pFunc->x.pLis
251a0 74 3b 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e  t;    /* Argumen
251b0 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69  ts to agg functi
251c0 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
251d0 61 72 20 2a 7a 46 75 6e 63 3b 20 20 20 20 20 20  ar *zFunc;      
251e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
251f0 20 4e 61 6d 65 20 6f 66 20 61 67 67 72 65 67 61   Name of aggrega
25200 74 65 20 66 75 6e 63 74 69 6f 6e 20 70 46 75 6e  te function pFun
25210 63 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  c */.  ExprList 
25220 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 75 38 20  *pOrderBy;.  u8 
25230 73 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 61 73  sortOrder;..  as
25240 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d  sert( *ppMinMax=
25250 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
25260 70 46 75 6e 63 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pFunc->op==TK_AG
25270 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
25280 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c  if( pEList==0 ||
25290 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
252a0 31 20 29 20 72 65 74 75 72 6e 20 65 52 65 74 3b  1 ) return eRet;
252b0 0a 20 20 7a 46 75 6e 63 20 3d 20 70 46 75 6e 63  .  zFunc = pFunc
252c0 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 69 66  ->u.zToken;.  if
252d0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
252e0 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d  (zFunc, "min")==
252f0 30 20 29 7b 0a 20 20 20 20 65 52 65 74 20 3d 20  0 ){.    eRet = 
25300 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
25310 4e 3b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  N;.    sortOrder
25320 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43   = SQLITE_SO_ASC
25330 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
25340 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
25350 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b  nc, "max")==0 ){
25360 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52  .    eRet = WHER
25370 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20  E_ORDERBY_MAX;. 
25380 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 53     sortOrder = S
25390 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3b 0a 20  QLITE_SO_DESC;. 
253a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
253b0 72 6e 20 65 52 65 74 3b 0a 20 20 7d 0a 20 20 2a  rn eRet;.  }.  *
253c0 70 70 4d 69 6e 4d 61 78 20 3d 20 70 4f 72 64 65  ppMinMax = pOrde
253d0 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
253e0 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c  rListDup(db, pEL
253f0 69 73 74 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ist, 0);.  asser
25400 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 7c  t( pOrderBy!=0 |
25410 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
25420 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 64  ed );.  if( pOrd
25430 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d  erBy ) pOrderBy-
25440 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
25450 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 72  = sortOrder;.  r
25460 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f  eturn eRet;.}../
25470 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20  *.** The select 
25480 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
25490 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
254a0 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67  gument is an agg
254b0 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a  regate query..**
254c0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
254d0 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f  ment is the asso
254e0 63 69 61 74 65 64 20 61 67 67 72 65 67 61 74 65  ciated aggregate
254f0 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68  -info object. Th
25500 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
25510 74 65 73 74 73 20 69 66 20 74 68 65 20 53 45 4c  tests if the SEL
25520 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ECT is of the fo
25530 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  rm:.**.**   SELE
25540 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
25550 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65   <tbl>.**.** whe
25560 72 65 20 74 61 62 6c 65 20 69 73 20 61 20 64 61  re table is a da
25570 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f  tabase table, no
25580 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  t a sub-select o
25590 72 20 76 69 65 77 2e 20 49 66 20 74 68 65 20 71  r view. If the q
255a0 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74  uery.** does mat
255b0 63 68 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c  ch this pattern,
255c0 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20   then a pointer 
255d0 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  to the Table obj
255e0 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ect representing
255f0 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74  .** <tbl> is ret
25600 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
25610 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
25620 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65  .*/.static Table
25630 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28   *isSimpleCount(
25640 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e  Select *p, AggIn
25650 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
25660 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
25670 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20  Expr *pExpr;..  
25680 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f  assert( !p->pGro
25690 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70  upBy );..  if( p
256a0 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70  ->pWhere || p->p
256b0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
256c0 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  .   || p->pSrc->
256d0 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53  nSrc!=1 || p->pS
256e0 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
256f0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
25700 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d   0;.  }.  pTab =
25710 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
25720 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  Tab;.  pExpr = p
25730 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
25740 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
25750 70 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70  pTab && !pTab->p
25760 53 65 6c 65 63 74 20 26 26 20 70 45 78 70 72 20  Select && pExpr 
25770 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74  );..  if( IsVirt
25780 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
25790 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
257a0 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55  r->op!=TK_AGG_FU
257b0 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20  NCTION ) return 
257c0 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  0;.  if( NEVER(p
257d0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d  AggInfo->nFunc==
257e0 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0) ) return 0;. 
257f0 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e   if( (pAggInfo->
25800 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e  aFunc[0].pFunc->
25810 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45  funcFlags&SQLITE
25820 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20  _FUNC_COUNT)==0 
25830 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
25840 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45  ( pExpr->flags&E
25850 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74  P_Distinct ) ret
25860 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  urn 0;..  return
25870 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
25880 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69  If the source-li
25890 73 74 20 69 74 65 6d 20 70 61 73 73 65 64 20 61  st item passed a
258a0 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61  s an argument wa
258b0 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68  s augmented with
258c0 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42   an.** INDEXED B
258d0 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
258e0 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ry to locate the
258f0 20 73 70 65 63 69 66 69 65 64 20 69 6e 64 65 78   specified index
25900 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61  . If there.** wa
25910 73 20 73 75 63 68 20 61 20 63 6c 61 75 73 65 20  s such a clause 
25920 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  and the named in
25930 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  dex cannot be fo
25940 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  und, return .** 
25950 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64  SQLITE_ERROR and
25960 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
25970 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72  in pParse. Other
25980 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a  wise, populate .
25990 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78  ** pFrom->pIndex
259a0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
259b0 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
259c0 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f  lite3IndexedByLo
259d0 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61 72  okup(Parse *pPar
259e0 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69  se, struct SrcLi
259f0 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b  st_item *pFrom){
25a00 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54  .  if( pFrom->pT
25a10 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 66 67 2e  ab && pFrom->fg.
25a20 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20  isIndexedBy ){. 
25a30 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
25a40 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
25a50 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 65 64    char *zIndexed
25a60 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a  By = pFrom->u1.z
25a70 49 6e 64 65 78 65 64 42 79 3b 0a 20 20 20 20 49  IndexedBy;.    I
25a80 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
25a90 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
25aa0 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20  Index; .        
25ab0 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33 53  pIdx && sqlite3S
25ac0 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61  trICmp(pIdx->zNa
25ad0 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42 79 29 3b  me, zIndexedBy);
25ae0 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d 70   .        pIdx=p
25af0 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29  Idx->pNext.    )
25b00 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78 20  ;.    if( !pIdx 
25b10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
25b20 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
25b30 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
25b40 20 25 73 22 2c 20 7a 49 6e 64 65 78 65 64 42 79   %s", zIndexedBy
25b50 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
25b60 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
25b70 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
25b80 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
25b90 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d      }.    pFrom-
25ba0 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 49 64 78  >pIBIndex = pIdx
25bb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
25bc0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  QLITE_OK;.}./*.*
25bd0 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e  * Detect compoun
25be0 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
25bf0 6e 74 73 20 74 68 61 74 20 75 73 65 20 61 6e 20  nts that use an 
25c00 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
25c10 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65  with .** an alte
25c20 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e  rnative collatin
25c30 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
25c40 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20  *    SELECT ... 
25c50 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
25c60 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
25c70 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f  2 ORDER BY .. CO
25c80 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  LLATE ....**.** 
25c90 54 68 65 73 65 20 61 72 65 20 72 65 77 72 69 74  These are rewrit
25ca0 74 65 6e 20 61 73 20 61 20 73 75 62 71 75 65 72  ten as a subquer
25cb0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  y:.**.**    SELE
25cc0 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
25cd0 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58  T ... FROM t1 EX
25ce0 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20  CEPT SELECT ... 
25cf0 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20  FROM t2).**     
25d00 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c  ORDER BY ... COL
25d10 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54  LATE ....**.** T
25d20 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
25d30 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  on is necessary 
25d40 62 65 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74  because the mult
25d50 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29  iSelectOrderBy()
25d60 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76   routine.** abov
25d70 65 20 74 68 61 74 20 67 65 6e 65 72 61 74 65 73  e that generates
25d80 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   the code for a 
25d90 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
25da0 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
25db0 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20   clause.** uses 
25dc0 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  a merge algorith
25dd0 6d 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  m that requires 
25de0 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69  the same collati
25df0 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74  ng sequence on t
25e00 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c  he.** result col
25e10 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f  umns as on the O
25e20 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
25e30 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68   See ticket.** h
25e40 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65  ttp://www.sqlite
25e50 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37  .org/src/info/67
25e60 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54  09574d2a.**.** T
25e70 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
25e80 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65  on is only neede
25e90 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e  d for EXCEPT, IN
25ea0 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49  TERSECT, and UNI
25eb0 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e  ON..** The UNION
25ec0 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f   ALL operator wo
25ed0 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75  rks fine with mu
25ee0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
25ef0 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20  () even when.** 
25f00 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54  there are COLLAT
25f10 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  E terms in the O
25f20 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74  RDER BY..*/.stat
25f30 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f  ic int convertCo
25f40 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75  mpoundSelectToSu
25f50 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70  bquery(Walker *p
25f60 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
25f70 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  p){.  int i;.  S
25f80 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53  elect *pNew;.  S
25f90 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c  elect *pX;.  sql
25fa0 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75  ite3 *db;.  stru
25fb0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
25fc0 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   *a;.  SrcList *
25fd0 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65  pNewSrc;.  Parse
25fe0 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65   *pParse;.  Toke
25ff0 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20  n dummy;..  if( 
26000 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72  p->pPrior==0 ) r
26010 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
26020 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72  ue;.  if( p->pOr
26030 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
26040 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
26050 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26    for(pX=p; pX &
26060 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  & (pX->op==TK_AL
26070 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  L || pX->op==TK_
26080 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e  SELECT); pX=pX->
26090 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20  pPrior){}.  if( 
260a0 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  pX==0 ) return W
260b0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61  RC_Continue;.  a
260c0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e   = p->pOrderBy->
260d0 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f  a;.  for(i=p->pO
260e0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b  rderBy->nExpr-1;
260f0 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
26100 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d   if( a[i].pExpr-
26110 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
26120 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ate ) break;.  }
26130 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
26140 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
26150 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  ;..  /* If we re
26160 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
26170 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74  that means the t
26180 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
26190 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20   required. */.. 
261a0 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65   pParse = pWalke
261b0 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  r->pParse;.  db 
261c0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
261d0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
261e0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
261f0 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
26200 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
26210 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
26220 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d  ;.  memset(&dumm
26230 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d  y, 0, sizeof(dum
26240 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20  my));.  pNewSrc 
26250 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
26260 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70  AppendFromTerm(p
26270 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d  Parse,0,0,0,&dum
26280 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20  my,pNew,0,0);.  
26290 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29  if( pNewSrc==0 )
262a0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
262b0 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b  t;.  *pNew = *p;
262c0 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65  .  p->pSrc = pNe
262d0 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73  wSrc;.  p->pELis
262e0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
262f0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
26300 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72  , 0, sqlite3Expr
26310 28 64 62 2c 20 54 4b 5f 41 53 54 45 52 49 53 4b  (db, TK_ASTERISK
26320 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d  , 0));.  p->op =
26330 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d   TK_SELECT;.  p-
26340 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70  >pWhere = 0;.  p
26350 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
26360 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  0;.  pNew->pHavi
26370 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  ng = 0;.  pNew->
26380 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
26390 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
263a0 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20   p->pNext = 0;. 
263b0 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20   p->pWith = 0;. 
263c0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
263d0 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20  ~SF_Compound;.  
263e0 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
263f0 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72  lags & SF_Conver
26400 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  ted)==0 );.  p->
26410 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43  selFlags |= SF_C
26420 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73 73 65  onverted;.  asse
26430 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  rt( pNew->pPrior
26440 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  !=0 );.  pNew->p
26450 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
26460 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  New;.  pNew->pLi
26470 6d 69 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  mit = 0;.  retur
26480 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
26490 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
264a0 6f 20 73 65 65 20 69 66 20 74 68 65 20 46 52 4f  o see if the FRO
264b0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 46  M clause term pF
264c0 72 6f 6d 20 68 61 73 20 74 61 62 6c 65 2d 76 61  rom has table-va
264d0 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  lued function.**
264e0 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 49 66 20   arguments.  If 
264f0 69 74 20 64 6f 65 73 2c 20 6c 65 61 76 65 20 61  it does, leave a
26500 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
26510 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
26520 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
26530 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d 20 69 73  , since pFrom is
26540 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20   not allowed to 
26550 62 65 20 61 20 74 61 62 6c 65 2d 76 61 6c 75 65  be a table-value
26560 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  d function..*/.s
26570 74 61 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f 74  tatic int cannot
26580 42 65 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65  BeFunction(Parse
26590 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74   *pParse, struct
265a0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
265b0 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72  From){.  if( pFr
265c0 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  om->fg.isTabFunc
265d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
265e0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
265f0 22 27 25 73 27 20 69 73 20 6e 6f 74 20 61 20 66  "'%s' is not a f
26600 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d  unction", pFrom-
26610 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
26620 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
26630 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn 0;.}..#ifnde
26640 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
26650 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  E./*.** Argument
26660 20 70 57 69 74 68 20 28 77 68 69 63 68 20 6d 61   pWith (which ma
26670 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74  y be NULL) point
26680 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69  s to a linked li
26690 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a  st of nested .**
266a0 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20   WITH contexts, 
266b0 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75  from inner to ou
266c0 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20  termost. If the 
266d0 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64  table identified
266e0 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   by .** FROM cla
266f0 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65  use element pIte
26700 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f  m is really a co
26710 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65  mmon-table-expre
26720 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20  ssion (CTE) .** 
26730 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f  then return a po
26740 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54 45  inter to the CTE
26750 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20   definition for 
26760 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65  that table. Othe
26770 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20  rwise.** return 
26780 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
26790 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
267a0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74  is returned, set
267b0 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70   *ppContext to p
267c0 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68  oint to the With
267d0 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20  .** object that 
267e0 74 68 65 20 72 65 74 75 72 6e 65 64 20 43 54 45  the returned CTE
267f0 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a   belongs to..*/.
26800 73 74 61 74 69 63 20 73 74 72 75 63 74 20 43 74  static struct Ct
26810 65 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20  e *searchWith(. 
26820 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20   With *pWith,   
26830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26840 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e 65   /* Current inne
26850 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73  rmost WITH claus
26860 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
26870 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
26880 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  m,     /* FROM c
26890 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f  lause element to
268a0 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69   resolve */.  Wi
268b0 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20  th **ppContext  
268c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
268d0 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73   OUT: WITH claus
268e0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62  e return value b
268f0 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a  elongs to */.){.
26900 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
26910 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  ame;.  if( pItem
26920 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26  ->zDatabase==0 &
26930 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d  & (zName = pItem
26940 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ->zName)!=0 ){. 
26950 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20     With *p;.    
26960 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20  for(p=pWith; p; 
26970 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20  p=p->pOuter){.  
26980 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
26990 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
269a0 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
269b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
269c0 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e  rICmp(zName, p->
269d0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
269e0 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 43  {.          *ppC
269f0 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  ontext = p;.    
26a00 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d        return &p-
26a10 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d  >a[i];.        }
26a20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
26a30 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
26a40 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65  ../* The code ge
26a50 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e  nerator maintain
26a60 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74  s a stack of act
26a70 69 76 65 20 57 49 54 48 20 63 6c 61 75 73 65 73  ive WITH clauses
26a80 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e  .** with the inn
26a90 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61  er-most WITH cla
26aa0 75 73 65 20 62 65 69 6e 67 20 61 74 20 74 68 65  use being at the
26ab0 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
26ac0 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
26ad0 75 74 69 6e 65 20 70 75 73 68 65 73 20 74 68 65  utine pushes the
26ae0 20 57 49 54 48 20 63 6c 61 75 73 65 20 70 61 73   WITH clause pas
26af0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
26b00 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e  d argument.** on
26b10 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  to the top of th
26b20 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75  e stack. If argu
26b30 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20 74 72  ment bFree is tr
26b40 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a  ue, then this.**
26b50 20 57 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c   WITH clause wil
26b60 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65  l never be poppe
26b70 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  d from the stack
26b80 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
26b90 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66  t.** should be f
26ba0 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  reed along with 
26bb0 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
26bc0 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73  . In other cases
26bd0 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d  , when.** bFree=
26be0 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a  =0, the With obj
26bf0 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65  ect will be free
26c00 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
26c10 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74   SELECT .** stat
26c20 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63 68  ement with which
26c30 20 69 74 20 69 73 20 61 73 73 6f 63 69 61 74 65   it is associate
26c40 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
26c50 65 33 57 69 74 68 50 75 73 68 28 50 61 72 73 65  e3WithPush(Parse
26c60 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a   *pParse, With *
26c70 70 57 69 74 68 2c 20 75 38 20 62 46 72 65 65 29  pWith, u8 bFree)
26c80 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46 72 65  {.  assert( bFre
26c90 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73 65 2d  e==0 || (pParse-
26ca0 3e 70 57 69 74 68 3d 3d 30 20 26 26 20 70 50 61  >pWith==0 && pPa
26cb0 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65  rse->pWithToFree
26cc0 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 57  ==0) );.  if( pW
26cd0 69 74 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ith ){.    asser
26ce0 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  t( pParse->pWith
26cf0 21 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70  !=pWith );.    p
26d00 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70  With->pOuter = p
26d10 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20  Parse->pWith;.  
26d20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
26d30 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28  = pWith;.    if(
26d40 20 62 46 72 65 65 20 29 20 70 50 61 72 73 65 2d   bFree ) pParse-
26d50 3e 70 57 69 74 68 54 6f 46 72 65 65 20 3d 20 70  >pWithToFree = p
26d60 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  With;.  }.}../*.
26d70 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
26d80 20 63 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d   checks if argum
26d90 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73  ent pFrom refers
26da0 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72   to a CTE declar
26db0 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48  ed by .** a WITH
26dc0 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73   clause on the s
26dd0 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d  tack currently m
26de0 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65  aintained by the
26df0 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a   parser. And,.**
26e00 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72   if currently pr
26e10 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45 20 65  ocessing a CTE e
26e20 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74  xpression, if it
26e30 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65 0a   is a recursive.
26e40 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ** reference to 
26e50 74 68 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e  the current CTE.
26e60 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20  .**.** If pFrom 
26e70 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65  falls into eithe
26e80 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74  r of the two cat
26e90 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70  egories above, p
26ea0 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e  From->pTab.** an
26eb0 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61  d other fields a
26ec0 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63  re populated acc
26ed0 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61  ordingly. The ca
26ee0 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63  ller should chec
26ef0 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61  k.** (pFrom->pTa
26f00 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69  b!=0) to determi
26f10 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
26f20 74 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d  t a successful m
26f30 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e  atch.** was foun
26f40 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
26f50 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20   or not a match 
26f60 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45  is found, SQLITE
26f70 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
26f80 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f  if no error.** o
26f90 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72  ccurs. If an err
26fa0 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61  or does occur, a
26fb0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
26fc0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
26fd0 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73  .** parser and s
26fe0 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ome error code o
26ff0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
27000 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
27010 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 74 68  .static int with
27020 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72  Expand(.  Walker
27030 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74   *pWalker, .  st
27040 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
27050 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61  m *pFrom.){.  Pa
27060 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
27070 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
27080 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
27090 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72  Parse->db;.  str
270a0 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20  uct Cte *pCte;  
270b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
270c0 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f 72 20  Matched CTE (or 
270d0 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68  NULL if no match
270e0 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69  ) */.  With *pWi
270f0 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
27100 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63         /* WITH c
27110 6c 61 75 73 65 20 74 68 61 74 20 70 43 74 65 20  lause that pCte 
27120 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20  belongs to */.. 
27130 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
27140 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43  pTab==0 );..  pC
27150 74 65 20 3d 20 73 65 61 72 63 68 57 69 74 68 28  te = searchWith(
27160 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70  pParse->pWith, p
27170 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20  From, &pWith);. 
27180 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20   if( pCte ){.   
27190 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
271a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
271b0 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  st;.    Select *
271c0 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74  pSel;.    Select
271d0 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20   *pLeft;        
271e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d          /* Left-
271f0 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
27200 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ement */.    int
27210 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20   bMayRecursive; 
27220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
27230 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a  ue if compound j
27240 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b  oined by UNION [
27250 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68  ALL] */.    With
27260 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20 20   *pSavedWith;   
27270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
27280 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50  tial value of pP
27290 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a  arse->pWith */..
272a0 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e      /* If pCte->
272b0 7a 43 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e  zCteErr is non-N
272c0 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ULL at this poin
272d0 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  t, then this is 
272e0 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a  an illegal.    *
272f0 2a 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  * recursive refe
27300 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74  rence to CTE pCt
27310 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f  e. Leave an erro
27320 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  r in pParse and 
27330 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61  return.    ** ea
27340 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43  rly. If pCte->zC
27350 74 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74  teErr is NULL, t
27360 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20  hen this is not 
27370 61 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  a recursive refe
27380 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e  rence..    ** In
27390 20 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63   this case, proc
273a0 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  eed.  */.    if(
273b0 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 29   pCte->zCteErr )
273c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
273d0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
273e0 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70  pCte->zCteErr, p
273f0 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
27400 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27410 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
27420 20 20 69 66 28 20 63 61 6e 6e 6f 74 42 65 46 75    if( cannotBeFu
27430 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  nction(pParse, p
27440 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 53  From) ) return S
27450 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20  QLITE_ERROR;..  
27460 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
27470 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
27480 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
27490 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
274a0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
274b0 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20  eof(Table));.   
274c0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
274d0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
274e0 0a 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52  .    pTab->nTabR
274f0 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54 61 62  ef = 1;.    pTab
27500 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
27510 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43  3DbStrDup(db, pC
27520 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  te->zName);.    
27530 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
27540 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77  ;.    pTab->nRow
27550 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73  LogEst = 200; as
27560 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74  sert( 200==sqlit
27570 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36  e3LogEst(1048576
27580 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74  ) );.    pTab->t
27590 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70  abFlags |= TF_Ep
275a0 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f 4e 6f 56  hemeral | TF_NoV
275b0 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20  isibleRowid;.   
275c0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
275d0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
275e0 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65  up(db, pCte->pSe
275f0 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  lect, 0);.    if
27600 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
27610 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ed ) return SQLI
27620 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
27630 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
27640 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20  ->pSelect );..  
27650 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
27660 69 73 20 69 73 20 61 20 72 65 63 75 72 73 69 76  is is a recursiv
27670 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53  e CTE. */.    pS
27680 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
27690 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52 65 63  ect;.    bMayRec
276a0 75 72 73 69 76 65 20 3d 20 28 20 70 53 65 6c 2d  ursive = ( pSel-
276b0 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
276c0 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  Sel->op==TK_UNIO
276d0 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61  N );.    if( bMa
276e0 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  yRecursive ){.  
276f0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
27700 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
27710 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d   pFrom->pSelect-
27720 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72  >pSrc;.      for
27730 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
27740 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
27750 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
27760 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
27770 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pSrc->a[i];.    
27780 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
27790 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20 20 20  Database==0 .   
277a0 20 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e        && pItem->
277b0 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20 20 20  zName!=0 .      
277c0 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33     && 0==sqlite3
277d0 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a  StrICmp(pItem->z
277e0 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  Name, pCte->zNam
277f0 65 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  e).          ){.
27800 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
27810 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20  >pTab = pTab;.  
27820 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66          pItem->f
27830 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 3d 20  g.isRecursive = 
27840 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  1;.          pTa
27850 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20  b->nTabRef++;.  
27860 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65          pSel->se
27870 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 63  lFlags |= SF_Rec
27880 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20 20 20  ursive;.        
27890 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
278a0 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65  .    /* Only one
278b0 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
278c0 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74 74 65  ence is permitte
278d0 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 70  d. */ .    if( p
278e0 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 32 20 29  Tab->nTabRef>2 )
278f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
27900 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20 20  rrorMsg(.       
27910 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c 74     pParse, "mult
27920 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20  iple references 
27930 74 6f 20 72 65 63 75 72 73 69 76 65 20 74 61 62  to recursive tab
27940 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a  le: %s", pCte->z
27950 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  Name.      );.  
27960 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27970 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
27980 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
27990 3e 6e 54 61 62 52 65 66 3d 3d 31 20 7c 7c 20 0a  >nTabRef==1 || .
279a0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70 53              ((pS
279b0 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f  el->selFlags&SF_
279c0 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70 54  Recursive) && pT
279d0 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 32 20 29  ab->nTabRef==2 )
279e0 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43  );..    pCte->zC
279f0 74 65 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61  teErr = "circula
27a00 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22  r reference: %s"
27a10 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69 74 68  ;.    pSavedWith
27a20 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68   = pParse->pWith
27a30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  ;.    pParse->pW
27a40 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20  ith = pWith;.   
27a50 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
27a60 76 65 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  ve ){.      Sele
27a70 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 53 65  ct *pPrior = pSe
27a80 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  l->pPrior;.     
27a90 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
27aa0 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20 20  >pWith==0 );.   
27ab0 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68     pPrior->pWith
27ac0 20 3d 20 70 53 65 6c 2d 3e 70 57 69 74 68 3b 0a   = pSel->pWith;.
27ad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
27ae0 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
27af0 20 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 20 20   pPrior);.      
27b00 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20  pPrior->pWith = 
27b10 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
27b20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
27b30 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
27b40 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sel);.    }.    
27b50 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
27b60 70 57 69 74 68 3b 0a 0a 20 20 20 20 66 6f 72 28  pWith;..    for(
27b70 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66  pLeft=pSel; pLef
27b80 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74  t->pPrior; pLeft
27b90 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b  =pLeft->pPrior);
27ba0 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c  .    pEList = pL
27bb0 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  eft->pEList;.   
27bc0 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73   if( pCte->pCols
27bd0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45   ){.      if( pE
27be0 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
27bf0 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f  nExpr!=pCte->pCo
27c00 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  ls->nExpr ){.   
27c10 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
27c20 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
27c30 62 6c 65 20 25 73 20 68 61 73 20 25 64 20 76 61  ble %s has %d va
27c40 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75  lues for %d colu
27c50 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  mns",.          
27c60 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70    pCte->zName, p
27c70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43  EList->nExpr, pC
27c80 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72  te->pCols->nExpr
27c90 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
27ca0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
27cb0 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
27cc0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
27cd0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
27ce0 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73     }.      pELis
27cf0 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b  t = pCte->pCols;
27d00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
27d10 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
27d20 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
27d30 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43  EList, &pTab->nC
27d40 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29  ol, &pTab->aCol)
27d50 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
27d60 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
27d70 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c   if( pSel->selFl
27d80 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
27d90 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ve ){.        pC
27da0 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 6d  te->zCteErr = "m
27db0 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73 69 76  ultiple recursiv
27dc0 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20 25 73  e references: %s
27dd0 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
27de0 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43          pCte->zC
27df0 74 65 45 72 72 20 3d 20 22 72 65 63 75 72 73 69  teErr = "recursi
27e00 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20  ve reference in 
27e10 61 20 73 75 62 71 75 65 72 79 3a 20 25 73 22 3b  a subquery: %s";
27e20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
27e30 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
27e40 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b  (pWalker, pSel);
27e50 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74 65 2d  .    }.    pCte-
27e60 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20  >zCteErr = 0;.  
27e70 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
27e80 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20  = pSavedWith;.  
27e90 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
27ea0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
27eb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27ec0 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49  OMIT_CTE./*.** I
27ed0 66 20 74 68 65 20 53 45 4c 45 43 54 20 70 61 73  f the SELECT pas
27ee0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
27ef0 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61  d argument has a
27f00 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57 49 54  n associated WIT
27f10 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f  H .** clause, po
27f20 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73 74  p it from the st
27f30 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70 61  ack stored as pa
27f40 72 74 20 6f 66 20 74 68 65 20 50 61 72 73 65 20  rt of the Parse 
27f50 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
27f60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
27f70 73 65 64 20 61 73 20 74 68 65 20 78 53 65 6c 65  sed as the xSele
27f80 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63 61  ctCallback2() ca
27f90 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c  llback by.** sql
27fa0 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
27fb0 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20  () when walking 
27fc0 61 20 53 45 4c 45 43 54 20 74 72 65 65 20 74 6f  a SELECT tree to
27fd0 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a   resolve table.*
27fe0 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68 65  * names and othe
27ff0 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  r FROM clause el
28000 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74  ements. .*/.stat
28010 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50 6f  ic void selectPo
28020 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57  pWith(Walker *pW
28030 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
28040 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
28050 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
28060 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49  arse;.  if( OK_I
28070 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70 50  F_ALWAYS_TRUE(pP
28080 61 72 73 65 2d 3e 70 57 69 74 68 29 20 26 26 20  arse->pWith) && 
28090 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a  p->pPrior==0 ){.
280a0 20 20 20 20 57 69 74 68 20 2a 70 57 69 74 68 20      With *pWith 
280b0 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28  = findRightmost(
280c0 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 69  p)->pWith;.    i
280d0 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b 0a 20  f( pWith!=0 ){. 
280e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
280f0 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74  rse->pWith==pWit
28100 68 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  h );.      pPars
28110 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
28120 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 7d 0a  ->pOuter;.    }.
28130 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66    }.}.#else.#def
28140 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74  ine selectPopWit
28150 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  h 0.#endif../*.*
28160 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
28170 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62  s a Walker callb
28180 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69  ack for "expandi
28190 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ng" a SELECT sta
281a0 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61  tement..** "Expa
281b0 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20  nding" means to 
281c0 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  do the following
281d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
281e0 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63  Make sure VDBE c
281f0 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
28200 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
28210 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20   to every.**    
28220 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20       element of 
28230 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
28240 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46  .**.**    (2)  F
28250 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c  ill in the pTabL
28260 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69  ist->a[].pTab fi
28270 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c  elds in the SrcL
28280 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20  ist that .**    
28290 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f       defines FRO
282a0 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20  M clause.  When 
282b0 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20  views appear in 
282c0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  the FROM clause,
282d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c  .**         fill
282e0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
282f0 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  Select with a co
28300 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
28310 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
28320 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65        that imple
28330 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20  ments the view. 
28340 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
28350 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45  of the view's SE
28360 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
28370 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61  statement so tha
28380 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20  t we can freely 
28390 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65  modify or delete
283a0 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a   that statement.
283b0 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f  **         witho
283c0 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75  ut worrying abou
283d0 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65  t messing up the
283e0 20 70 65 72 73 69 73 74 65 6e 74 20 72 65 70 72   persistent repr
283f0 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20  esentation.**   
28400 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65        of the vie
28410 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20  w..**.**    (3) 
28420 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68   Add terms to th
28430 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
28440 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68  o accommodate th
28450 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
28460 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20  d.**         on 
28470 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e  joins and the ON
28480 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
28490 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a  e of joins..**.*
284a0 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74  *    (4)  Scan t
284b0 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
284c0 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
284d0 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f   set (pEList) lo
284e0 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oking.**        
284f0 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f   for instances o
28500 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74  f the "*" operat
28510 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e  or or the TABLE.
28520 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20  * operator..**  
28530 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c         If found,
28540 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22   expand each "*"
28550 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
28560 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62  umn in every tab
28570 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e  le.**         an
28580 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20  d TABLE.* to be 
28590 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
285a0 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61  TABLE..**.*/.sta
285b0 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78  tic int selectEx
285c0 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70  pander(Walker *p
285d0 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
285e0 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
285f0 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
28600 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20  Parse;.  int i, 
28610 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20  j, k;.  SrcList 
28620 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70  *pTabList;.  Exp
28630 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
28640 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
28650 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73  item *pFrom;.  s
28660 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
28670 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
28680 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70  *pE, *pRight, *p
28690 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46  Expr;.  u16 selF
286a0 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
286b0 67 73 3b 0a 20 20 75 33 32 20 65 6c 69 73 74 46  gs;.  u32 elistF
286c0 6c 61 67 73 20 3d 20 30 3b 0a 0a 20 20 70 2d 3e  lags = 0;..  p->
286d0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45  selFlags |= SF_E
286e0 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64  xpanded;.  if( d
286f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
28700 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
28710 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  RC_Abort;.  }.  
28720 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21  assert( p->pSrc!
28730 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 73 65 6c  =0 );.  if( (sel
28740 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e  Flags & SF_Expan
28750 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ded)!=0 ){.    r
28760 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
28770 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20  .  }.  pTabList 
28780 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
28790 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
287a0 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68 50 75  .  sqlite3WithPu
287b0 73 68 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 57  sh(pParse, p->pW
287c0 69 74 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d  ith, 0);..  /* M
287d0 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20  ake sure cursor 
287e0 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
287f0 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  n assigned to al
28800 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a  l entries in.  *
28810 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
28820 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
28830 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
28840 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
28850 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
28860 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b  arse, pTabList);
28870 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
28880 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64  very table named
28890 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
288a0 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63  use of the selec
288b0 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  t.  If.  ** an e
288c0 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
288d0 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62   clause is a sub
288e0 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66  query instead of
288f0 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
28900 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61  ,.  ** then crea
28910 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  te a transient t
28920 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
28930 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73  o describe the s
28940 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  ubquery..  */.  
28950 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
28960 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
28970 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
28980 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
28990 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
289a0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
289b0 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 3d  >fg.isRecursive=
289c0 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61  =0 || pFrom->pTa
289d0 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b!=0 );.    if( 
289e0 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75  pFrom->fg.isRecu
289f0 72 73 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65  rsive ) continue
28a00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
28a10 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
28a20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28a30 4d 49 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20  MIT_CTE.    if( 
28a40 77 69 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b  withExpand(pWalk
28a50 65 72 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74  er, pFrom) ) ret
28a60 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
28a70 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54     if( pFrom->pT
28a80 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e  ab ) {} else.#en
28a90 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f  dif.    if( pFro
28aa0 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23  m->zName==0 ){.#
28ab0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28ac0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
28ad0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
28ae0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
28af0 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
28b00 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
28b10 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
28b20 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73  LECT */.      as
28b30 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b  sert( pSel!=0 );
28b40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
28b50 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
28b60 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
28b70 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
28b80 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29 20 72 65  lker, pSel) ) re
28b90 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
28ba0 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
28bb0 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
28bc0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
28bd0 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
28be0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
28bf0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
28c00 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70  C_Abort;.      p
28c10 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31  Tab->nTabRef = 1
28c20 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f  ;.      if( pFro
28c30 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
28c40 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
28c50 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
28c60 75 70 28 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41  up(db, pFrom->zA
28c70 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lias);.      }el
28c80 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62  se{.        pTab
28c90 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
28ca0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 75  3MPrintf(db, "su
28cb0 62 71 75 65 72 79 5f 25 70 22 2c 20 28 76 6f 69  bquery_%p", (voi
28cc0 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20  d*)pTab);.      
28cd0 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  }.      while( p
28ce0 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70  Sel->pPrior ){ p
28cf0 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
28d00 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69  or; }.      sqli
28d10 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
28d20 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
28d30 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61  Sel->pEList,&pTa
28d40 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61  b->nCol,&pTab->a
28d50 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Col);.      pTab
28d60 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
28d70 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f      pTab->nRowLo
28d80 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
28d90 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
28da0 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
28db0 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  );.      pTab->t
28dc0 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70  abFlags |= TF_Ep
28dd0 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a  hemeral;.#endif.
28de0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28df0 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
28e00 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
28e10 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
28e20 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
28e30 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
28e40 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
28e50 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
28e60 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
28e70 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
28e80 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20  e, 0, pFrom);.  
28e90 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
28ea0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
28eb0 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  rt;.      if( pT
28ec0 61 62 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66  ab->nTabRef>=0xf
28ed0 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73  fff ){.        s
28ee0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
28ef0 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
28f00 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c   references to \
28f10 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35  "%s\": max 65535
28f20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
28f30 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
28f40 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
28f50 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
28f60 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
28f70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61       }.      pTa
28f80 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20  b->nTabRef++;.  
28f90 20 20 20 20 69 66 28 20 21 49 73 56 69 72 74 75      if( !IsVirtu
28fa0 61 6c 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e  al(pTab) && cann
28fb0 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61  otBeFunction(pPa
28fc0 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20  rse, pFrom) ){. 
28fd0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
28fe0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
28ff0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
29000 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
29010 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c  || !defined (SQL
29020 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
29030 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28  TABLE).      if(
29040 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
29050 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
29060 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36  t ){.        i16
29070 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69   nCol;.        i
29080 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  f( sqlite3ViewGe
29090 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
290a0 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74  rse, pTab) ) ret
290b0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
290c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
290d0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  From->pSelect==0
290e0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f   );.        pFro
290f0 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
29100 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
29110 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c  , pTab->pSelect,
29120 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
29130 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d  ite3SelectSetNam
29140 65 28 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  e(pFrom->pSelect
29150 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
29160 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70          nCol = p
29170 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
29180 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20     pTab->nCol = 
29190 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  -1;.        sqli
291a0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
291b0 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53  alker, pFrom->pS
291c0 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
291d0 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  pTab->nCol = nCo
291e0 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  l;.      }.#endi
291f0 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
29200 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  Locate the index
29210 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e   named by the IN
29220 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
29230 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
29240 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
29250 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73  edByLookup(pPars
29260 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
29270 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
29280 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ort;.    }.  }..
29290 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
292a0 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
292b0 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
292c0 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
292d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
292e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
292f0 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
29300 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  in(pParse, p) ){
29310 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
29320 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Abort;.  }..  /*
29330 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
29340 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
29350 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
29360 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
29370 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
29380 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
29390 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
293a0 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
293b0 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
293c0 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
293d0 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
293e0 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
293f0 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
29400 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
29410 20 54 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70 65   TK_ASTERISK ope
29420 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
29430 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
29440 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20   in the column. 
29450 20 2a 2a 20 6c 69 73 74 2e 20 20 54 68 65 20 66   ** list.  The f
29460 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
29470 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
29480 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b   the TK_ASTERISK
29490 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
294a0 73 20 61 6e 64 20 65 78 70 61 6e 64 20 65 61 63  s and expand eac
294b0 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
294c0 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
294d0 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62   in.  ** all tab
294e0 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
294f0 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
29500 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
29510 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
29520 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
29530 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
29540 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
29550 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
29560 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
29570 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74  .    pE = pEList
29580 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
29590 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
295a0 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65 61  _ASTERISK ) brea
295b0 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  k;.    assert( p
295c0 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
295d0 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29   pE->pRight!=0 )
295e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
295f0 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
29600 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26  (pE->pLeft!=0 &&
29610 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
29620 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66  TK_ID) );.    if
29630 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
29640 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   && pE->pRight->
29650 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20  op==TK_ASTERISK 
29660 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 65 6c 69  ) break;.    eli
29670 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66  stFlags |= pE->f
29680 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lags;.  }.  if( 
29690 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
296a0 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
296b0 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
296c0 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
296d0 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
296e0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
296f0 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
29700 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
29710 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
29720 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
29730 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
29740 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
29750 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
29760 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
29770 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
29780 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
29790 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
297a0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
297b0 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  w = 0;.    int f
297c0 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64  lags = pParse->d
297d0 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e  b->flags;.    in
297e0 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66  t longNames = (f
297f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
29800 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20  llColNames)!=0. 
29810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29820 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26       && (flags &
29830 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
29840 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20  Names)==0;..    
29850 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
29860 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
29870 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e        pE = a[k].
29880 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6c 69  pExpr;.      eli
29890 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66  stFlags |= pE->f
298a0 6c 61 67 73 3b 0a 20 20 20 20 20 20 70 52 69 67  lags;.      pRig
298b0 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b  ht = pE->pRight;
298c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
298d0 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
298e0 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
298f0 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
29900 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20  TK_ASTERISK.    
29910 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54     && (pE->op!=T
29920 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d  K_DOT || pRight-
29930 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op!=TK_ASTERISK
29940 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
29950 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
29960 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
29970 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
29980 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
29990 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
299a0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
299b0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
299c0 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b  Parse, pNew, a[k
299d0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
299e0 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
299f0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
29a00 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
29a10 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
29a20 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e;.          pNe
29a30 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
29a40 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d  -1].zSpan = a[k]
29a50 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20  .zSpan;.        
29a60 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
29a70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
29a80 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20  .zSpan = 0;.    
29a90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b      }.        a[
29aa0 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  k].pExpr = 0;.  
29ab0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29ac0 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
29ad0 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
29ae0 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
29af0 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
29b00 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
29b10 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
29b20 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
29b30 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
29b40 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
29b50 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
29b60 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30  char *zTName = 0
29b70 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20  ;       /* text 
29b80 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
29b90 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
29ba0 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pE->op==TK_DOT )
29bb0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
29bc0 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30  rt( pE->pLeft!=0
29bd0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
29be0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
29bf0 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74  operty(pE->pLeft
29c00 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
29c10 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  ;.          zTNa
29c20 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  me = pE->pLeft->
29c30 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
29c40 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
29c50 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
29c60 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
29c70 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
29c80 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  From++){.       
29c90 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
29ca0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
29cb0 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
29cc0 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSub = pFrom->pS
29cd0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20  elect;.         
29ce0 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
29cf0 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b  = pFrom->zAlias;
29d00 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
29d10 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61   char *zSchemaNa
29d20 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
29d30 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
29d40 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
29d50 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
29d60 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
29d70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
29d80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29d90 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
29da0 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
29db0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
29dc0 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e  ub==0 || (pSub->
29dd0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
29de0 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a  stedFrom)==0 ){.
29df0 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
29e00 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
29e10 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
29e20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
29e30 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29  TName, zTabName)
29e40 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
29e50 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
29e60 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
29e70 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73           iDb = s
29e80 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
29e90 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
29ea0 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
29eb0 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20      zSchemaName 
29ec0 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61  = iDb>=0 ? db->a
29ed0 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
29ee0 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20   : "*";.        
29ef0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f    }.          fo
29f00 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
29f10 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
29f20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
29f30 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
29f40 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
29f50 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
29f60 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f  name;  /* The co
29f70 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
29f80 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  me */.          
29f90 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b    char *zToFree;
29fa0 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73     /* Malloced s
29fb0 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73  tring that needs
29fc0 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
29fd0 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65              Toke
29fe0 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20  n sColname;  /* 
29ff0 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  Computed column 
2a000 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20  name as a token 
2a010 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  */..            
2a020 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b  assert( zName );
2a030 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2a040 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a   zTName && pSub.
2a050 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
2a060 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e  sqlite3MatchSpan
2a070 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73  Name(pSub->pELis
2a080 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30  t->a[j].zSpan, 0
2a090 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a  , zTName, 0)==0.
2a0a0 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
2a0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
2a0c0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2a0d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
2a0e0 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e    /* If a column
2a0f0 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68   is marked as 'h
2a100 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20  idden', omit it 
2a110 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65  from the expande
2a120 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
2a130 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74   result-set list
2a140 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45   unless the SELE
2a150 43 54 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e  CT has the SF_In
2a160 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20  cludeHidden.    
2a170 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73          ** bit s
2a180 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  et..            
2a190 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
2a1a0 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
2a1b0 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64  & SF_IncludeHidd
2a1c0 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  en)==0.         
2a1d0 20 20 20 20 26 26 20 49 73 48 69 64 64 65 6e 43      && IsHiddenC
2a1e0 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
2a1f0 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20  l[j]) .         
2a200 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2a210 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2a220 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a230 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65          tableSee
2a240 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  n = 1;..        
2a250 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a      if( i>0 && z
2a260 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  TName==0 ){.    
2a270 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
2a280 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  From->fg.jointyp
2a290 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
2a2a0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
2a2b0 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f     && tableAndCo
2a2c0 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69  lumnIndex(pTabLi
2a2d0 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c  st, i, zName, 0,
2a2e0 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   0).            
2a2f0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
2a300 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
2a310 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
2a320 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
2a330 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
2a340 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
2a350 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  ble to the right
2a360 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
2a370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a380 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2a390 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a3a0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2a3b0 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
2a3c0 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e  From->pUsing, zN
2a3d0 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
2a3e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2a3f0 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
2a400 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
2a410 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
2a420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a430 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
2a440 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
2a450 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
2a460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a470 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2a480 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a490 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a4a0 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
2a4b0 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
2a4c0 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  _ID, zName);.   
2a4d0 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
2a4e0 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  e = zName;.     
2a4f0 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
2a500 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
2a510 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  if( longNames ||
2a520 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
2a530 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
2a540 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a     Expr *pLeft;.
2a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
2a560 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
2a570 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61  r(db, TK_ID, zTa
2a580 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
2a590 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
2a5a0 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
2a5b0 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
2a5c0 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
2a5d0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63           if( zSc
2a5e0 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20  hemaName ){.    
2a5f0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
2a600 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
2a610 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65  db, TK_ID, zSche
2a620 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  maName);.       
2a630 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
2a640 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2a650 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
2a660 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  eft, pExpr);.   
2a670 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2a680 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
2a690 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
2a6a0 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
2a6b0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
2a6c0 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
2a6d0 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
2a6e0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
2a6f0 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
2a700 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
2a710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a720 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a730 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
2a740 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
2a750 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a760 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
2a770 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
2a780 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
2a790 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
2a7a0 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49     sqlite3TokenI
2a7b0 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a  nit(&sColname, z
2a7c0 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
2a7d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2a7e0 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
2a7f0 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c  rse, pNew, &sCol
2a800 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
2a810 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
2a820 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
2a830 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21   SF_NestedFrom)!
2a840 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2a850 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
2a860 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26  ist_item *pX = &
2a870 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
2a880 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  xpr-1];.        
2a890 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20 29        if( pSub )
2a8a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2a8b0 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
2a8c0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
2a8d0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
2a8e0 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[j].zSpan);.   
2a8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2a900 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
2a910 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
2a920 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a930 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
2a940 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d  zSpan = sqlite3M
2a950 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
2a960 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  s.%s",.         
2a970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a990 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a    zSchemaName, z
2a9a0 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d  TabName, zColnam
2a9b0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2a9c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
2a9d0 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
2a9e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2a9f0 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
2aa00 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a  bSpanIsTab = 1;.
2aa10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2aa20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2aa30 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46  3DbFree(db, zToF
2aa40 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
2aa50 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2aa60 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
2aa70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
2aa80 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
2aa90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2aaa0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2aab0 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
2aac0 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
2aad0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2aae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2aaf0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2ab00 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
2ab10 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
2ab20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ab30 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2ab40 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2ab50 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2ab60 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
2ab70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
2ab80 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  }.  if( p->pELis
2ab90 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  t ){.    if( p->
2aba0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62  pEList->nExpr>db
2abb0 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
2abc0 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
2abd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
2abe0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2abf0 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
2ac00 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29   in result set")
2ac10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
2ac20 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
2ac30 20 20 20 20 69 66 28 20 28 65 6c 69 73 74 46 6c      if( (elistFl
2ac40 61 67 73 20 26 20 28 45 50 5f 48 61 73 46 75 6e  ags & (EP_HasFun
2ac50 63 7c 45 50 5f 53 75 62 71 75 65 72 79 29 29 21  c|EP_Subquery))!
2ac60 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =0 ){.      p->s
2ac70 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f  elFlags |= SF_Co
2ac80 6d 70 6c 65 78 52 65 73 75 6c 74 3b 0a 20 20 20  mplexResult;.   
2ac90 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2aca0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2acb0 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75  ./*.** No-op rou
2acc0 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72  tine for the par
2acd0 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a  se-tree walker..
2ace0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
2acf0 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 57  routine is the W
2ad00 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
2ad10 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73  ack then express
2ad20 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65  ion trees.** are
2ad30 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20   walked without 
2ad40 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e  any actions bein
2ad50 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20  g taken at each 
2ad60 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c  node.  Presumabl
2ad70 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  y,.** when this 
2ad80 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
2ad90 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72  for Walker.xExpr
2ada0 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a  Callback then .*
2adb0 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  * Walker.xSelect
2adc0 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20  Callback is set 
2add0 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
2ade0 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79  useful for every
2adf0 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e   .** subquery in
2ae00 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65   the parser tree
2ae10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2ae20 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c  ExprWalkNoop(Wal
2ae30 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78  ker *NotUsed, Ex
2ae40 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20  pr *NotUsed2){. 
2ae50 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2ae60 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
2ae70 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
2ae80 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2ae90 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75  ./*.** No-op rou
2aea0 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72  tine for the par
2aeb0 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 20 66  se-tree walker f
2aec0 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
2aed0 65 6e 74 73 2e 0a 2a 2a 20 73 75 62 71 75 65 72  ents..** subquer
2aee0 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20  y in the parser 
2aef0 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tree..*/.int sql
2af00 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f  ite3SelectWalkNo
2af10 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  op(Walker *NotUs
2af20 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  ed, Select *NotU
2af30 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
2af40 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
2af50 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
2af60 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2af70 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  inue;.}..#if SQL
2af80 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
2af90 41 6c 77 61 79 73 20 61 73 73 65 72 74 2e 20 20  Always assert.  
2afa0 54 68 69 73 20 78 53 65 6c 65 63 74 43 61 6c 6c  This xSelectCall
2afb0 62 61 63 6b 32 20 69 6d 70 6c 65 6d 65 6e 74 61  back2 implementa
2afc0 74 69 6f 6e 20 70 72 6f 76 65 73 20 74 68 61 74  tion proves that
2afd0 20 74 68 65 0a 2a 2a 20 78 53 65 6c 65 63 74 43   the.** xSelectC
2afe0 61 6c 6c 62 61 63 6b 32 20 69 73 20 6e 65 76 65  allback2 is neve
2aff0 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 76 6f  r invoked..*/.vo
2b000 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
2b010 57 61 6c 6b 41 73 73 65 72 74 32 28 57 61 6c 6b  WalkAssert2(Walk
2b020 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c  er *NotUsed, Sel
2b030 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  ect *NotUsed2){.
2b040 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2b050 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
2b060 55 73 65 64 32 29 3b 0a 20 20 61 73 73 65 72 74  Used2);.  assert
2b070 28 20 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ( 0 );.}.#endif.
2b080 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2b090 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20 53  ne "expands" a S
2b0a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
2b0b0 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
2b0c0 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f  ubqueries..** Fo
2b0d0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
2b0e0 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74  ormation on what
2b0f0 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78   it means to "ex
2b100 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a  pand" a SELECT.*
2b110 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65  * statement, see
2b120 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
2b130 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64  the selectExpand
2b140 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b   worker callback
2b150 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78   above..**.** Ex
2b160 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54  panding a SELECT
2b170 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68   statement is th
2b180 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e 20  e first step in 
2b190 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20  processing a.** 
2b1a0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2b1b0 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  .  The SELECT st
2b1c0 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  atement must be 
2b1d0 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a  expanded before.
2b1e0 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  ** name resoluti
2b1f0 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  on is performed.
2b200 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69  .**.** If anythi
2b210 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61  ng goes wrong, a
2b220 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2b230 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2b240 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63  pParse..** The c
2b250 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
2b260 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20 70  can detect the p
2b270 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e  roblem by lookin
2b280 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72  g at pParse->nEr
2b290 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72  r.** and/or pPar
2b2a0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
2b2b0 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iled..*/.static 
2b2c0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
2b2d0 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a  ctExpand(Parse *
2b2e0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2b2f0 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b  pSelect){.  Walk
2b300 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43  er w;.  w.xExprC
2b310 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
2b320 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  3ExprWalkNoop;. 
2b330 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
2b340 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f  se;.  if( OK_IF_
2b350 41 4c 57 41 59 53 5f 54 52 55 45 28 70 50 61 72  ALWAYS_TRUE(pPar
2b360 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 29  se->hasCompound)
2b370 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63   ){.    w.xSelec
2b380 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76  tCallback = conv
2b390 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
2b3a0 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20  tToSubquery;.   
2b3b0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2b3c0 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ck2 = 0;.    sql
2b3d0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
2b3e0 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  w, pSelect);.  }
2b3f0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2b400 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70  back = selectExp
2b410 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65  ander;.  w.xSele
2b420 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65  ctCallback2 = se
2b430 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 73  lectPopWith;.  s
2b440 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
2b450 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d  (&w, pSelect);.}
2b460 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
2b470 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
2b480 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
2b490 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
2b4a0 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20  llback callback 
2b4b0 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53  for the sqlite3S
2b4c0 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a  electTypeInfo().
2b4d0 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  ** interface..**
2b4e0 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f  .** For each FRO
2b4f0 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
2b500 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54  y, add Column.zT
2b510 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a  ype and Column.z
2b520 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  Coll.** informat
2b530 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ion to the Table
2b540 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2b550 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
2b560 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20  esult set.** of 
2b570 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a  that subquery..*
2b580 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
2b590 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
2b5a0 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
2b5b0 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73  ult set was cons
2b5c0 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65  tructed.** by se
2b5d0 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62  lectExpander() b
2b5e0 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ut the type and 
2b5f0 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
2b600 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65  ation was omitte
2b610 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69  d.** at that poi
2b620 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74  nt because ident
2b630 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79  ifiers had not y
2b640 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  et been resolved
2b650 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
2b660 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
2b670 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65  er identifier re
2b680 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
2b690 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
2b6a0 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
2b6b0 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  fo(Walker *pWalk
2b6c0 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
2b6d0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
2b6e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c  .  int i;.  SrcL
2b6f0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
2b700 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2b710 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20  item *pFrom;..  
2b720 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
2b730 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
2b740 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  d );.  assert( (
2b750 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2b760 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30  _HasTypeInfo)==0
2b770 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   );.  p->selFlag
2b780 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49  s |= SF_HasTypeI
2b790 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20  nfo;.  pParse = 
2b7a0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
2b7b0 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
2b7c0 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >pSrc;.  for(i=0
2b7d0 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
2b7e0 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
2b7f0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
2b800 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
2b810 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
2b820 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
2b830 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
2b840 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
2b850 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
2b860 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
2b870 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
2b880 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2b890 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
2b8a0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
2b8b0 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
2b8c0 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20  lect;.      if( 
2b8d0 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pSel ){.        
2b8e0 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
2b8f0 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65  ior ) pSel = pSe
2b900 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  l->pPrior;.     
2b910 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2b920 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
2b930 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
2b940 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20  , pTab, pSel);. 
2b950 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2b960 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
2b970 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
2b980 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64  dds datatype and
2b990 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
2b9a0 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nce information 
2b9b0 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20  to.** the Table 
2b9c0 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c  structures of al
2b9d0 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
2b9e0 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a  bqueries in a.**
2b9f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2ba00 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69  t..**.** Use thi
2ba10 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  s routine after 
2ba20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
2ba30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2ba40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
2ba50 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a  TypeInfo(Parse *
2ba60 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2ba70 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65  pSelect){.#ifnde
2ba80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
2ba90 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20  BQUERY.  Walker 
2baa0 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  w;.  w.xSelectCa
2bab0 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
2bac0 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a  SelectWalkNoop;.
2bad0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2bae0 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64  ack2 = selectAdd
2baf0 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
2bb00 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
2bb10 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ack = sqlite3Exp
2bb20 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
2bb30 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2bb40 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
2bb50 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
2bb60 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
2bb70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2bb80 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54  sets up a SELECT
2bb90 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70   statement for p
2bba0 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a  rocessing.  The.
2bbb0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
2bbc0 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a  accomplished:.**
2bbd0 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20  .**     *  VDBE 
2bbe0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61  Cursor numbers a
2bbf0 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  re assigned to a
2bc00 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74  ll FROM-clause t
2bc10 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  erms..**     *  
2bc20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  Ephemeral Table 
2bc30 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
2bc40 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d  ted for all FROM
2bc50 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
2bc60 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e  es..**     *  ON
2bc70 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
2bc80 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69  es are shifted i
2bc90 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d  nto WHERE statem
2bca0 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57  ents.**     *  W
2bcb0 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64  ildcards "*" and
2bcc0 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65   "TABLE.*" in re
2bcd0 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78  sult sets are ex
2bce0 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a  panded..**     *
2bcf0 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e    Identifiers in
2bd00 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20   expression are 
2bd10 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65  matched to table
2bd20 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
2bd30 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72  utine acts recur
2bd40 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75  sively on all su
2bd50 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20  bqueries within 
2bd60 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
2bd70 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
2bd80 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a  tPrep(.  Parse *
2bd90 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2bda0 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
2bdb0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
2bdc0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
2bdd0 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
2bde0 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
2bdf0 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65  coded. */.  Name
2be00 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
2be10 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65  C  /* Name conte
2be20 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72  xt for container
2be30 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
2be40 20 70 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p!=0 || pParse-
2be50 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2be60 64 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  d );.  if( pPars
2be70 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
2be80 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
2be90 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
2bea0 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
2beb0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
2bec0 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
2bed0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69  (pParse, p);.  i
2bee0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2bef0 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
2bf00 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
2bf10 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52  turn;.  sqlite3R
2bf20 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65  esolveSelectName
2bf30 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75  s(pParse, p, pOu
2bf40 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50  terNC);.  if( pP
2bf50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50  arse->nErr || pP
2bf60 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
2bf70 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
2bf80 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
2bf90 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72  AddTypeInfo(pPar
2bfa0 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  se, p);.}../*.**
2bfb0 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65   Reset the aggre
2bfc0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
2bfd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72  ..**.** The aggr
2bfe0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
2bff0 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65  r is a set of me
2c000 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20  mory cells that 
2c010 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64  hold.** intermed
2c020 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69  iate results whi
2c030 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61  le calculating a
2c040 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68  n aggregate.  Th
2c050 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  is.** routine ge
2c060 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61  nerates code tha
2c070 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69  t stores NULLs i
2c080 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d  n all of those m
2c090 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a  emory.** cells..
2c0a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
2c0b0 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
2c0c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
2c0d0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
2c0e0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
2c0f0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
2c100 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
2c110 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
2c120 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20  unc;.  int nReg 
2c130 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  = pAggInfo->nFun
2c140 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  c + pAggInfo->nC
2c150 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65  olumn;.  if( nRe
2c160 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23  g==0 ) return;.#
2c170 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2c180 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
2c190 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20  hat all AggInfo 
2c1a0 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77 69  registers are wi
2c1b0 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73  thin the range s
2c1c0 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a  pecified by.  **
2c1d0 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e   AggInfo.mnReg..
2c1e0 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f  AggInfo.mxReg */
2c1f0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d  .  assert( nReg=
2c200 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
2c210 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  -pAggInfo->mnReg
2c220 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  +1 );.  for(i=0;
2c230 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   i<pAggInfo->nCo
2c240 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
2c250 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
2c260 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d  ->aCol[i].iMem>=
2c270 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
2c280 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
2c290 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
2c2a0 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  em<=pAggInfo->mx
2c2b0 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  Reg );.  }.  for
2c2c0 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
2c2d0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  ->nFunc; i++){. 
2c2e0 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49     assert( pAggI
2c2f0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d  nfo->aFunc[i].iM
2c300 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  em>=pAggInfo->mn
2c310 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
2c320 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2c330 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66  i].iMem<=pAggInf
2c340 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a  o->mxReg );.  }.
2c350 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
2c360 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2c370 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e  _Null, 0, pAggIn
2c380 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49  fo->mnReg, pAggI
2c390 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66  nfo->mxReg);.  f
2c3a0 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66  or(pFunc=pAggInf
2c3b0 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69  o->aFunc, i=0; i
2c3c0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2c3d0 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b  ; i++, pFunc++){
2c3e0 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
2c3f0 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
2c400 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
2c410 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
2c420 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2c430 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2c440 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2c450 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
2c460 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
2c470 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  E->x.pList->nExp
2c480 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r!=1 ){.        
2c490 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2c4a0 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
2c4b0 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73  T aggregates mus
2c4c0 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
2c4d0 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ne ".           
2c4e0 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20  "argument");.   
2c4f0 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
2c500 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
2c510 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c520 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
2c530 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
2c540 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
2c550 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c   pE->x.pList, 0,
2c560 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
2c570 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2c580 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
2c590 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  al, pFunc->iDist
2c5a0 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  inct, 0, 0,.    
2c5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5c0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
2c5d0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
2c5e0 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
2c5f0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
2c600 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67  nvoke the OP_Agg
2c610 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20  Finalize opcode 
2c620 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67  for every aggreg
2c630 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
2c640 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  in the AggInfo s
2c650 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
2c660 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a  tic void finaliz
2c670 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61  eAggFunctions(Pa
2c680 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
2c690 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
2c6a0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
2c6b0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
2c6c0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
2c6d0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
2c6e0 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
2c6f0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
2c700 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2c710 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
2c720 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
2c730 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
2c740 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
2c750 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2c760 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
2c770 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2c780 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2c790 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67  AddOp2(v, OP_Agg
2c7a0 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c  Final, pF->iMem,
2c7b0 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
2c7c0 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20  nExpr : 0);.    
2c7d0 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
2c7e0 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63  dP4(v, pF->pFunc
2c7f0 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
2c800 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
2c810 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
2c820 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
2c830 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
2c840 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
2c850 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
2c860 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
2c870 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
2c880 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
2c890 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
2c8a0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
2c8b0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
2c8c0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
2c8d0 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d  ;.  int regHit =
2c8e0 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69   0;.  int addrHi
2c8f0 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72  tTest = 0;.  str
2c900 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
2c910 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41   *pF;.  struct A
2c920 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a  ggInfo_col *pC;.
2c930 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
2c940 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66  ectMode = 1;.  f
2c950 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
2c960 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
2c970 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
2c980 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69  ++, pF++){.    i
2c990 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74  nt nArg;.    int
2c9a0 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20   addrNext = 0;. 
2c9b0 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20     int regAgg;. 
2c9c0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
2c9d0 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
2c9e0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
2c9f0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2ca00 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
2ca10 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
2ca20 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
2ca30 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  ){.      nArg = 
2ca40 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
2ca50 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c      regAgg = sql
2ca60 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
2ca70 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a  (pParse, nArg);.
2ca80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2ca90 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
2caa0 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67  arse, pList, reg
2cab0 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45  Agg, 0, SQLITE_E
2cac0 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65  CEL_DUP);.    }e
2cad0 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  lse{.      nArg 
2cae0 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67  = 0;.      regAg
2caf0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 0;.    }.   
2cb00 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e   if( pF->iDistin
2cb10 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ct>=0 ){.      a
2cb20 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65  ddrNext = sqlite
2cb30 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2cb40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2cb50 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f  e( nArg==0 );  /
2cb60 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  * Error conditio
2cb70 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  n */.      testc
2cb80 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b 20 20  ase( nArg>1 );  
2cb90 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f   /* Also an erro
2cba0 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 44  r */.      codeD
2cbb0 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
2cbc0 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61  pF->iDistinct, a
2cbd0 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41  ddrNext, 1, regA
2cbe0 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gg);.    }.    i
2cbf0 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75  f( pF->pFunc->fu
2cc00 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
2cc10 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
2cc20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
2cc30 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
2cc40 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2cc50 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
2cc60 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
2cc70 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
2cc80 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21  =0 );  /* pList!
2cc90 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20  =0 if pF->pFunc 
2cca0 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a  has NEEDCOLL */.
2ccb0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
2ccc0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21  Item=pList->a; !
2ccd0 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b  pColl && j<nArg;
2cce0 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
2ccf0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
2cd00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
2cd10 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
2cd20 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
2cd30 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  }.      if( !pCo
2cd40 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
2cd50 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
2cd60 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
2cd70 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2cd80 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67  egHit==0 && pAgg
2cd90 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
2cda0 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b  or ) regHit = ++
2cdb0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2cdc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2cdd0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
2cde0 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20  Seq, regHit, 0, 
2cdf0 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
2ce00 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
2ce10 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2ce20 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2ce30 5f 41 67 67 53 74 65 70 30 2c 20 30 2c 20 72 65  _AggStep0, 0, re
2ce40 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b  gAgg, pF->iMem);
2ce50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2ce60 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e  AppendP4(v, pF->
2ce70 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
2ce80 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
2ce90 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
2cea0 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  u8)nArg);.    sq
2ceb0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
2cec0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
2ced0 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
2cee0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  g);.    sqlite3R
2cef0 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
2cf00 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
2cf10 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61  nArg);.    if( a
2cf20 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ddrNext ){.     
2cf30 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2cf40 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
2cf50 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Next);.      sql
2cf60 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2cf70 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
2cf80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  }.  }..  /* Befo
2cf90 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68  re populating th
2cfa0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
2cfb0 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74  gisters, clear t
2cfc0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
2cfd0 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
2cfe0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72   if any of the r
2cff0 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76  equired column v
2d000 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61 64  alues are alread
2d010 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20  y present .  ** 
2d020 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73 71  in registers, sq
2d030 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20  lite3ExprCode() 
2d040 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79  may use OP_SCopy
2d050 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c   to copy the val
2d060 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69  ue.  ** to pC->i
2d070 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20  Mem. But by the 
2d080 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69  time the value i
2d090 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67  s used, the orig
2d0a0 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20  inal register.  
2d0b0 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ** may have been
2d0c0 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74   used, invalidat
2d0d0 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ing the underlyi
2d0e0 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e  ng buffer holdin
2d0f0 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20  g the.  ** text 
2d100 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53  or blob value. S
2d110 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33  ee ticket [88303
2d120 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  4dcb5]..  **.  *
2d130 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69  * Another soluti
2d140 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63  on would be to c
2d150 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f  hange the OP_SCo
2d160 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20  py used to copy 
2d170 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75  cached.  ** valu
2d180 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79  es to an OP_Copy
2d190 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67  ..  */.  if( reg
2d1a0 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48  Hit ){.    addrH
2d1b0 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  itTest = sqlite3
2d1c0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2d1d0 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64  _If, regHit); Vd
2d1e0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2d1f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
2d200 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
2d210 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  e);.  for(i=0, p
2d220 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  C=pAggInfo->aCol
2d230 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41  ; i<pAggInfo->nA
2d240 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c  ccumulator; i++,
2d250 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   pC++){.    sqli
2d260 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
2d270 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70  se, pC->pExpr, p
2d280 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  C->iMem);.  }.  
2d290 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
2d2a0 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Mode = 0;.  sqli
2d2b0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2d2c0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  r(pParse);.  if(
2d2d0 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a   addrHitTest ){.
2d2e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2d2f0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48  umpHere(v, addrH
2d300 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  itTest);.  }.}..
2d310 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
2d320 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  le OP_Explain in
2d330 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
2d340 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e   VDBE to explain
2d350 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75   a simple.** cou
2d360 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45  nt(*) query ("SE
2d370 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2d380 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69  OM pTab")..*/.#i
2d390 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2d3a0 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63  T_EXPLAIN.static
2d3b0 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d   void explainSim
2d3c0 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73  pleCount(.  Pars
2d3d0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2d3e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2d3f0 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
2d400 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
2d410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d420 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
2d430 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e   queried */.  In
2d440 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
2d450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d460 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f   Index used to o
2d470 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72  ptimize scan, or
2d480 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66   NULL */.){.  if
2d490 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
2d4a0 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  n==2 ){.    int 
2d4b0 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d  bCover = (pIdx!=
2d4c0 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70  0 && (HasRowid(p
2d4d0 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61  Tab) || !IsPrima
2d4e0 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
2d4f0 29 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  ));.    char *zE
2d500 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  qp = sqlite3MPri
2d510 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
2d520 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73  "SCAN TABLE %s%s
2d530 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
2d540 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
2d550 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49    bCover ? " USI
2d560 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
2d570 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20  X " : "",.      
2d580 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d    bCover ? pIdx-
2d590 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20  >zName : "".    
2d5a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2d5b0 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20  beAddOp4(.      
2d5c0 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c    pParse->pVdbe,
2d5d0 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
2d5e0 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
2d5f0 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44  0, 0, zEqp, P4_D
2d600 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20  YNAMIC.    );.  
2d610 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
2d620 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  ne explainSimple
2d630 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e  Count(a,b,c).#en
2d640 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  dif../*.** sqlit
2d650 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61 6c  e3WalkExpr() cal
2d660 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 68 61  lback used by ha
2d670 76 69 6e 67 54 6f 57 68 65 72 65 28 29 2e 0a 2a  vingToWhere()..*
2d680 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 64 65  *.** If the node
2d690 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 63   passed to the c
2d6a0 61 6c 6c 62 61 63 6b 20 69 73 20 61 20 54 4b 5f  allback is a TK_
2d6b0 41 4e 44 20 6e 6f 64 65 2c 20 72 65 74 75 72 6e  AND node, return
2d6c0 20 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74 69 6e 75   .** WRC_Continu
2d6d0 65 20 74 6f 20 74 65 6c 6c 20 73 71 6c 69 74 65  e to tell sqlite
2d6e0 33 57 61 6c 6b 45 78 70 72 28 29 20 74 6f 20 69  3WalkExpr() to i
2d6f0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 63  terate through c
2d700 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a  hild nodes..**.*
2d710 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
2d720 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 2e 20 49  urn WRC_Prune. I
2d730 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c 73  n this case, als
2d740 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 0a  o check if the .
2d750 2a 2a 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f  ** sub-expressio
2d760 6e 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 72  n matches the cr
2d770 69 74 65 72 69 61 20 66 6f 72 20 62 65 69 6e 67  iteria for being
2d780 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 57 48   moved to the WH
2d790 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 49  ERE.** clause. I
2d7a0 66 20 73 6f 2c 20 61 64 64 20 69 74 20 74 6f 20  f so, add it to 
2d7b0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2d7c0 20 61 6e 64 20 72 65 70 6c 61 63 65 20 74 68 65   and replace the
2d7d0 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e 0a   sub-expression.
2d7e0 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 48 41  ** within the HA
2d7f0 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20  VING expression 
2d800 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20  with a constant 
2d810 22 31 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  "1"..*/.static i
2d820 6e 74 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65  nt havingToWhere
2d830 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a 70  ExprCb(Walker *p
2d840 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
2d850 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70  xpr){.  if( pExp
2d860 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20 29 7b  r->op!=TK_AND ){
2d870 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20  .    Select *pS 
2d880 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65  = pWalker->u.pSe
2d890 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20 73 71  lect;.    if( sq
2d8a0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
2d8b0 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 70 57 61  antOrGroupBy(pWa
2d8c0 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 45  lker->pParse, pE
2d8d0 78 70 72 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42  xpr, pS->pGroupB
2d8e0 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  y) ){.      sqli
2d8f0 74 65 33 20 2a 64 62 20 3d 20 70 57 61 6c 6b 65  te3 *db = pWalke
2d900 72 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  r->pParse->db;. 
2d910 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
2d920 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
2d930 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  oc(db, TK_INTEGE
2d940 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f  R, &sqlite3IntTo
2d950 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 20  kens[1], 0);.   
2d960 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
2d970 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 57 68         Expr *pWh
2d980 65 72 65 20 3d 20 70 53 2d 3e 70 57 68 65 72 65  ere = pS->pWhere
2d990 3b 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 45  ;.        SWAP(E
2d9a0 78 70 72 2c 20 2a 70 4e 65 77 2c 20 2a 70 45 78  xpr, *pNew, *pEx
2d9b0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  pr);.        pNe
2d9c0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  w = sqlite3ExprA
2d9d0 6e 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70  nd(db, pWhere, p
2d9e0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 53  New);.        pS
2d9f0 2d 3e 70 57 68 65 72 65 20 3d 20 70 4e 65 77 3b  ->pWhere = pNew;
2da00 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72  .        pWalker
2da10 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ->eCode = 1;.   
2da20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
2da30 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2da40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2da50 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2da60 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 6c  *.** Transfer el
2da70 69 67 69 62 6c 65 20 74 65 72 6d 73 20 66 72 6f  igible terms fro
2da80 6d 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61  m the HAVING cla
2da90 75 73 65 20 6f 66 20 61 20 71 75 65 72 79 2c 20  use of a query, 
2daa0 77 68 69 63 68 20 69 73 0a 2a 2a 20 70 72 6f 63  which is.** proc
2dab0 65 73 73 65 64 20 61 66 74 65 72 20 67 72 6f 75  essed after grou
2dac0 70 69 6e 67 2c 20 74 6f 20 74 68 65 20 57 48 45  ping, to the WHE
2dad0 52 45 20 63 6c 61 75 73 65 2c 20 77 68 69 63 68  RE clause, which
2dae0 20 69 73 20 70 72 6f 63 65 73 73 65 64 20 62 65   is processed be
2daf0 66 6f 72 65 0a 2a 2a 20 67 72 6f 75 70 69 6e 67  fore.** grouping
2db00 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  . For example, t
2db10 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
2db20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2db30 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20 61  <tables> WHERE a
2db40 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48 41  =? GROUP BY b HA
2db50 56 49 4e 47 20 62 3d 3f 20 41 4e 44 20 63 3d 3f  VING b=? AND c=?
2db60 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 20 72 65  .**.** can be re
2db70 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
2db80 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
2db90 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45  M <tables> WHERE
2dba0 20 61 3d 3f 20 41 4e 44 20 62 3d 3f 20 47 52 4f   a=? AND b=? GRO
2dbb0 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 63  UP BY b HAVING c
2dbc0 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20 74 65 72 6d 20  =?.**.** A term 
2dbd0 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 65 78  of the HAVING ex
2dbe0 70 72 65 73 73 69 6f 6e 20 69 73 20 65 6c 69 67  pression is elig
2dbf0 69 62 6c 65 20 66 6f 72 20 74 72 61 6e 73 66 65  ible for transfe
2dc00 72 20 69 66 20 69 74 20 63 6f 6e 73 69 73 74 73  r if it consists
2dc10 0a 2a 2a 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  .** entirely of 
2dc20 63 6f 6e 73 74 61 6e 74 73 20 61 6e 64 20 65 78  constants and ex
2dc30 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
2dc40 72 65 20 61 6c 73 6f 20 47 52 4f 55 50 20 42 59  re also GROUP BY
2dc50 20 74 65 72 6d 73 20 74 68 61 74 0a 2a 2a 20 75   terms that.** u
2dc60 73 65 20 74 68 65 20 22 42 49 4e 41 52 59 22 20  se the "BINARY" 
2dc70 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
2dc80 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ce..*/.static vo
2dc90 69 64 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65  id havingToWhere
2dca0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2dcb0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 57 61  Select *p){.  Wa
2dcc0 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20  lker sWalker;.  
2dcd0 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b 65 72 2c  memset(&sWalker,
2dce0 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 61 6c 6b   0, sizeof(sWalk
2dcf0 65 72 29 29 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  er));.  sWalker.
2dd00 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
2dd10 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72  .  sWalker.xExpr
2dd20 43 61 6c 6c 62 61 63 6b 20 3d 20 68 61 76 69 6e  Callback = havin
2dd30 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 3b 0a  gToWhereExprCb;.
2dd40 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70 53 65 6c    sWalker.u.pSel
2dd50 65 63 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74  ect = p;.  sqlit
2dd60 65 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c  e3WalkExpr(&sWal
2dd70 6b 65 72 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  ker, p->pHaving)
2dd80 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
2dd90 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
2dda0 73 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 26 26  sWalker.eCode &&
2ddb0 20 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54   (sqlite3SelectT
2ddc0 72 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30  race & 0x100)!=0
2ddd0 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
2dde0 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
2ddf0 2c 70 2c 28 22 4d 6f 76 65 20 48 41 56 49 4e 47  ,p,("Move HAVING
2de00 20 74 65 72 6d 73 20 69 6e 74 6f 20 57 48 45 52   terms into WHER
2de10 45 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  E:\n"));.    sql
2de20 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2de30 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
2de40 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
2de50 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2de60 20 74 68 65 20 70 54 68 69 73 20 65 6e 74 72 79   the pThis entry
2de70 20 6f 66 20 70 54 61 62 4c 69 73 74 20 69 73 20   of pTabList is 
2de80 61 20 73 65 6c 66 2d 6a 6f 69 6e 20 6f 66 20 61  a self-join of a
2de90 20 70 72 69 6f 72 20 76 69 65 77 2e 0a 2a 2a 20   prior view..** 
2dea0 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 72  If it is, then r
2deb0 65 74 75 72 6e 20 74 68 65 20 53 72 63 4c 69 73  eturn the SrcLis
2dec0 74 5f 69 74 65 6d 20 66 6f 72 20 74 68 65 20 70  t_item for the p
2ded0 72 69 6f 72 20 76 69 65 77 2e 20 20 49 66 20 69  rior view.  If i
2dee0 74 20 69 73 20 6e 6f 74 2c 0a 2a 2a 20 74 68 65  t is not,.** the
2def0 6e 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  n return 0..*/.s
2df00 74 61 74 69 63 20 73 74 72 75 63 74 20 53 72 63  tatic struct Src
2df10 4c 69 73 74 5f 69 74 65 6d 20 2a 69 73 53 65 6c  List_item *isSel
2df20 66 4a 6f 69 6e 56 69 65 77 28 0a 20 20 53 72 63  fJoinView(.  Src
2df30 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
2df40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
2df50 72 63 68 20 66 6f 72 20 73 65 6c 66 2d 6a 6f 69  rch for self-joi
2df60 6e 73 20 69 6e 20 74 68 69 73 20 46 52 4f 4d 20  ns in this FROM 
2df70 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
2df80 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2df90 2a 70 54 68 69 73 20 20 20 2f 2a 20 53 65 61 72  *pThis   /* Sear
2dfa0 63 68 20 66 6f 72 20 70 72 69 6f 72 20 72 65 66  ch for prior ref
2dfb0 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 73  erence to this s
2dfc0 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20  ubquery */.){.  
2dfd0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2dfe0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f  tem *pItem;.  fo
2dff0 72 28 70 49 74 65 6d 20 3d 20 70 54 61 62 4c 69  r(pItem = pTabLi
2e000 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 54 68  st->a; pItem<pTh
2e010 69 73 3b 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  is; pItem++){.  
2e020 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
2e030 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  lect==0 ) contin
2e040 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ue;.    if( pIte
2e050 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
2e060 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ne ) continue;. 
2e070 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e     if( pItem->zN
2e080 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ame==0 ) continu
2e090 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
2e0a0 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65 6d  e3_stricmp(pItem
2e0b0 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20 70 54 68  ->zDatabase, pTh
2e0c0 69 73 2d 3e 7a 44 61 74 61 62 61 73 65 29 21 3d  is->zDatabase)!=
2e0d0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2e0e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
2e0f0 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61  ricmp(pItem->zNa
2e100 6d 65 2c 20 70 54 68 69 73 2d 3e 7a 4e 61 6d 65  me, pThis->zName
2e110 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
2e120 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2e130 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 0a  ExprCompare(0, .
2e140 20 20 20 20 20 20 20 20 20 20 70 54 68 69 73 2d            pThis-
2e150 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65  >pSelect->pWhere
2e160 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
2e170 2d 3e 70 57 68 65 72 65 2c 20 2d 31 29 20 0a 20  ->pWhere, -1) . 
2e180 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54     ){.      /* T
2e190 68 65 20 76 69 65 77 20 77 61 73 20 6d 6f 64 69  he view was modi
2e1a0 66 69 65 64 20 62 79 20 73 6f 6d 65 20 6f 74 68  fied by some oth
2e1b0 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  er optimization 
2e1c0 73 75 63 68 20 61 73 0a 20 20 20 20 20 20 2a 2a  such as.      **
2e1d0 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
2e1e0 72 6d 73 28 29 20 2a 2f 0a 20 20 20 20 20 20 63  rms() */.      c
2e1f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
2e200 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 3b     return pItem;
2e210 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2e220 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
2e230 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50  E_COUNTOFVIEW_OP
2e240 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  TIMIZATION./*.**
2e250 20 41 74 74 65 6d 70 74 20 74 6f 20 74 72 61 6e   Attempt to tran
2e260 73 66 6f 72 6d 20 61 20 71 75 65 72 79 20 6f 66  sform a query of
2e270 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
2e280 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
2e290 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  *) FROM (SELECT 
2e2a0 78 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  x FROM t1 UNION 
2e2b0 41 4c 4c 20 53 45 4c 45 43 54 20 79 20 46 52 4f  ALL SELECT y FRO
2e2c0 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74 6f  M t2).**.** Into
2e2d0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
2e2e0 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
2e2f0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 29  ount(*) FROM t1)
2e300 2b 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  +(SELECT count(*
2e310 29 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a  ) FROM t2).**.**
2e320 20 54 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74   The transformat
2e330 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69  ion only works i
2e340 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
2e350 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
2e360 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20  .**.**   *  The 
2e370 73 75 62 71 75 65 72 79 20 69 73 20 61 20 55 4e  subquery is a UN
2e380 49 4f 4e 20 41 4c 4c 20 6f 66 20 74 77 6f 20 6f  ION ALL of two o
2e390 72 20 6d 6f 72 65 20 74 65 72 6d 73 0a 2a 2a 20  r more terms.** 
2e3a0 20 20 2a 20 20 54 68 65 72 65 20 69 73 20 6e 6f    *  There is no
2e3b0 20 57 48 45 52 45 20 6f 72 20 47 52 4f 55 50 20   WHERE or GROUP 
2e3c0 42 59 20 6f 72 20 48 41 56 49 4e 47 20 63 6c 61  BY or HAVING cla
2e3d0 75 73 65 73 20 6f 6e 20 74 68 65 20 73 75 62 71  uses on the subq
2e3e0 75 65 72 69 65 73 0a 2a 2a 20 20 20 2a 20 20 54  ueries.**   *  T
2e3f0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
2e400 73 20 61 20 73 69 6d 70 6c 65 20 63 6f 75 6e 74  s a simple count
2e410 28 2a 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  (*).**.** Return
2e420 20 54 52 55 45 20 69 66 20 74 68 65 20 6f 70 74   TRUE if the opt
2e430 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 6e 64  imization is und
2e440 65 72 74 61 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74  ertaken..*/.stat
2e450 69 63 20 69 6e 74 20 63 6f 75 6e 74 4f 66 56 69  ic int countOfVi
2e460 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 50  ewOptimization(P
2e470 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
2e480 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65  lect *p){.  Sele
2e490 63 74 20 2a 70 53 75 62 2c 20 2a 70 50 72 69 6f  ct *pSub, *pPrio
2e4a0 72 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  r;.  Expr *pExpr
2e4b0 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 75 6e 74  ;.  Expr *pCount
2e4c0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
2e4d0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
2e4e0 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
2e4f0 74 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  te)==0 ) return 
2e500 30 3b 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  0;   /* This is 
2e510 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a  an aggregate */.
2e520 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
2e530 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
2e540 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
2e550 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 72 65      /* Single re
2e560 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  sult column */. 
2e570 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   pExpr = p->pELi
2e580 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
2e590 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
2e5a0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
2e5b0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2e5c0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 69 73      /* Result is
2e5d0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f   an aggregate */
2e5e0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
2e5f0 74 72 69 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e  tricmp(pExpr->u.
2e600 7a 54 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29 20  zToken,"count") 
2e610 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
2e620 49 73 20 63 6f 75 6e 74 28 29 20 2a 2f 0a 20 20  Is count() */.  
2e630 69 66 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  if( pExpr->x.pLi
2e640 73 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st!=0 ) return 0
2e650 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e660 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 75    /* Must be cou
2e670 6e 74 28 2a 29 20 2a 2f 0a 20 20 69 66 28 20 70  nt(*) */.  if( p
2e680 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ->pSrc->nSrc!=1 
2e690 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
2e6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e6b0 4f 6e 65 20 74 61 62 6c 65 20 69 6e 20 46 52 4f  One table in FRO
2e6c0 4d 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70  M  */.  pSub = p
2e6d0 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
2e6e0 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 53 75 62  lect;.  if( pSub
2e6f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
2e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2e720 20 46 52 4f 4d 20 69 73 20 61 20 73 75 62 71 75   FROM is a subqu
2e730 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ery */.  if( pSu
2e740 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72  b->pPrior==0 ) r
2e750 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
2e760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
2e770 73 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64  st be a compound
2e780 20 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20   ry */.  do{.   
2e790 20 69 66 28 20 70 53 75 62 2d 3e 6f 70 21 3d 54   if( pSub->op!=T
2e7a0 4b 5f 41 4c 4c 20 26 26 20 70 53 75 62 2d 3e 70  K_ALL && pSub->p
2e7b0 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30  Prior ) return 0
2e7c0 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 55 4e  ;  /* Must be UN
2e7d0 49 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20 20 69  ION ALL */.    i
2e7e0 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20  f( pSub->pWhere 
2e7f0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
2e800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e810 20 2f 2a 20 4e 6f 20 57 48 45 52 45 20 63 6c 61   /* No WHERE cla
2e820 75 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  use */.    if( p
2e830 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
2e840 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 20 72  SF_Aggregate ) r
2e850 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20  eturn 0;     /* 
2e860 4e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  Not an aggregate
2e870 20 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70   */.    pSub = p
2e880 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 20 20 20  Sub->pPrior;    
2e890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e8a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70            /* Rep
2e8b0 65 61 74 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e  eat over compoun
2e8c0 64 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 70  d */.  }while( p
2e8d0 53 75 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Sub );..  /* If 
2e8e0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
2e8f0 69 6e 74 20 74 68 65 6e 20 69 74 20 69 73 20 4f  int then it is O
2e900 4b 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65  K to perform the
2e910 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
2e920 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  */..  db = pPars
2e930 65 2d 3e 64 62 3b 0a 20 20 70 43 6f 75 6e 74 20  e->db;.  pCount 
2e940 3d 20 70 45 78 70 72 3b 0a 20 20 70 45 78 70 72  = pExpr;.  pExpr
2e950 20 3d 20 30 3b 0a 20 20 70 53 75 62 20 3d 20 70   = 0;.  pSub = p
2e960 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
2e970 6c 65 63 74 3b 0a 20 20 70 2d 3e 70 53 72 63 2d  lect;.  p->pSrc-
2e980 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20  >a[0].pSelect = 
2e990 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  0;.  sqlite3SrcL
2e9a0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
2e9b0 3e 70 53 72 63 29 3b 0a 20 20 70 2d 3e 70 53 72  >pSrc);.  p->pSr
2e9c0 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
2e9d0 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
2e9e0 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 2d 3e 70  db, sizeof(*p->p
2e9f0 53 72 63 29 29 3b 0a 20 20 77 68 69 6c 65 28 20  Src));.  while( 
2ea00 70 53 75 62 20 29 7b 0a 20 20 20 20 45 78 70 72  pSub ){.    Expr
2ea10 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 70 50 72   *pTerm;.    pPr
2ea20 69 6f 72 20 3d 20 70 53 75 62 2d 3e 70 50 72 69  ior = pSub->pPri
2ea30 6f 72 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 50  or;.    pSub->pP
2ea40 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 53  rior = 0;.    pS
2ea50 75 62 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ub->pNext = 0;. 
2ea60 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67     pSub->selFlag
2ea70 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74  s |= SF_Aggregat
2ea80 65 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73 65 6c  e;.    pSub->sel
2ea90 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d  Flags &= ~SF_Com
2eaa0 70 6f 75 6e 64 3b 0a 20 20 20 20 70 53 75 62 2d  pound;.    pSub-
2eab0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b  >nSelectRow = 0;
2eac0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2ead0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2eae0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
2eaf0 20 20 70 54 65 72 6d 20 3d 20 70 50 72 69 6f 72    pTerm = pPrior
2eb00 20 3f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   ? sqlite3ExprDu
2eb10 70 28 64 62 2c 20 70 43 6f 75 6e 74 2c 20 30 29  p(db, pCount, 0)
2eb20 20 3a 20 70 43 6f 75 6e 74 3b 0a 20 20 20 20 70   : pCount;.    p
2eb30 53 75 62 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  Sub->pEList = sq
2eb40 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
2eb50 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 70  end(pParse, 0, p
2eb60 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d  Term);.    pTerm
2eb70 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2eb80 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43  pParse, TK_SELEC
2eb90 54 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  T, 0, 0);.    sq
2eba0 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65 6c  lite3PExprAddSel
2ebb0 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 65 72  ect(pParse, pTer
2ebc0 6d 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 69 66  m, pSub);.    if
2ebd0 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
2ebe0 20 20 20 20 70 45 78 70 72 20 3d 20 70 54 65 72      pExpr = pTer
2ebf0 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  m;.    }else{.  
2ec00 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
2ec10 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2ec20 20 54 4b 5f 50 4c 55 53 2c 20 70 54 65 72 6d 2c   TK_PLUS, pTerm,
2ec30 20 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20   pExpr);.    }. 
2ec40 20 20 20 70 53 75 62 20 3d 20 70 50 72 69 6f 72     pSub = pPrior
2ec50 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 45 4c 69 73  ;.  }.  p->pELis
2ec60 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20  t->a[0].pExpr = 
2ec70 70 45 78 70 72 3b 0a 20 20 70 2d 3e 73 65 6c 46  pExpr;.  p->selF
2ec80 6c 61 67 73 20 26 3d 20 7e 53 46 5f 41 67 67 72  lags &= ~SF_Aggr
2ec90 65 67 61 74 65 3b 0a 0a 23 69 66 20 53 45 4c 45  egate;..#if SELE
2eca0 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
2ecb0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2ecc0 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
2ecd0 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
2ece0 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
2ecf0 2c 70 2c 28 22 41 66 74 65 72 20 63 6f 75 6e 74  ,p,("After count
2ed00 2d 6f 66 2d 76 69 65 77 20 6f 70 74 69 6d 69 7a  -of-view optimiz
2ed10 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20  ation:\n"));.   
2ed20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2ed30 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2ed40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
2ed50 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
2ed60 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54   /* SQLITE_COUNT
2ed70 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54  OFVIEW_OPTIMIZAT
2ed80 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65  ION */../*.** Ge
2ed90 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
2eda0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
2edb0 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68  ment given in th
2edc0 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a  e p argument.  .
2edd0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
2ede0 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 61  s are returned a
2edf0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
2ee00 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
2ee10 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d  ture..** See com
2ee20 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49  ments in sqliteI
2ee30 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72  nt.h for further
2ee40 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
2ee50 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2ee60 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
2ee70 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
2ee80 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
2ee90 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
2eea0 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
2eeb0 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
2eec0 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
2eed0 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
2eee0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
2eef0 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
2ef00 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
2ef10 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
2ef20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
2ef30 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
2ef40 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
2ef50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
2ef60 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
2ef70 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2ef80 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
2ef90 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
2efa0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
2efb0 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
2efc0 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
2efd0 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ded. */.  Select
2efe0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
2eff0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
2f000 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65  ith the query re
2f010 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
2f020 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
2f030 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2f040 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
2f050 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
2f060 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d    /* Return from
2f070 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2f080 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a  in() */.  Vdbe *
2f090 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
2f0a0 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
2f0b0 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f  machine under co
2f0c0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
2f0d0 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20  int isAgg;      
2f0e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2f0f0 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
2f100 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
2f110 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2f120 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c  EList = 0;  /* L
2f130 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
2f140 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
2f150 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
2f160 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
2f170 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
2f180 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
2f190 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
2f1a0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2f1b0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
2f1c0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
2f1d0 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
2f1e0 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
2f1f0 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
2f200 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
2f210 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20   *pHaving;      
2f220 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47     /* The HAVING
2f230 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
2f240 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72   NULL */.  int r
2f250 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  c = 1;          
2f260 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
2f270 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66  turn from this f
2f280 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73  unction */.  Dis
2f290 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e  tinctCtx sDistin
2f2a0 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68  ct; /* Info on h
2f2b0 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44  ow to code the D
2f2c0 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
2f2d0 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f  */.  SortCtx sSo
2f2e0 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rt;         /* I
2f2f0 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f  nfo on how to co
2f300 64 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  de the ORDER BY 
2f310 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49  clause */.  AggI
2f320 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20  nfo sAggInfo;   
2f330 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
2f340 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67  n used by aggreg
2f350 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  ate queries */. 
2f360 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20   int iEnd;      
2f370 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
2f380 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66  ss of the end of
2f390 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
2f3a0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
2f3b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
2f3c0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2f3d0 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  n */.  ExprList 
2f3e0 2a 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 20  *pMinMaxOrderBy 
2f3f0 3d 20 30 3b 20 20 2f 2a 20 41 64 64 65 64 20 4f  = 0;  /* Added O
2f400 52 44 45 52 20 42 59 20 66 6f 72 20 6d 69 6e 2f  RDER BY for min/
2f410 6d 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  max queries */. 
2f420 20 75 38 20 6d 69 6e 4d 61 78 46 6c 61 67 3b 20   u8 minMaxFlag; 
2f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f440 2f 2a 20 46 6c 61 67 20 66 6f 72 20 6d 69 6e 2f  /* Flag for min/
2f450 6d 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a 0a  max queries */..
2f460 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2f470 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e  MIT_EXPLAIN.  in
2f480 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  t iRestoreSelect
2f490 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  Id = pParse->iSe
2f4a0 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65  lectId;.  pParse
2f4b0 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50  ->iSelectId = pP
2f4c0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
2f4d0 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  tId++;.#endif.. 
2f4e0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
2f4f0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
2f500 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2f510 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
2f520 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
2f530 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
2f540 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
2f550 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
2f560 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
2f570 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65  eturn 1;.  memse
2f580 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20  t(&sAggInfo, 0, 
2f590 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29  sizeof(sAggInfo)
2f5a0 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
2f5b0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c  CE_ENABLED.  SEL
2f5c0 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
2f5d0 65 2c 70 2c 20 28 22 62 65 67 69 6e 20 70 72 6f  e,p, ("begin pro
2f5e0 63 65 73 73 69 6e 67 3a 5c 6e 22 2c 20 70 50 61  cessing:\n", pPa
2f5f0 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 29 29  rse->iSelectId))
2f600 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
2f610 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
2f620 30 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  00 ){.    sqlite
2f630 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
2f640 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
2f650 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
2f660 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  p->pOrderBy==0 |
2f670 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  | pDest->eDest!=
2f680 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a  SRT_DistFifo );.
2f690 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
2f6a0 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
2f6b0 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69  t->eDest!=SRT_Fi
2f6c0 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  fo );.  assert( 
2f6d0 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  p->pOrderBy==0 |
2f6e0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  | pDest->eDest!=
2f6f0 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b  SRT_DistQueue );
2f700 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
2f710 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
2f720 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51  st->eDest!=SRT_Q
2f730 75 65 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67  ueue );.  if( Ig
2f740 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
2f750 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73  Dest) ){.    ass
2f760 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74  ert(pDest->eDest
2f770 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20  ==SRT_Exists || 
2f780 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2f790 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20  T_Union || .    
2f7a0 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
2f7b0 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20  est==SRT_Except 
2f7c0 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
2f7d0 3d 53 52 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a  =SRT_Discard ||.
2f7e0 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
2f7f0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65  ->eDest==SRT_Que
2f800 75 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ue  || pDest->eD
2f810 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66  est==SRT_DistFif
2f820 6f 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  o ||.           
2f830 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2f840 54 5f 44 69 73 74 51 75 65 75 65 20 7c 7c 20 70  T_DistQueue || p
2f850 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2f860 5f 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49  _Fifo);.    /* I
2f870 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73  f ORDER BY makes
2f880 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69   no difference i
2f890 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74 68 65  n the output the
2f8a0 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20  n neither does. 
2f8b0 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73     ** DISTINCT s
2f8c0 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f  o it can be remo
2f8d0 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20  ved too. */.    
2f8e0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2f8f0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
2f900 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70  derBy);.    p->p
2f910 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
2f920 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
2f930 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20  ~SF_Distinct;.  
2f940 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  }.  sqlite3Selec
2f950 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c  tPrep(pParse, p,
2f960 20 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73   0);.  memset(&s
2f970 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Sort, 0, sizeof(
2f980 73 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72 74  sSort));.  sSort
2f990 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  .pOrderBy = p->p
2f9a0 4f 72 64 65 72 42 79 3b 0a 20 20 70 54 61 62 4c  OrderBy;.  pTabL
2f9b0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
2f9c0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
2f9d0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
2f9e0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
2f9f0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2fa00 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
2fa10 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 69 73  EList!=0 );.  is
2fa20 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  Agg = (p->selFla
2fa30 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
2fa40 65 29 21 3d 30 3b 0a 23 69 66 20 53 45 4c 45 43  e)!=0;.#if SELEC
2fa50 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
2fa60 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2fa70 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
2fa80 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
2fa90 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
2faa0 70 2c 20 28 22 61 66 74 65 72 20 6e 61 6d 65 20  p, ("after name 
2fab0 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29  resolution:\n"))
2fac0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
2fad0 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
2fae0 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
2faf0 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69  ..  /* Get a poi
2fb00 6e 74 65 72 20 74 68 65 20 56 44 42 45 20 75 6e  nter the VDBE un
2fb10 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
2fb20 2c 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  , allocating a n
2fb30 65 77 20 56 44 42 45 20 69 66 20 6f 6e 65 0a 20  ew VDBE if one. 
2fb40 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   ** does not alr
2fb50 65 61 64 79 20 65 78 69 73 74 20 2a 2f 0a 20 20  eady exist */.  
2fb60 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
2fb70 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
2fb80 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ( v==0 ) goto se
2fb90 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 69 66 28 20  lect_end;.  if( 
2fba0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2fbb0 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
2fbc0 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
2fbd0 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  mes(pParse, p);.
2fbe0 20 20 7d 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f    }..  /* Try to
2fbf0 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a   various optimiz
2fc00 61 74 69 6f 6e 73 20 28 66 6c 61 74 74 65 6e 69  ations (flatteni
2fc10 6e 67 20 73 75 62 71 75 65 72 69 65 73 2c 20 61  ng subqueries, a
2fc20 6e 64 20 73 74 72 65 6e 67 74 68 0a 20 20 2a 2a  nd strength.  **
2fc30 20 72 65 64 75 63 74 69 6f 6e 20 6f 66 20 6a 6f   reduction of jo
2fc40 69 6e 20 6f 70 65 72 61 74 6f 72 73 29 20 69 6e  in operators) in
2fc50 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2fc60 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   up into the mai
2fc70 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66  n query.  */.#if
2fc80 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2fc90 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
2fca0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
2fcb0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20  TE_OMIT_VIEW).  
2fcc0 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72  for(i=0; !p->pPr
2fcd0 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73  ior && i<pTabLis
2fce0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
2fcf0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
2fd00 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
2fd10 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
2fd20 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
2fd30 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  b = pItem->pSele
2fd40 63 74 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ct;.    Table *p
2fd50 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
2fd60 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65  b;..    /* Conve
2fd70 72 74 20 4c 45 46 54 20 4a 4f 49 4e 20 69 6e 74  rt LEFT JOIN int
2fd80 6f 20 4a 4f 49 4e 20 69 66 20 74 68 65 72 65 20  o JOIN if there 
2fd90 61 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  are terms of the
2fda0 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20 20   right table.   
2fdb0 20 2a 2a 20 6f 66 20 74 68 65 20 4c 45 46 54 20   ** of the LEFT 
2fdc0 4a 4f 49 4e 20 75 73 65 64 20 69 6e 20 74 68 65  JOIN used in the
2fdd0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
2fde0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
2fdf0 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  Item->fg.jointyp
2fe00 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a  e & JT_LEFT)!=0.
2fe10 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
2fe20 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c  xprImpliesNonNul
2fe30 6c 52 6f 77 28 70 2d 3e 70 57 68 65 72 65 2c 20  lRow(p->pWhere, 
2fe40 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a  pItem->iCursor).
2fe50 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
2fe60 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
2fe70 53 51 4c 49 54 45 5f 53 69 6d 70 6c 69 66 79 4a  SQLITE_SimplifyJ
2fe80 6f 69 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  oin).    ){.    
2fe90 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2fea0 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20  100,pParse,p,.  
2feb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 22                ("
2fec0 4c 45 46 54 2d 4a 4f 49 4e 20 73 69 6d 70 6c 69  LEFT-JOIN simpli
2fed0 66 69 65 73 20 74 6f 20 4a 4f 49 4e 20 6f 6e 20  fies to JOIN on 
2fee0 74 65 72 6d 20 25 64 5c 6e 22 2c 69 29 29 3b 0a  term %d\n",i));.
2fef0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
2ff00 6a 6f 69 6e 74 79 70 65 20 26 3d 20 7e 28 4a 54  jointype &= ~(JT
2ff10 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 29 3b  _LEFT|JT_OUTER);
2ff20 0a 20 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e  .      unsetJoin
2ff30 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
2ff40 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
2ff50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e  .    }..    /* N
2ff60 6f 20 66 75 74 68 65 72 20 61 63 74 69 6f 6e 20  o futher action 
2ff70 69 66 20 74 68 69 73 20 74 65 72 6d 20 6f 66 20  if this term of 
2ff80 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2ff90 69 73 20 6e 6f 20 61 20 73 75 62 71 75 65 72 79  is no a subquery
2ffa0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
2ffb0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2ffc0 0a 20 20 20 20 2f 2a 20 43 61 74 63 68 20 6d 69  .    /* Catch mi
2ffd0 73 6d 61 74 63 68 20 69 6e 20 74 68 65 20 64 65  smatch in the de
2ffe0 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20 6f  clared columns o
2fff0 66 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65  f a view and the
30000 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a   number of.    *
30010 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  * columns in the
30020 20 53 45 4c 45 43 54 20 6f 6e 20 74 68 65 20 52   SELECT on the R
30030 48 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54  HS */.    if( pT
30040 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e  ab->nCol!=pSub->
30050 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
30060 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
30070 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
30080 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75  expected %d colu
30090 6d 6e 73 20 66 6f 72 20 27 25 73 27 20 62 75 74  mns for '%s' but
300a0 20 67 6f 74 20 25 64 22 2c 0a 20 20 20 20 20 20   got %d",.      
300b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
300c0 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62  pTab->nCol, pTab
300d0 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e 70  ->zName, pSub->p
300e0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
300f0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
30100 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _end;.    }..   
30110 20 2f 2a 20 44 6f 20 6e 6f 74 20 74 72 79 20 74   /* Do not try t
30120 6f 20 66 6c 61 74 74 65 6e 20 61 6e 20 61 67 67  o flatten an agg
30130 72 65 67 61 74 65 20 73 75 62 71 75 65 72 79 2e  regate subquery.
30140 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
30150 6c 61 74 74 65 6e 69 6e 67 20 61 6e 20 61 67 67  lattening an agg
30160 72 65 67 61 74 65 20 73 75 62 71 75 65 72 79 20  regate subquery 
30170 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  is only possible
30180 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
30190 65 72 79 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  ery.    ** is no
301a0 74 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69  t a join.  But i
301b0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
301c0 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2c  y is not a join,
301d0 20 74 68 65 6e 20 74 68 65 20 73 75 62 71 75 65   then the subque
301e0 72 79 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  ry.    ** will b
301f0 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  e implemented as
30200 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 61 6e   a co-routine an
30210 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61 64  d there is no ad
30220 76 61 6e 74 61 67 65 20 74 6f 0a 20 20 20 20 2a  vantage to.    *
30230 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20  * flattening in 
30240 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a  that case..    *
30250 2f 0a 20 20 20 20 69 66 28 20 28 70 53 75 62 2d  /.    if( (pSub-
30260 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
30270 67 67 72 65 67 61 74 65 29 21 3d 30 20 29 20 63  ggregate)!=0 ) c
30280 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
30290 65 72 74 28 20 70 53 75 62 2d 3e 70 47 72 6f 75  ert( pSub->pGrou
302a0 70 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f  pBy==0 );..    /
302b0 2a 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71  * If the outer q
302c0 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 20  uery contains a 
302d0 22 63 6f 6d 70 6c 65 78 22 20 72 65 73 75 6c 74  "complex" result
302e0 20 73 65 74 20 28 74 68 61 74 20 69 73 2c 0a 20   set (that is,. 
302f0 20 20 20 2a 2a 20 69 66 20 74 68 65 20 72 65 73     ** if the res
30300 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
30310 75 74 65 72 20 71 75 65 72 79 20 75 73 65 73 20  uter query uses 
30320 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 73 75 62  functions or sub
30330 71 75 65 72 69 65 73 29 0a 20 20 20 20 2a 2a 20  queries).    ** 
30340 61 6e 64 20 69 66 20 74 68 65 20 73 75 62 71 75  and if the subqu
30350 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ery contains an 
30360 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
30370 61 6e 64 20 69 66 0a 20 20 20 20 2a 2a 20 69 74  and if.    ** it
30380 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65   will be impleme
30390 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75  nted as a co-rou
303a0 74 69 6e 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  tine, then do no
303b0 74 20 66 6c 61 74 74 65 6e 2e 20 20 54 68 69 73  t flatten.  This
303c0 0a 20 20 20 20 2a 2a 20 72 65 73 74 72 69 63 74  .    ** restrict
303d0 69 6f 6e 20 61 6c 6c 6f 77 73 20 53 51 4c 20 63  ion allows SQL c
303e0 6f 6e 73 74 72 75 63 74 73 20 6c 69 6b 65 20 74  onstructs like t
303f0 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  his:.    **.    
30400 2a 2a 20 20 53 45 4c 45 43 54 20 65 78 70 65 6e  **  SELECT expen
30410 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 78 29  sive_function(x)
30420 0a 20 20 20 20 2a 2a 20 20 20 20 46 52 4f 4d 20  .    **    FROM 
30430 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  (SELECT x FROM t
30440 61 62 20 4f 52 44 45 52 20 42 59 20 79 20 4c 49  ab ORDER BY y LI
30450 4d 49 54 20 31 30 29 3b 0a 20 20 20 20 2a 2a 0a  MIT 10);.    **.
30460 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 65 6e      ** The expen
30470 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20  sive_function() 
30480 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 75 74 65 64  is only computed
30490 20 6f 6e 20 74 68 65 20 31 30 20 72 6f 77 73 20   on the 10 rows 
304a0 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 72 65 20  that.    ** are 
304b0 6f 75 74 70 75 74 2c 20 72 61 74 68 65 72 20 74  output, rather t
304c0 68 61 6e 20 65 76 65 72 79 20 72 6f 77 20 6f 66  han every row of
304d0 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
304e0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
304f0 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74  quirement that t
30500 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
30510 61 76 65 20 61 20 63 6f 6d 70 6c 65 78 20 72 65  ave a complex re
30520 73 75 6c 74 20 73 65 74 0a 20 20 20 20 2a 2a 20  sult set.    ** 
30530 6d 65 61 6e 73 20 74 68 61 74 20 66 6c 61 74 74  means that flatt
30540 65 6e 69 6e 67 20 64 6f 65 73 20 6f 63 63 75 72  ening does occur
30550 20 6f 6e 20 73 69 6d 70 6c 65 72 20 53 51 4c 20   on simpler SQL 
30560 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 74 68  constraints with
30570 6f 75 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  out.    ** the e
30580 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f  xpensive_functio
30590 6e 28 29 20 6c 69 6b 65 3a 0a 20 20 20 20 2a 2a  n() like:.    **
305a0 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43 54 20  .    **  SELECT 
305b0 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  x FROM (SELECT x
305c0 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20   FROM tab ORDER 
305d0 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a  BY y LIMIT 10);.
305e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
305f0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30  Sub->pOrderBy!=0
30600 0a 20 20 20 20 20 26 26 20 69 3d 3d 30 0a 20 20  .     && i==0.  
30610 20 20 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61     && (p->selFla
30620 67 73 20 26 20 53 46 5f 43 6f 6d 70 6c 65 78 52  gs & SF_ComplexR
30630 65 73 75 6c 74 29 21 3d 30 0a 20 20 20 20 20 26  esult)!=0.     &
30640 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  & (pTabList->nSr
30650 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c  c==1.         ||
30660 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d   (pTabList->a[1]
30670 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54  .fg.jointype&(JT
30680 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
30690 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0).    ){.    
306a0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
306b0 7d 0a 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74  }..    if( flatt
306c0 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73  enSubquery(pPars
306d0 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 29 20  e, p, i, isAgg) 
306e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
306f0 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65   subquery can be
30700 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69   absorbed into i
30710 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  ts parent. */.  
30720 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20      i = -1;.    
30730 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  }.    pTabList =
30740 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66   p->pSrc;.    if
30750 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
30760 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
30770 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 21 49  _end;.    if( !I
30780 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
30790 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pDest) ){.      
307a0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
307b0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
307c0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
307d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
307e0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
307f0 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20  ECT.  /* Handle 
30800 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
30810 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69 6e 67  statements using
30820 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d 75   the separate mu
30830 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a  ltiSelect().  **
30840 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f   procedure..  */
30850 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
30860 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c   ){.    rc = mul
30870 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  tiSelect(pParse,
30880 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20   p, pDest);.    
30890 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
308a0 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
308b0 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
308c0 65 63 74 49 64 29 3b 0a 23 69 66 20 53 45 4c 45  ectId);.#if SELE
308d0 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
308e0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
308f0 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64  1,pParse,p,("end
30900 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
30910 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29   processing\n"))
30920 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
30930 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
30940 69 66 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63  if..  /* For eac
30950 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52  h term in the FR
30960 4f 4d 20 63 6c 61 75 73 65 2c 20 64 6f 20 74 77  OM clause, do tw
30970 6f 20 74 68 69 6e 67 73 3a 0a 20 20 2a 2a 20 28  o things:.  ** (
30980 31 29 20 41 75 74 68 6f 72 69 7a 65 64 20 75 6e  1) Authorized un
30990 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
309a0 73 0a 20 20 2a 2a 20 28 32 29 20 47 65 6e 65 72  s.  ** (2) Gener
309b0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
309c0 20 73 75 62 2d 71 75 65 72 69 65 73 0a 20 20 2a   sub-queries.  *
309d0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
309e0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
309f0 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
30a00 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
30a10 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
30a20 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
30a30 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
30a40 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 0a 23 69  Select *pSub;.#i
30a50 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
30a60 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
30a70 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
30a80 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
30a90 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
30aa0 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
30ab0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
30ac0 20 49 73 73 75 65 20 53 51 4c 49 54 45 5f 52 45   Issue SQLITE_RE
30ad0 41 44 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  AD authorization
30ae0 73 20 77 69 74 68 20 61 20 66 61 6b 65 20 63 6f  s with a fake co
30af0 6c 75 6d 6e 20 6e 61 6d 65 20 66 6f 72 20 61 6e  lumn name for an
30b00 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20  y.    ** tables 
30b10 74 68 61 74 20 61 72 65 20 72 65 66 65 72 65 6e  that are referen
30b20 63 65 64 20 62 75 74 20 66 72 6f 6d 20 77 68 69  ced but from whi
30b30 63 68 20 6e 6f 20 76 61 6c 75 65 73 20 61 72 65  ch no values are
30b40 20 65 78 74 72 61 63 74 65 64 2e 0a 20 20 20 20   extracted..    
30b50 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77  ** Examples of w
30b60 68 65 72 65 20 74 68 65 73 65 20 6b 69 6e 64 73  here these kinds
30b70 20 6f 66 20 6e 75 6c 6c 20 53 51 4c 49 54 45 5f   of null SQLITE_
30b80 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61 74 69  READ authorizati
30b90 6f 6e 73 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64  ons.    ** would
30ba0 20 6f 63 63 75 72 3a 0a 20 20 20 20 2a 2a 0a 20   occur:.    **. 
30bb0 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54     **     SELECT
30bc0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
30bd0 31 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52  1;   -- SQLITE_R
30be0 45 41 44 20 74 31 2e 22 22 0a 20 20 20 20 2a 2a  EAD t1."".    **
30bf0 20 20 20 20 20 53 45 4c 45 43 54 20 74 31 2e 2a       SELECT t1.*
30c00 20 46 52 4f 4d 20 74 31 2c 20 74 32 3b 20 20 20   FROM t1, t2;   
30c10 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20 74  -- SQLITE_READ t
30c20 32 2e 22 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20  2."".    **.    
30c30 2a 2a 20 54 68 65 20 66 61 6b 65 20 63 6f 6c 75  ** The fake colu
30c40 6d 6e 20 6e 61 6d 65 20 69 73 20 61 6e 20 65 6d  mn name is an em
30c50 70 74 79 20 73 74 72 69 6e 67 2e 20 20 49 74 20  pty string.  It 
30c60 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
30c70 61 20 74 61 62 6c 65 20 74 6f 0a 20 20 20 20 2a  a table to.    *
30c80 2a 20 68 61 76 65 20 61 20 63 6f 6c 75 6d 6e 20  * have a column 
30c90 6e 61 6d 65 64 20 62 79 20 74 68 65 20 65 6d 70  named by the emp
30ca0 74 79 20 73 74 72 69 6e 67 2c 20 69 6e 20 77 68  ty string, in wh
30cb0 69 63 68 20 63 61 73 65 20 74 68 65 72 65 20 69  ich case there i
30cc0 73 20 6e 6f 20 77 61 79 20 74 6f 0a 20 20 20 20  s no way to.    
30cd0 2a 2a 20 64 69 73 74 69 6e 67 75 69 73 68 20 62  ** distinguish b
30ce0 65 74 77 65 65 6e 20 61 6e 20 75 6e 72 65 66 65  etween an unrefe
30cf0 72 65 6e 63 65 64 20 74 61 62 6c 65 20 61 6e 64  renced table and
30d00 20 61 6e 20 61 63 74 75 61 6c 20 72 65 66 65 72   an actual refer
30d10 65 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20  ence to the.    
30d20 2a 2a 20 22 22 20 63 6f 6c 75 6d 6e 2e 20 54 68  ** "" column. Th
30d30 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
30d40 6e 20 77 61 73 20 66 6f 72 20 74 68 65 20 66 61  n was for the fa
30d50 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74  ke column name t
30d60 6f 20 62 65 20 61 20 4e 55 4c 4c 2c 0a 20 20 20  o be a NULL,.   
30d70 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20   ** which would 
30d80 62 65 20 75 6e 61 6d 62 69 67 75 6f 75 73 2e 20  be unambiguous. 
30d90 20 42 75 74 20 6c 65 67 61 63 79 20 61 75 74 68   But legacy auth
30da0 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61  orization callba
30db0 63 6b 73 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a  cks might.    **
30dc0 20 61 73 73 75 6d 65 20 74 68 65 20 63 6f 6c 75   assume the colu
30dd0 6d 6e 20 6e 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e  mn name is non-N
30de0 55 4c 4c 20 61 6e 64 20 73 65 67 66 61 75 6c 74  ULL and segfault
30df0 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 6e  .  The use of an
30e00 20 65 6d 70 74 79 0a 20 20 20 20 2a 2a 20 73 74   empty.    ** st
30e10 72 69 6e 67 20 66 6f 72 20 74 68 65 20 66 61 6b  ring for the fak
30e20 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 73 65  e column name se
30e30 65 6d 73 20 73 61 66 65 72 2e 0a 20 20 20 20 2a  ems safer..    *
30e40 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  /.    if( pItem-
30e50 3e 63 6f 6c 55 73 65 64 3d 3d 30 20 29 7b 0a 20  >colUsed==0 ){. 
30e60 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68       sqlite3Auth
30e70 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
30e80 4c 49 54 45 5f 52 45 41 44 2c 20 70 49 74 65 6d  LITE_READ, pItem
30e90 2d 3e 7a 4e 61 6d 65 2c 20 22 22 2c 20 70 49 74  ->zName, "", pIt
30ea0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
30eb0 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
30ec0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
30ed0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
30ee0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
30ef0 54 5f 56 49 45 57 29 0a 20 20 20 20 2f 2a 20 47  T_VIEW).    /* G
30f00 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
30f10 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73   all sub-queries
30f20 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
30f30 75 73 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  use.    */.    p
30f40 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65  Sub = pItem->pSe
30f50 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20 70 53  lect;.    if( pS
30f60 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ub==0 ) continue
30f70 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69  ;..    /* Someti
30f80 6d 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  mes the code for
30f90 20 61 20 73 75 62 71 75 65 72 79 20 77 69 6c 6c   a subquery will
30fa0 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 6d 6f   be generated mo
30fb0 72 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f  re than.    ** o
30fc0 6e 63 65 2c 20 69 66 20 74 68 65 20 73 75 62 71  nce, if the subq
30fd0 75 65 72 79 20 69 73 20 70 61 72 74 20 6f 66 20  uery is part of 
30fe0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
30ff0 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   in a LEFT JOIN,
31000 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d  .    ** for exam
31010 70 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61  ple.  In that ca
31020 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e  se, do not regen
31030 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  erate the code t
31040 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20 20 20 2a  o manifest.    *
31050 2a 20 61 20 76 69 65 77 20 6f 72 20 74 68 65 20  * a view or the 
31060 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d  co-routine to im
31070 70 6c 65 6d 65 6e 74 20 61 20 76 69 65 77 2e 20  plement a view. 
31080 20 54 68 65 20 66 69 72 73 74 20 69 6e 73 74 61   The first insta
31090 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 75  nce.    ** is su
310a0 66 66 69 63 69 65 6e 74 2c 20 74 68 6f 75 67 68  fficient, though
310b0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
310c0 74 6f 20 6d 61 6e 69 66 65 73 74 20 74 68 65 20  to manifest the 
310d0 76 69 65 77 20 64 6f 65 73 20 6e 65 65 64 0a 20  view does need. 
310e0 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f     ** to be invo
310f0 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20  ked again. */.  
31100 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64    if( pItem->add
31110 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20  rFillSub ){.    
31120 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
31130 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20  viaCoroutine==0 
31140 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
31150 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  e subroutine tha
31160 74 20 6d 61 6e 69 66 65 73 74 73 20 74 68 65 20  t manifests the 
31170 76 69 65 77 20 6d 69 67 68 74 20 62 65 20 61 20  view might be a 
31180 6f 6e 65 2d 74 69 6d 65 20 72 6f 75 74 69 6e 65  one-time routine
31190 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  ,.        ** or 
311a0 69 74 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  it might need to
311b0 20 62 65 20 72 65 72 75 6e 20 6f 6e 20 65 61 63   be rerun on eac
311c0 68 20 69 74 65 72 61 74 69 6f 6e 20 62 65 63 61  h iteration beca
311d0 75 73 65 20 69 74 0a 20 20 20 20 20 20 20 20 2a  use it.        *
311e0 2a 20 65 6e 63 6f 64 65 73 20 61 20 63 6f 72 72  * encodes a corr
311f0 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 2e  elated subquery.
31200 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 65 73 74   */.        test
31210 63 61 73 65 28 20 73 71 6c 69 74 65 33 56 64 62  case( sqlite3Vdb
31220 65 47 65 74 4f 70 28 76 2c 20 70 49 74 65 6d 2d  eGetOp(v, pItem-
31230 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 2d 3e 6f  >addrFillSub)->o
31240 70 63 6f 64 65 3d 3d 4f 50 5f 4f 6e 63 65 20 29  pcode==OP_Once )
31250 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
31260 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
31270 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e  P_Gosub, pItem->
31280 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74 65 6d  regReturn, pItem
31290 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a  ->addrFillSub);.
312a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f        }.      co
312b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20  ntinue;.    }.. 
312c0 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
312d0 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79  Parse.nHeight by
312e0 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74   the height of t
312f0 68 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65  he largest expre
31300 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65  ssion.    ** tre
31310 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79  e referred to by
31320 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e   this, the paren
31330 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68  t select. The ch
31340 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a  ild select.    *
31350 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78  * may contain ex
31360 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f  pression trees o
31370 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a  f at most.    **
31380 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50   (SQLITE_MAX_EXP
31390 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48  R_DEPTH-Parse.nH
313a0 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54  eight) height. T
313b0 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20  his is a bit.   
313c0 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76   ** more conserv
313d0 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73  ative than neces
313e0 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65  sary, but much e
313f0 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72  asier than enfor
31400 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65  cing.    ** an e
31410 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20  xact limit..    
31420 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
31430 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65  Height += sqlite
31440 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
31450 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61  t(p);..    /* Ma
31460 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 63 6f 6e  ke copies of con
31470 73 74 61 6e 74 20 57 48 45 52 45 2d 63 6c 61 75  stant WHERE-clau
31480 73 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  se terms in the 
31490 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 77 6e  outer query down
314a0 0a 20 20 20 20 2a 2a 20 69 6e 73 69 64 65 20 74  .    ** inside t
314b0 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68  he subquery.  Th
314c0 69 73 20 63 61 6e 20 68 65 6c 70 20 74 68 65 20  is can help the 
314d0 73 75 62 71 75 65 72 79 20 74 6f 20 72 75 6e 20  subquery to run 
314e0 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79  more efficiently
314f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
31500 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
31510 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
31520 50 75 73 68 44 6f 77 6e 29 0a 20 20 20 20 20 26  PushDown).     &
31530 26 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54  & pushDownWhereT
31540 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75  erms(pParse, pSu
31550 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 49  b, p->pWhere, pI
31560 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 0a 20 20  tem->iCursor,.  
31570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31580 20 20 20 20 20 20 20 20 20 28 70 49 74 65 6d 2d           (pItem-
31590 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
315a0 54 5f 4f 55 54 45 52 29 21 3d 30 29 0a 20 20 20  T_OUTER)!=0).   
315b0 20 29 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52   ){.#if SELECTTR
315c0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
315d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
315e0 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
315f0 20 29 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45   ){.        SELE
31600 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50  CTTRACE(0x100,pP
31610 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 57  arse,p,("After W
31620 48 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73 68  HERE-clause push
31630 2d 64 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20  -down:\n"));.   
31640 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
31650 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
31660 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
31670 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
31680 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
31690 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
316a0 28 22 50 75 73 68 2d 64 6f 77 6e 20 6e 6f 74 20  ("Push-down not 
316b0 70 6f 73 73 69 62 6c 65 5c 6e 22 29 29 3b 0a 20  possible\n"));. 
316c0 20 20 20 7d 0a 0a 20 20 20 20 7a 53 61 76 65 64     }..    zSaved
316d0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50  AuthContext = pP
316e0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
316f0 78 74 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  xt;.    pParse->
31700 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
31710 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20  Item->zName;..  
31720 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
31730 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  de to implement 
31740 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20  the subquery.   
31750 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
31760 75 62 71 75 65 72 79 20 69 73 20 69 6d 70 6c 65  ubquery is imple
31770 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72  mented as a co-r
31780 6f 75 74 69 6e 65 20 69 66 20 74 68 65 20 73 75  outine if the su
31790 62 71 75 65 72 79 20 69 73 0a 20 20 20 20 2a 2a  bquery is.    **
317a0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
317b0 65 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70  e the outer loop
317c0 20 28 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65   (so that it doe
317d0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
317e0 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64  .    ** computed
317f0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 29   more than once)
31800 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
31810 4f 44 4f 3a 20 41 72 65 20 74 68 65 72 65 20 6f  ODO: Are there o
31820 74 68 65 72 20 72 65 61 73 6f 6e 73 20 62 65 73  ther reasons bes
31830 69 64 65 20 28 31 29 20 74 6f 20 75 73 65 20 61  ide (1) to use a
31840 20 63 6f 2d 72 6f 75 74 69 6e 65 0a 20 20 20 20   co-routine.    
31850 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
31860 6e 3f 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n?.    */.    if
31870 28 20 69 3d 3d 30 0a 20 20 20 20 20 26 26 20 28  ( i==0.     && (
31880 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
31890 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  1.            ||
318a0 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d   (pTabList->a[1]
318b0 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54  .fg.jointype&(JT
318c0 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
318d0 21 3d 30 29 20 20 2f 2a 20 28 31 29 20 2a 2f 0a  !=0)  /* (1) */.
318e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
318f0 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72  Implement a co-r
31900 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
31910 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65   return a single
31920 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
31930 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  lt.      ** set 
31940 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69  on each invocati
31950 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
31960 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d     int addrTop =
31970 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
31980 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20  entAddr(v)+1;.  
31990 20 20 20 0a 20 20 20 20 20 20 70 49 74 65 6d 2d     .      pItem-
319a0 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
319b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
319c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
319d0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
319e0 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d  oroutine, pItem-
319f0 3e 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61  >regReturn, 0, a
31a00 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56  ddrTop);.      V
31a10 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
31a20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %s", pItem->pTab
31a30 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
31a40 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
31a50 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20  Sub = addrTop;. 
31a60 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
31a70 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
31a80 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
31a90 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
31aa0 6e 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  n);.      explai
31ab0 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65  nSetInteger(pIte
31ac0 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75  m->iSelectId, (u
31ad0 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  8)pParse->iNextS
31ae0 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
31af0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
31b00 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73  arse, pSub, &des
31b10 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  t);.      pItem-
31b20 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73  >pTab->nRowLogEs
31b30 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63  t = pSub->nSelec
31b40 74 52 6f 77 3b 0a 20 20 20 20 20 20 70 49 74 65  tRow;.      pIte
31b50 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
31b60 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49  ne = 1;.      pI
31b70 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d  tem->regResult =
31b80 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20   dest.iSdst;.   
31b90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e     sqlite3VdbeEn
31ba0 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 70 49  dCoroutine(v, pI
31bb0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
31bc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
31bd0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
31be0 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20  drTop-1);.      
31bf0 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
31c00 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29  RegCache(pParse)
31c10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
31c20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
31c30 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
31c40 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70   will fill an ep
31c50 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
31c60 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  th.      ** the 
31c70 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20  content of this 
31c80 73 75 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d  subquery.  pItem
31c90 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69  ->addrFillSub wi
31ca0 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a  ll point.      *
31cb0 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73  * to the address
31cc0 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65   of the generate
31cd0 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70  d subroutine.  p
31ce0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a  Item->regReturn.
31cf0 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65        ** is a re
31d00 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64  gister allocated
31d10 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62   to hold the sub
31d20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61  routine return a
31d30 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a  ddress.      */.
31d40 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64        int topAdd
31d50 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63  r;.      int onc
31d60 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  eAddr = 0;.     
31d70 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20   int retAddr;.  
31d80 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
31d90 73 74 5f 69 74 65 6d 20 2a 70 50 72 69 6f 72 3b  st_item *pPrior;
31da0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
31db0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
31dc0 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ub==0 );.      p
31dd0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
31de0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
31df0 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72 20  ;.      topAddr 
31e00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
31e10 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
31e20 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67  r, 0, pItem->reg
31e30 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70  Return);.      p
31e40 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
31e50 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20  b = topAddr+1;. 
31e60 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
31e70 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d  fg.isCorrelated=
31e80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
31e90 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
31ea0 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74   is not correlat
31eb0 65 64 20 61 6e 64 20 69 66 20 77 65 20 61 72 65  ed and if we are
31ec0 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20   not inside of. 
31ed0 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67         ** a trig
31ee0 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c  ger, then we onl
31ef0 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  y need to comput
31f00 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
31f10 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20  he subquery.    
31f20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a      ** once. */.
31f30 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72          onceAddr
31f40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
31f50 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29  dOp0(v, OP_Once)
31f60 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
31f70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
31f80 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65  omment((v, "mate
31f90 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c  rialize \"%s\"",
31fa0 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
31fb0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ame));.      }el
31fc0 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  se{.        Vdbe
31fd0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
31fe0 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25  "materialize \"%
31ff0 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  s\"", pItem->pTa
32000 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
32010 20 20 7d 0a 20 20 20 20 20 20 70 50 72 69 6f 72    }.      pPrior
32020 20 3d 20 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65   = isSelfJoinVie
32030 77 28 70 54 61 62 4c 69 73 74 2c 20 70 49 74 65  w(pTabList, pIte
32040 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  m);.      if( pP
32050 72 69 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rior ){.        
32060 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
32070 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c  2(v, OP_OpenDup,
32080 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c   pItem->iCursor,
32090 20 70 50 72 69 6f 72 2d 3e 69 43 75 72 73 6f 72   pPrior->iCursor
320a0 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61  );.        expla
320b0 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49 74  inSetInteger(pIt
320c0 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 70  em->iSelectId, p
320d0 50 72 69 6f 72 2d 3e 69 53 65 6c 65 63 74 49 64  Prior->iSelectId
320e0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
320f0 74 28 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65  t( pPrior->pSele
32100 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct!=0 );.       
32110 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f   pSub->nSelectRo
32120 77 20 3d 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c  w = pPrior->pSel
32130 65 63 74 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ect->nSelectRow;
32140 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
32150 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
32160 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
32170 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c  t, SRT_EphemTab,
32180 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
32190 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ;.        explai
321a0 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65  nSetInteger(pIte
321b0 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75  m->iSelectId, (u
321c0 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  8)pParse->iNextS
321d0 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
321e0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
321f0 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64  pParse, pSub, &d
32200 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  est);.      }.  
32210 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
32220 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53  >nRowLogEst = pS
32230 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  ub->nSelectRow;.
32240 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64        if( onceAd
32250 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  dr ) sqlite3Vdbe
32260 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65  JumpHere(v, once
32270 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Addr);.      ret
32280 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
32290 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
322a0 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65  eturn, pItem->re
322b0 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
322c0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
322d0 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d  "end %s", pItem-
322e0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
322f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
32300 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70  eChangeP1(v, top
32310 41 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a  Addr, retAddr);.
32320 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
32330 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
32340 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
32350 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
32360 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
32370 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50  lect_end;.    pP
32380 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
32390 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
323a0 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20  prHeight(p);.   
323b0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
323c0 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
323d0 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69  thContext;.#endi
323e0 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69  f.  }..  /* Vari
323f0 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  ous elements of 
32400 74 68 65 20 53 45 4c 45 43 54 20 63 6f 70 69 65  the SELECT copie
32410 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72  d into local var
32420 69 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20  iables for.  ** 
32430 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20  convenience */. 
32440 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
32450 69 73 74 3b 0a 20 20 70 57 68 65 72 65 20 3d 20  ist;.  pWhere = 
32460 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
32470 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
32480 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
32490 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73   p->pHaving;.  s
324a0 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
324b0 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
324c0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
324d0 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
324e0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
324f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
32500 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
32510 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
32520 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x400,pParse,p,("
32530 41 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63  After all FROM-c
32540 6c 61 75 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c  lause analysis:\
32550 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
32560 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
32570 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
32580 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
32590 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f  ITE_COUNTOFVIEW_
325a0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69  OPTIMIZATION.  i
325b0 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  f( OptimizationE
325c0 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
325d0 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72  E_QueryFlattener
325e0 7c 53 51 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56  |SQLITE_CountOfV
325f0 69 65 77 29 0a 20 20 20 26 26 20 63 6f 75 6e 74  iew).   && count
32600 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69  OfViewOptimizati
32610 6f 6e 28 70 50 61 72 73 65 2c 20 70 29 0a 20 20  on(pParse, p).  
32620 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  ){.    if( db->m
32630 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
32640 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
32650 20 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70     pEList = p->p
32660 45 4c 69 73 74 3b 0a 20 20 20 20 70 54 61 62 4c  EList;.    pTabL
32670 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
32680 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
32690 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
326a0 44 49 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e  DISTINCT with an
326b0 20 4f 52 44 45 52 20 42 59 20 62 75 74 20 69 73   ORDER BY but is
326c0 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
326d0 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20  e, and .  ** if 
326e0 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20  the select-list 
326f0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
32700 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74  he ORDER BY list
32710 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75 65 72  , then this quer
32720 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65  y.  ** can be re
32730 77 72 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f  written as a GRO
32740 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20  UP BY. In other 
32750 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a  words, this:.  *
32760 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
32770 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46  T DISTINCT xyz F
32780 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59  ROM ... ORDER BY
32790 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69   xyz.  **.  ** i
327a0 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f  s transformed to
327b0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
327c0 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20  SELECT xyz FROM 
327d0 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a  ... GROUP BY xyz
327e0 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20   ORDER BY xyz.  
327f0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  **.  ** The seco
32800 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65  nd form is prefe
32810 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65  rred as a single
32820 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d   index (or temp-
32830 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20  table) may be . 
32840 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74   ** used for bot
32850 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61  h the ORDER BY a
32860 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63  nd DISTINCT proc
32870 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69  essing. As origi
32880 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74  nally .  ** writ
32890 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75  ten the query mu
328a0 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61  st use a temp-ta
328b0 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74  ble for at least
328c0 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45   one of the ORDE
328d0 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44  R .  ** BY and D
328e0 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20  ISTINCT, and an 
328f0 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61 74  index or separat
32900 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72  e temp-table for
32910 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f   the other..  */
32920 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
32930 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
32940 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
32950 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a  )==SF_Distinct .
32960 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
32970 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f  rListCompare(sSo
32980 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c  rt.pOrderBy, pEL
32990 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b  ist, -1)==0.  ){
329a0 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
329b0 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
329c0 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d  ;.    pGroupBy =
329d0 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73   p->pGroupBy = s
329e0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
329f0 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29  p(db, pEList, 0)
32a00 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20  ;.    /* Notice 
32a10 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68  that even though
32a20 74 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61  t SF_Distinct ha
32a30 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66  s been cleared f
32a40 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c  rom p->selFlags,
32a50 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73  .    ** the sDis
32a60 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20  tinct.isTnct is 
32a70 73 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63  still set.  Henc
32a80 65 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65 73  e, isTnct repres
32a90 65 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  ents the.    ** 
32aa0 6f 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67  original setting
32ab0 20 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74 69   of the SF_Disti
32ac0 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68  nct flag, not th
32ad0 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e  e current settin
32ae0 67 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  g */.    assert(
32af0 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
32b00 74 20 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  t );..#if SELECT
32b10 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
32b20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
32b30 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
32b40 20 29 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54   ){.      SELECT
32b50 54 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72  TRACE(0x400,pPar
32b60 73 65 2c 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d  se,p,("Transform
32b70 20 44 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 47   DISTINCT into G
32b80 52 4f 55 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20  ROUP BY:\n"));. 
32b90 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
32ba0 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
32bb0 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
32bc0 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  f.  }..  /* If t
32bd0 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
32be0 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
32bf0 20 63 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d   create an ephem
32c00 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20  eral index to.  
32c10 2a 2a 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e  ** do the sortin
32c20 67 2e 20 20 42 75 74 20 74 68 69 73 20 73 6f 72  g.  But this sor
32c30 74 69 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69  ting ephemeral i
32c40 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75  ndex might end u
32c50 70 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75  p.  ** being unu
32c60 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20  sed if the data 
32c70 63 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64  can be extracted
32c80 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f   in pre-sorted o
32c90 72 64 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rder..  ** If th
32ca0 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
32cb0 74 68 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e  then the OP_Open
32cc0 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
32cd0 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20  ction will be.  
32ce0 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e  ** changed to an
32cf0 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65   OP_Noop once we
32d00 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74   figure out that
32d10 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
32d20 65 78 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e  ex is.  ** not n
32d30 65 65 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72  eeded.  The sSor
32d40 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
32d50 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
32d60 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20   to facilitate. 
32d70 20 2a 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e   ** that change.
32d80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72  .  */.  if( sSor
32d90 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  t.pOrderBy ){.  
32da0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
32db0 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  nfo;.    pKeyInf
32dc0 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
32dd0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
32de0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
32df0 30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  0, pEList->nExpr
32e00 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43  );.    sSort.iEC
32e10 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
32e20 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72  nTab++;.    sSor
32e30 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
32e40 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  =.      sqlite3V
32e50 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
32e60 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
32e70 20 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69           sSort.i
32e80 45 43 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70  ECursor, sSort.p
32e90 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31  OrderBy->nExpr+1
32ea0 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  +pEList->nExpr, 
32eb0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63 68  0,.          (ch
32ec0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
32ed0 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29  _KEYINFO.      )
32ee0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
32ef0 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
32f00 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ex = -1;.  }..  
32f10 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
32f20 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
32f30 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
32f40 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
32f50 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
32f60 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
32f70 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
32f80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
32f90 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
32fa0 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e  hemeral, pDest->
32fb0 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  iSDParm, pEList-
32fc0 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  >nExpr);.  }..  
32fd0 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74  /* Set the limit
32fe0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20  er..  */.  iEnd 
32ff0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
33000 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28  eLabel(v);.  if(
33010 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
33020 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d  SF_FixedLimit)==
33030 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c  0 ){.    p->nSel
33040 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f  ectRow = 320;  /
33050 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73  * 4 billion rows
33060 20 2a 2f 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74   */.  }.  comput
33070 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
33080 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29  pParse, p, iEnd)
33090 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
330a0 74 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64  t==0 && sSort.ad
330b0 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29  drSortIndex>=0 )
330c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
330d0 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c  eChangeOpcode(v,
330e0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
330f0 6e 64 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f  ndex, OP_SorterO
33100 70 65 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e  pen);.    sSort.
33110 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52  sortFlags |= SOR
33120 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b  TFLAG_UseSorter;
33130 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
33140 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
33150 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  ex to use for th
33160 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a  e distinct set..
33170 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
33180 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
33190 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73  inct ){.    sDis
331a0 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20  tinct.tabTnct = 
331b0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
331c0 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64      sDistinct.ad
331d0 64 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33  drTnct = sqlite3
331e0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
331f0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a  _OpenEphemeral,.
33200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33210 20 20 20 20 20 20 20 20 20 20 20 20 20 73 44 69               sDi
33220 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20  stinct.tabTnct, 
33230 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
33240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33250 20 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66     (char*)keyInf
33260 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
33270 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  arse, p->pEList,
33280 30 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  0,0),.          
33290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
332a0 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a     P4_KEYINFO);.
332b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
332c0 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45  hangeP5(v, BTREE
332d0 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20  _UNORDERED);.   
332e0 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
332f0 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53  Type = WHERE_DIS
33300 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b  TINCT_UNORDERED;
33310 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44  .  }else{.    sD
33320 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
33330 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e = WHERE_DISTIN
33340 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20  CT_NOOP;.  }..  
33350 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47  if( !isAgg && pG
33360 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20  roupBy==0 ){.   
33370 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65   /* No aggregate
33380 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e   functions and n
33390 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
333a0 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74  e */.    u16 wct
333b0 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74  rlFlags = (sDist
333c0 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48  inct.isTnct ? WH
333d0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
333e0 54 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65  T : 0);.    asse
333f0 72 74 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49  rt( WHERE_USE_LI
33400 4d 49 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d  MIT==SF_FixedLim
33410 69 74 20 29 3b 0a 20 20 20 20 77 63 74 72 6c 46  it );.    wctrlF
33420 6c 61 67 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c  lags |= p->selFl
33430 61 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69  ags & SF_FixedLi
33440 6d 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67  mit;..    /* Beg
33450 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
33460 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 53 45 4c  scan. */.    SEL
33470 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
33480 65 2c 70 2c 28 22 57 68 65 72 65 42 65 67 69 6e  e,p,("WhereBegin
33490 5c 6e 22 29 29 3b 0a 20 20 20 20 70 57 49 6e 66  \n"));.    pWInf
334a0 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
334b0 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
334c0 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
334d0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a  sSort.pOrderBy,.
334e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
334f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
33500 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46  ->pEList, wctrlF
33510 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74  lags, p->nSelect
33520 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 57  Row);.    if( pW
33530 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
33540 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69  elect_end;.    i
33550 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f  f( sqlite3WhereO
33560 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57  utputRowCount(pW
33570 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65  Info) < p->nSele
33580 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70  ctRow ){.      p
33590 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
335a0 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75  qlite3WhereOutpu
335b0 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f  tRowCount(pWInfo
335c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
335d0 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
335e0 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65 72  t && sqlite3Wher
335f0 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e  eIsDistinct(pWIn
33600 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69  fo) ){.      sDi
33610 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
33620 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49   = sqlite3WhereI
33630 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
33640 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
33650 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
33660 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e  ){.      sSort.n
33670 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57  OBSat = sqlite3W
33680 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
33690 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f  Info);.      sSo
336a0 72 74 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72  rt.bOrderedInner
336b0 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 57 68  Loop = sqlite3Wh
336c0 65 72 65 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ereOrderedInnerL
336d0 6f 6f 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  oop(pWInfo);.   
336e0 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42     if( sSort.nOB
336f0 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65  Sat==sSort.pOrde
33700 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
33710 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
33720 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
33730 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
33740 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  If sorting index
33750 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65   that was create
33760 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f  d by a prior OP_
33770 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20  OpenEphemeral . 
33780 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
33790 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62  n ended up not b
337a0 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65  eing needed, the
337b0 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  n change the OP_
337c0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20  OpenEphemeral.  
337d0 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f    ** into an OP_
337e0 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Noop..    */.   
337f0 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53   if( sSort.addrS
33800 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73  ortIndex>=0 && s
33810 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30  Sort.pOrderBy==0
33820 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
33830 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
33840 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53  p(v, sSort.addrS
33850 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d  ortIndex);.    }
33860 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
33870 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
33880 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 61 73 73  loop. */.    ass
33890 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 3d 3d  ert( p->pEList==
338a0 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 65  pEList );.    se
338b0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
338c0 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53  arse, p, -1, &sS
338d0 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c  ort, &sDistinct,
338e0 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
338f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
33900 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65  te3WhereContinue
33910 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20  Label(pWInfo),. 
33920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33930 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
33940 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f  reakLabel(pWInfo
33950 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20  ));..    /* End 
33960 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
33970 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
33980 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
33990 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65  nd(pWInfo);.  }e
339a0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
339b0 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72 65   case when there
339c0 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74 65   exist aggregate
339d0 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20   functions or a 
339e0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a  GROUP BY clause.
339f0 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a      ** or both *
33a00 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  /.    NameContex
33a10 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d  t sNC;    /* Nam
33a20 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72  e context for pr
33a30 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61  ocessing aggrega
33a40 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  te information *
33a50 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b  /.    int iAMem;
33a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
33a70 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
33a80 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65  or storing curre
33a90 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  nt GROUP BY */. 
33aa0 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20     int iBMem;   
33ab0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
33ac0 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
33ad0 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42  previous GROUP B
33ae0 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73  Y */.    int iUs
33af0 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  eFlag;       /* 
33b00 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64  Mem address hold
33b10 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ing flag indicat
33b20 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73  ing that at leas
33b30 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
33b40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65            ** one
33b50 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75   row of the inpu
33b60 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
33b70 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20  tor has been.   
33b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b90 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
33ba0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62  d */.    int iAb
33bb0 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20  ortFlag;     /* 
33bc0 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63  Mem address whic
33bd0 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61  h causes query a
33be0 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65  bort if positive
33bf0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75   */.    int grou
33c00 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52  pBySort;    /* R
33c10 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f  ows come from so
33c20 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59  urce in GROUP BY
33c30 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e   order */.    in
33c40 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
33c50 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63    /* End of proc
33c60 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20  essing for this 
33c70 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e  SELECT */.    in
33c80 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20  t sortPTab = 0; 
33c90 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65    /* Pseudotable
33ca0 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20   used to decode 
33cb0 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20  sorting results 
33cc0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f  */.    int sortO
33cd0 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75  ut = 0;    /* Ou
33ce0 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72  tput register fr
33cf0 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  om the sorter */
33d00 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79  .    int orderBy
33d10 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65  Grp = 0; /* True
33d20 20 69 66 20 74 68 65 20 47 52 4f 55 50 20 42 59   if the GROUP BY
33d30 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72   and ORDER BY ar
33d40 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20  e the same */.. 
33d50 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79     /* Remove any
33d60 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73   and all aliases
33d70 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73   between the res
33d80 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a  ult set and the.
33d90 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20      ** GROUP BY 
33da0 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  clause..    */. 
33db0 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
33dc0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20  ){.      int k; 
33dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33de0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
33df0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
33e00 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
33e10 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a  item *pItem;  /*
33e20 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
33e30 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  r expression in 
33e40 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20  a list */..     
33e50 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74   for(k=p->pEList
33e60 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
33e70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30  ->pEList->a; k>0
33e80 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
33e90 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
33ea0 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  u.x.iAlias = 0;.
33eb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
33ec0 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45  r(k=pGroupBy->nE
33ed0 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75  xpr, pItem=pGrou
33ee0 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  pBy->a; k>0; k--
33ef0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
33f00 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
33f10 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
33f20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
33f30 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   66==sqlite3LogE
33f40 73 74 28 31 30 30 29 20 29 3b 0a 20 20 20 20 20  st(100) );.     
33f50 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
33f60 6f 77 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65  ow>66 ) p->nSele
33f70 63 74 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20  ctRow = 66;.    
33f80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
33f90 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c  ert( 0==sqlite3L
33fa0 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20 20 20  ogEst(1) );.    
33fb0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
33fc0 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
33fd0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62  /* If there is b
33fe0 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59 20 61  oth a GROUP BY a
33ff0 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  nd an ORDER BY c
34000 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79 20 61  lause and they a
34010 72 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69  re.    ** identi
34020 63 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  cal, then it may
34030 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
34040 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45  disable the ORDE
34050 52 20 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20  R BY clause .   
34060 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e   ** on the groun
34070 64 73 20 74 68 61 74 20 74 68 65 20 47 52 4f 55  ds that the GROU
34080 50 20 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20  P BY will cause 
34090 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65  elements to come
340a0 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20   out .    ** in 
340b0 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65  the correct orde
340c0 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e  r. It also may n
340d0 6f 74 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42  ot - the GROUP B
340e0 59 20 6d 69 67 68 74 20 75 73 65 20 61 0a 20 20  Y might use a.  
340f0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e    ** database in
34100 64 65 78 20 74 68 61 74 20 63 61 75 73 65 73 20  dex that causes 
34110 72 6f 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70  rows to be group
34120 65 64 20 74 6f 67 65 74 68 65 72 20 61 73 20 72  ed together as r
34130 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62  equired.    ** b
34140 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ut not actually 
34150 73 6f 72 74 65 64 2e 20 45 69 74 68 65 72 20 77  sorted. Either w
34160 61 79 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66  ay, record the f
34170 61 63 74 20 74 68 61 74 20 74 68 65 0a 20 20 20  act that the.   
34180 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64   ** ORDER BY and
34190 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
341a0 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 62  s are the same b
341b0 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72  y setting the or
341c0 64 65 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20  derByGrp.    ** 
341d0 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  variable.  */.  
341e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
341f0 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72  rListCompare(pGr
34200 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72  oupBy, sSort.pOr
34210 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b  derBy, -1)==0 ){
34220 0a 20 20 20 20 20 20 6f 72 64 65 72 42 79 47 72  .      orderByGr
34230 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20  p = 1;.    }. . 
34240 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c     /* Create a l
34250 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
34260 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
34270 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20  abort the query 
34280 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d  */.    addrEnd =
34290 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
342a0 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
342b0 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c  * Convert TK_COL
342c0 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54  UMN nodes into T
342d0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64  K_AGG_COLUMN and
342e0 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e   make entries in
342f0 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f  .    ** sAggInfo
34300 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f   for all TK_AGG_
34310 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69  FUNCTION nodes i
34320 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  n expressions of
34330 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45   the.    ** SELE
34340 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
34350 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
34360 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
34370 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
34380 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
34390 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
343a0 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20   = pTabList;.   
343b0 20 73 4e 43 2e 75 4e 43 2e 70 41 67 67 49 6e 66   sNC.uNC.pAggInf
343c0 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20  o = &sAggInfo;. 
343d0 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 73 4e 43     VVA_ONLY( sNC
343e0 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43 5f 55 41  .ncFlags = NC_UA
343f0 67 67 49 6e 66 6f 3b 20 29 0a 20 20 20 20 73 41  ggInfo; ).    sA
34400 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70  ggInfo.mnReg = p
34410 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
34420 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72     sAggInfo.nSor
34430 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72  tingColumn = pGr
34440 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79  oupBy ? pGroupBy
34450 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20  ->nExpr : 0;.   
34460 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70   sAggInfo.pGroup
34470 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20  By = pGroupBy;. 
34480 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
34490 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
344a0 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  C, pEList);.    
344b0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
344c0 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
344d0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b  sSort.pOrderBy);
344e0 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
344f0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 47   ){.      if( pG
34500 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
34510 20 20 61 73 73 65 72 74 28 20 70 57 68 65 72 65    assert( pWhere
34520 3d 3d 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a 20  ==p->pWhere );. 
34530 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
34540 48 61 76 69 6e 67 3d 3d 70 2d 3e 70 48 61 76 69  Having==p->pHavi
34550 6e 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ng );.        as
34560 73 65 72 74 28 20 70 47 72 6f 75 70 42 79 3d 3d  sert( pGroupBy==
34570 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 20  p->pGroupBy );. 
34580 20 20 20 20 20 20 20 68 61 76 69 6e 67 54 6f 57         havingToW
34590 68 65 72 65 28 70 50 61 72 73 65 2c 20 70 29 3b  here(pParse, p);
345a0 0a 20 20 20 20 20 20 20 20 70 57 68 65 72 65 20  .        pWhere 
345b0 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  = p->pWhere;.   
345c0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
345d0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
345e0 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48  regates(&sNC, pH
345f0 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20  aving);.    }.  
34600 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75    sAggInfo.nAccu
34610 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e  mulator = sAggIn
34620 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  fo.nColumn;.    
34630 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d  if( p->pGroupBy=
34640 3d 30 20 26 26 20 70 2d 3e 70 48 61 76 69 6e 67  =0 && p->pHaving
34650 3d 3d 30 20 26 26 20 73 41 67 67 49 6e 66 6f 2e  ==0 && sAggInfo.
34660 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20  nFunc==1 ){.    
34670 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20 6d    minMaxFlag = m
34680 69 6e 4d 61 78 51 75 65 72 79 28 64 62 2c 20 73  inMaxQuery(db, s
34690 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d  AggInfo.aFunc[0]
346a0 2e 70 45 78 70 72 2c 20 26 70 4d 69 6e 4d 61 78  .pExpr, &pMinMax
346b0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 65  OrderBy);.    }e
346c0 6c 73 65 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61  lse{.      minMa
346d0 78 46 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52  xFlag = WHERE_OR
346e0 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  DERBY_NORMAL;.  
346f0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
34700 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e   i<sAggInfo.nFun
34710 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  c; i++){.      a
34720 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
34730 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f  roperty(sAggInfo
34740 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c  .aFunc[i].pExpr,
34750 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
34760 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c  ;.      sNC.ncFl
34770 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46  ags |= NC_InAggF
34780 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  unc;.      sqlit
34790 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
347a0 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49  List(&sNC, sAggI
347b0 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
347c0 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
347d0 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20      sNC.ncFlags 
347e0 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63  &= ~NC_InAggFunc
347f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67  ;.    }.    sAgg
34800 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61  Info.mxReg = pPa
34810 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69  rse->nMem;.    i
34820 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
34830 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  led ) goto selec
34840 74 5f 65 6e 64 3b 0a 23 69 66 20 53 45 4c 45 43  t_end;.#if SELEC
34850 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
34860 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
34870 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30  lectTrace & 0x40
34880 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
34890 69 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  i;.      SELECTT
348a0 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73  RACE(0x400,pPars
348b0 65 2c 70 2c 28 22 41 66 74 65 72 20 61 67 67 72  e,p,("After aggr
348c0 65 67 61 74 65 20 61 6e 61 6c 79 73 69 73 3a 5c  egate analysis:\
348d0 6e 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  n"));.      sqli
348e0 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
348f0 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  t(0, p, 0);.    
34900 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73    for(ii=0; ii<s
34910 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
34920 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
34930 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
34940 74 66 28 22 61 67 67 2d 63 6f 6c 75 6d 6e 5b 25  tf("agg-column[%
34950 64 5d 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20  d] iMem=%d\n",. 
34960 20 20 20 20 20 20 20 20 20 20 20 69 69 2c 20 73             ii, s
34970 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d  AggInfo.aCol[ii]
34980 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  .iMem);.        
34990 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
349a0 78 70 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e  xpr(0, sAggInfo.
349b0 61 43 6f 6c 5b 69 69 5d 2e 70 45 78 70 72 2c 20  aCol[ii].pExpr, 
349c0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
349d0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73    for(ii=0; ii<s
349e0 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69  AggInfo.nFunc; i
349f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
34a00 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
34a10 28 22 61 67 67 2d 66 75 6e 63 5b 25 64 5d 3a 20  ("agg-func[%d]: 
34a20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  iMem=%d\n",.    
34a30 20 20 20 20 20 20 20 20 69 69 2c 20 73 41 67 67          ii, sAgg
34a40 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 69  Info.aFunc[ii].i
34a50 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
34a60 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
34a70 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  r(0, sAggInfo.aF
34a80 75 6e 63 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30  unc[ii].pExpr, 0
34a90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
34aa0 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20 2f 2a  .#endif...    /*
34ab0 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   Processing for 
34ac0 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20  aggregates with 
34ad0 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79  GROUP BY is very
34ae0 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20   different and. 
34af0 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20     ** much more 
34b00 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67  complex than agg
34b10 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20  regates without 
34b20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20  a GROUP BY..    
34b30 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  */.    if( pGrou
34b40 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79  pBy ){.      Key
34b50 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
34b60 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72   /* Keying infor
34b70 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67  mation for the g
34b80 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a  roup by clause *
34b90 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
34ba0 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  1;          /* A
34bb0 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f  -vs-B comparisio
34bc0 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20  n jump */.      
34bd0 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f  int addrOutputRo
34be0 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  w;  /* Start of 
34bf0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
34c00 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74  outputs a result
34c10 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e   row */.      in
34c20 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20  t regOutputRow; 
34c30 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72    /* Return addr
34c40 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
34c50 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
34c60 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ne */.      int 
34c70 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20  addrSetAbort;   
34c80 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74  /* Set the abort
34c90 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e   flag and return
34ca0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
34cb0 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a  drTopOfLoop;  /*
34cc0 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75   Top of the inpu
34cd0 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  t loop */.      
34ce0 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49  int addrSortingI
34cf0 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70  dx; /* The OP_Op
34d00 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20  enEphemeral for 
34d10 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
34d20 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  x */.      int a
34d30 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f  ddrReset;      /
34d40 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72  * Subroutine for
34d50 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61   resetting the a
34d60 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20  ccumulator */.  
34d70 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74      int regReset
34d80 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  ;       /* Retur
34d90 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
34da0 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62  er for reset sub
34db0 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20  routine */..    
34dc0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
34dd0 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
34de0 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64  se we might need
34df0 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
34e00 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70   to.      ** imp
34e10 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f  lement it.  Allo
34e20 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e  cate that sortin
34e30 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66  g index now.  If
34e40 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20   it turns out.  
34e50 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
34e60 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66  o not need it af
34e70 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f  ter all, the OP_
34e80 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72  SorterOpen instr
34e90 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  uction.      ** 
34ea0 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
34eb0 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20  d into a Noop.  
34ec0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
34ed0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
34ee0 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
34ef0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79  ab++;.      pKey
34f00 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
34f10 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
34f20 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20  e, pGroupBy, 0, 
34f30 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
34f40 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72  );.      addrSor
34f50 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65  tingIdx = sqlite
34f60 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
34f70 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20  P_SorterOpen, . 
34f80 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
34f90 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41  o.sortingIdx, sA
34fa0 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
34fb0 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20  olumn, .        
34fc0 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79    0, (char*)pKey
34fd0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
34fe0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69  );..      /* Ini
34ff0 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c  tialize memory l
35000 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79  ocations used by
35010 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67   GROUP BY aggreg
35020 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20  ate processing. 
35030 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55       */.      iU
35040 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  seFlag = ++pPars
35050 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69  e->nMem;.      i
35060 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50  AbortFlag = ++pP
35070 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
35080 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d    regOutputRow =
35090 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
350a0 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
350b0 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
350c0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
350d0 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d        regReset =
350e0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
350f0 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74  .      addrReset
35100 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
35110 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
35120 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65    iAMem = pParse
35130 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
35140 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
35150 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
35160 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d  r;.      iBMem =
35170 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
35180 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
35190 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
351a0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
351b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
351c0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
351d0 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   0, iAbortFlag);
351e0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
351f0 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62  nt((v, "clear ab
35200 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
35210 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
35220 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
35230 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29  er, 0, iUseFlag)
35240 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
35250 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
35260 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d  e accumulator em
35270 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71  pty"));.      sq
35280 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
35290 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69  v, OP_Null, 0, i
352a0 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f  AMem, iAMem+pGro
352b0 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  upBy->nExpr-1);.
352c0 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  .      /* Begin 
352d0 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c  a loop that will
352e0 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75   extract all sou
352f0 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55  rce rows in GROU
35300 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20  P BY order..    
35310 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
35320 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61  involve two sepa
35330 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20  rate loops with 
35340 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65  an OP_Sort in be
35350 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20  tween, or.      
35360 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ** it might be a
35370 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61   single loop tha
35380 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20  t uses an index 
35390 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72  to extract infor
353a0 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  mation.      ** 
353b0 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64  in the right ord
353c0 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68  er to begin with
353d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
353e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
353f0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
35400 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
35410 73 65 74 29 3b 0a 20 20 20 20 20 20 53 45 4c 45  set);.      SELE
35420 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
35430 2c 70 2c 28 22 57 68 65 72 65 42 65 67 69 6e 5c  ,p,("WhereBegin\
35440 6e 22 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  n"));.      pWIn
35450 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
35460 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
35470 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
35480 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20   pGroupBy, 0,.  
35490 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 47 52          WHERE_GR
354a0 4f 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79  OUPBY | (orderBy
354b0 47 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54  Grp ? WHERE_SORT
354c0 42 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a  BYGROUP : 0), 0.
354d0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
354e0 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
354f0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
35500 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
35510 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
35520 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42  pWInfo)==pGroupB
35530 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
35540 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d      /* The optim
35550 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20  izer is able to 
35560 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20  deliver rows in 
35570 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73  group by order s
35580 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20  o.        ** we 
35590 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73  do not have to s
355a0 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65  ort.  The OP_Ope
355b0 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65  nEphemeral table
355c0 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
355d0 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61   ** cancelled la
355e0 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73  ter because we s
355f0 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65  till need to use
35600 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20   the pKeyInfo.  
35610 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
35620 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30   groupBySort = 0
35630 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
35640 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61         /* Rows a
35650 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e  re coming out in
35660 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72   undetermined or
35670 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f  der.  We have to
35680 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a   push.        **
35690 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61   each row into a
356a0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20   sorting index, 
356b0 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69  terminate the fi
356c0 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20  rst loop,.      
356d0 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f    ** then loop o
356e0 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  ver the sorting 
356f0 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74  index in order t
35700 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74  o get the output
35710 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73  .        ** in s
35720 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20  orted order.    
35730 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
35740 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20  nt regBase;.    
35750 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72      int regRecor
35760 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  d;.        int n
35770 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Col;.        int
35780 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20   nGroupBy;..    
35790 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
357a0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20  able(pParse, .  
357b0 20 20 20 20 20 20 20 20 20 20 28 73 44 69 73 74            (sDist
357c0 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28  inct.isTnct && (
357d0 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44  p->selFlags&SF_D
357e0 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20  istinct)==0) ?. 
357f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35800 20 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20     "DISTINCT" : 
35810 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20  "GROUP BY");..  
35820 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
35830 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e  t = 1;.        n
35840 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
35850 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
35860 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70     nCol = nGroup
35870 42 79 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  By;.        j = 
35880 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  nGroupBy;.      
35890 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
358a0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
358b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
358c0 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  f( sAggInfo.aCol
358d0 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  [i].iSorterColum
358e0 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
358f0 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20      nCol++;.    
35900 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
35910 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35920 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61   }.        regBa
35930 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  se = sqlite3GetT
35940 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
35950 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
35960 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
35970 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
35980 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
35990 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
359a0 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c  Parse, pGroupBy,
359b0 20 72 65 67 42 61 73 65 2c 20 30 2c 20 30 29 3b   regBase, 0, 0);
359c0 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
359d0 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66  oupBy;.        f
359e0 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
359f0 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
35a00 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
35a10 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
35a20 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f  pCol = &sAggInfo
35a30 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  .aCol[i];.      
35a40 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
35a50 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
35a60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
35a70 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61  t r1 = j + regBa
35a80 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se;.            
35a90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
35aa0 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 70 50  etColumnToReg(pP
35ab0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
35ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ad0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62        pCol->pTab
35ae0 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c  , pCol->iColumn,
35af0 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72   pCol->iTable, r
35b00 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
35b10 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
35b20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35b30 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73     regRecord = s
35b40 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
35b50 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
35b60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
35b70 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
35b80 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e  cord, regBase, n
35b90 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Col, regRecord);
35ba0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35bb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
35bc0 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73  _SorterInsert, s
35bd0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
35be0 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  dx, regRecord);.
35bf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
35c00 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
35c10 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
35c20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
35c30 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
35c40 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
35c50 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
35c60 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
35c70 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
35c80 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
35c90 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72  ingIdxPTab = sor
35ca0 74 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  tPTab = pParse->
35cb0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
35cc0 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65  sortOut = sqlite
35cd0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
35ce0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
35cf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
35d00 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
35d10 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f   sortPTab, sortO
35d20 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  ut, nCol);.     
35d30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
35d40 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
35d50 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  rSort, sAggInfo.
35d60 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
35d70 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64  End);.        Vd
35d80 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
35d90 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b  ROUP BY sort"));
35da0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
35db0 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e  ;.        sAggIn
35dc0 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  fo.useSortingIdx
35dd0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71   = 1;.        sq
35de0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
35df0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  ear(pParse);..  
35e00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
35e10 49 66 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20  If the index or 
35e20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
35e30 75 73 65 64 20 62 79 20 74 68 65 20 47 52 4f 55  used by the GROU
35e40 50 20 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20  P BY sort.      
35e50 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c  ** will naturall
35e60 79 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69  y deliver rows i
35e70 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65 71 75  n the order requ
35e80 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 44 45  ired by the ORDE
35e90 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c  R BY.      ** cl
35ea0 61 75 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65  ause, cancel the
35eb0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
35ec0 20 6f 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c   open coded earl
35ed0 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ier..      **.  
35ee0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61      ** This is a
35ef0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d  n optimization -
35f00 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
35f10 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c  wer should resul
35f20 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20  t regardless..  
35f30 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53      ** Use the S
35f40 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64  QLITE_GroupByOrd
35f50 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c  er flag with SQL
35f60 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
35f70 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20  IMIZER to .     
35f80 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73   ** disable this
35f90 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
35fa0 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
35fb0 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  es.  */.      if
35fc0 28 20 6f 72 64 65 72 42 79 47 72 70 20 26 26 20  ( orderByGrp && 
35fd0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
35fe0 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47  led(db, SQLITE_G
35ff0 72 6f 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20  roupByOrder) .  
36000 20 20 20 20 20 26 26 20 28 67 72 6f 75 70 42 79       && (groupBy
36010 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57  Sort || sqlite3W
36020 68 65 72 65 49 73 53 6f 72 74 65 64 28 70 57 49  hereIsSorted(pWI
36030 6e 66 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20  nfo)).      ){. 
36040 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72         sSort.pOr
36050 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
36060 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
36070 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53  angeToNoop(v, sS
36080 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
36090 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  x);.      }..   
360a0 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
360b0 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
360c0 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74   BY terms and st
360d0 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62  ore in b0, b1, b
360e0 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62  2....      ** (b
360f0 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  0 is memory loca
36100 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31  tion iBMem+0, b1
36110 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64   is iBMem+1, and
36120 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20   so forth).     
36130 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65   ** Then compare
36140 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
36150 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69  UP BY terms agai
36160 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  nst the GROUP BY
36170 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20   terms.      ** 
36180 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
36190 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20  s row currently 
361a0 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31  stored in a0, a1
361b0 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  , a2....      */
361c0 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66  .      addrTopOf
361d0 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
361e0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
361f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
36200 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
36210 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  arse);.      if(
36220 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
36230 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
36240 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
36250 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67 67  SorterData, sAgg
36260 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
36270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36280 20 20 20 20 20 20 20 20 20 20 20 73 6f 72 74 4f             sortO
36290 75 74 2c 20 73 6f 72 74 50 54 61 62 29 3b 0a 20  ut, sortPTab);. 
362a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
362b0 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79  (j=0; j<pGroupBy
362c0 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
362d0 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70         if( group
362e0 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
362f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
36300 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
36310 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c  mn, sortPTab, j,
36320 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
36330 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36340 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72      sAggInfo.dir
36350 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ectMode = 1;.   
36360 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
36370 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
36380 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45  GroupBy->a[j].pE
36390 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  xpr, iBMem+j);. 
363a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
363b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
363c0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
363d0 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69  ompare, iAMem, i
363e0 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  BMem, pGroupBy->
363f0 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
36400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36410 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
36420 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
36430 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  fo), P4_KEYINFO)
36440 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20  ;.      addr1 = 
36450 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
36460 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
36470 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
36480 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
36490 64 64 72 31 2b 31 2c 20 30 2c 20 61 64 64 72 31  ddr1+1, 0, addr1
364a0 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +1); VdbeCoverag
364b0 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  e(v);..      /* 
364c0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
364d0 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72  at runs whenever
364e0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 68   the GROUP BY ch
364f0 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  anges..      ** 
36500 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47  Changes in the G
36510 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74 65  ROUP BY are dete
36520 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76  cted by the prev
36530 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20  ious code.      
36540 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68  ** block.  If th
36550 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e  ere were no chan
36560 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20  ges, this block 
36570 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20  is skipped..    
36580 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
36590 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63  is code copies c
365a0 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20  urrent group by 
365b0 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62  terms in b0,b1,b
365c0 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f  2,....      ** o
365d0 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e  ver to a0,a1,a2.
365e0 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20    It then calls 
365f0 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f  the output subro
36600 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61  utine.      ** a
36610 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61 67  nd resets the ag
36620 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
36630 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69 6e  tor registers in
36640 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20   preparation.   
36650 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65     ** for the ne
36660 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74 63  xt GROUP BY batc
36670 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
36680 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
36690 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42  eMove(pParse, iB
366a0 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f  Mem, iAMem, pGro
366b0 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  upBy->nExpr);.  
366c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
366d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
366e0 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c  b, regOutputRow,
366f0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
36700 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
36710 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f  nt((v, "output o
36720 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20  ne row"));.     
36730 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
36740 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p2(v, OP_IfPos, 
36750 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72  iAbortFlag, addr
36760 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61  End); VdbeCovera
36770 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62  ge(v);.      Vdb
36780 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68  eComment((v, "ch
36790 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29  eck abort flag")
367a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
367b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
367c0 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
367d0 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
367e0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
367f0 28 76 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d  (v, "reset accum
36800 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  ulator"));..    
36810 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
36820 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
36830 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20  lators based on 
36840 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20  the content of. 
36850 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72       ** the curr
36860 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f  ent row.      */
36870 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
36880 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
36890 64 72 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61  dr1);.      upda
368a0 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
368b0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
368c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
368d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
368e0 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65  Integer, 1, iUse
368f0 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
36900 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
36910 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61  dicate data in a
36920 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
36930 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
36940 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a  the loop.      *
36950 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75  /.      if( grou
36960 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
36970 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
36980 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
36990 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e  rNext, sAggInfo.
369a0 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
369b0 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20  TopOfLoop);.    
369c0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
369d0 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (v);.      }else
369e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
369f0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
36a00 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
36a10 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
36a20 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e  op(v, addrSortin
36a30 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  gIdx);.      }..
36a40 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
36a50 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66  the final row of
36a60 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f   result.      */
36a70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
36a80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
36a90 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52  osub, regOutputR
36aa0 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ow, addrOutputRo
36ab0 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
36ac0 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75  mment((v, "outpu
36ad0 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a  t final row"));.
36ae0 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f  .      /* Jump o
36af0 76 65 72 20 74 68 65 20 73 75 62 72 6f 75 74 69  ver the subrouti
36b00 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nes.      */.   
36b10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
36b20 74 6f 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a  to(v, addrEnd);.
36b30 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
36b40 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
36b50 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73  that outputs a s
36b60 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
36b70 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
36b80 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72   set.  This subr
36b90 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f  outine first loo
36ba0 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c  ks at the iUseFl
36bb0 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67  ag.  If iUseFlag
36bc0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73  .      ** is les
36bd0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
36be0 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62  to zero, the sub
36bf0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
36c00 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a  op.  If.      **
36c10 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
36c20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75  calls for the qu
36c30 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68  ery to abort, th
36c40 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  is subroutine.  
36c50 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74      ** increment
36c60 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67  s the iAbortFlag
36c70 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
36c80 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
36c90 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72  g in.      ** or
36ca0 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  der to signal th
36cb0 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72  e caller to abor
36cc0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
36cd0 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d    addrSetAbort =
36ce0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
36cf0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
36d00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
36d10 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
36d20 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67  r, 1, iAbortFlag
36d30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
36d40 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62  ment((v, "set ab
36d50 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
36d60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
36d70 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
36d80 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
36d90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
36da0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
36db0 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  v, addrOutputRow
36dc0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  );.      addrOut
36dd0 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
36de0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
36df0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
36e00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
36e10 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61  P_IfPos, iUseFla
36e20 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
36e30 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +2);.      VdbeC
36e40 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
36e50 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
36e60 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c  , "Groupby resul
36e70 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72  t generator entr
36e80 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20  y point"));.    
36e90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
36ea0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
36eb0 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
36ec0 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41  .      finalizeA
36ed0 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
36ee0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
36ef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
36f00 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
36f10 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75   pHaving, addrOu
36f20 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54  tputRow+1, SQLIT
36f30 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
36f40 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
36f50 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
36f60 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20 20  -1, &sSort,.    
36f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f80 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44    &sDistinct, pD
36f90 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
36fa0 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f             addrO
36fb0 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72  utputRow+1, addr
36fc0 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20  SetAbort);.     
36fd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
36fe0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
36ff0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
37000 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
37010 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70  t((v, "end group
37020 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
37030 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
37040 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
37050 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
37060 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75  l reset the grou
37070 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72  p-by accumulator
37080 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
37090 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
370a0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52  veLabel(v, addrR
370b0 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73  eset);.      res
370c0 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
370d0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
370e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
370f0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
37100 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74  Return, regReset
37110 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f  );.     .    } /
37120 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79  * endif pGroupBy
37130 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65 67 61  .  Begin aggrega
37140 74 65 20 71 75 65 72 69 65 73 20 77 69 74 68 6f  te queries witho
37150 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a  ut GROUP BY: */.
37160 20 20 20 20 65 6c 73 65 20 7b 0a 23 69 66 6e 64      else {.#ifnd
37170 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
37180 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20  TREECOUNT.      
37190 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
371a0 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 69     if( (pTab = i
371b0 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20  sSimpleCount(p, 
371c0 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29  &sAggInfo))!=0 )
371d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
371e0 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20  isSimpleCount() 
371f0 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
37200 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72  r to a Table str
37210 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20  ucture, then.   
37220 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20       ** the SQL 
37230 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20  statement is of 
37240 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20  the form:.      
37250 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
37260 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
37270 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20  ) FROM <tbl>.   
37280 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
37290 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54 61 62  ** where the Tab
372a0 6c 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74  le structure ret
372b0 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73  urned represents
372c0 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20   table <tbl>..  
372d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
372e0 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65   ** This stateme
372f0 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20  nt is so common 
37300 74 68 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d  that it is optim
37310 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20  ized specially. 
37320 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  The.        ** O
37330 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74  P_Count instruct
37340 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64 20  ion is executed 
37350 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e  either on the in
37360 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a  tkey table that.
37370 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
37380 69 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f 72  ins the data for
37390 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20   table <tbl> or 
373a0 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e  on one of its in
373b0 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20  dexes. It.      
373c0 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74    ** is better t
373d0 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 6f 70  o execute the op
373e0 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73   on an index, as
373f0 20 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d   indexes are alm
37400 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ost.        ** a
37410 6c 77 61 79 73 20 73 70 72 65 61 64 20 61 63 72  lways spread acr
37420 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73 20 74  oss less pages t
37430 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73  han their corres
37440 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a  ponding tables..
37450 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
37460 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62     const int iDb
37470 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
37480 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
37490 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
374a0 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  a);.        cons
374b0 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61  t int iCsr = pPa
374c0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
374d0 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63   /* Cursor to sc
374e0 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20  an b-tree */.   
374f0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
37500 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
37520 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
37530 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  /.        KeyInf
37540 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b  o *pKeyInfo = 0;
37550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37560 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63  * Keyinfo for sc
37570 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20  anned index */. 
37580 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42         Index *pB
37590 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
375a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
375b0 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20  est index found 
375c0 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
375d0 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54    int iRoot = pT
375e0 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20  ab->tnum;       
375f0 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
37600 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62  age of scanned b
37610 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20  -tree */..      
37620 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
37630 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
37640 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
37650 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
37660 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
37670 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
37680 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  b->zName);..    
37690 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
376a0 72 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  r the index that
376b0 20 68 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20   has the lowest 
376c0 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20  scan cost..     
376d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
376e0 20 28 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f   (2011-04-15) Do
376f0 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73   not do a full s
37700 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65  can of an unorde
37710 72 65 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  red index..     
37720 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
37730 20 28 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f   (2013-10-03) Do
37740 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65   not count the e
37750 6e 74 72 69 65 73 20 69 6e 20 61 20 70 61 72 74  ntries in a part
37760 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  ial index..     
37770 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
37780 20 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 65   In practice the
37790 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
377a0 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  re will not be u
377b0 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20  sed. It is only 
377c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73  .        ** pass
377d0 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70  ed to keep OP_Op
377e0 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20  enRead happy..  
377f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
37800 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
37810 54 61 62 29 20 29 20 70 42 65 73 74 20 3d 20 73  Tab) ) pBest = s
37820 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
37830 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
37840 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
37850 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
37860 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
37870 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  xt){.          i
37880 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65  f( pIdx->bUnorde
37890 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  red==0.         
378a0 20 20 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78    && pIdx->szIdx
378b0 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52  Row<pTab->szTabR
378c0 6f 77 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  ow.           &&
378d0 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
378e0 68 65 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20  here==0.        
378f0 20 20 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c     && (!pBest ||
37900 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c   pIdx->szIdxRow<
37910 70 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29  pBest->szIdxRow)
37920 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
37930 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74 20            pBest 
37940 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20  = pIdx;.        
37950 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
37960 20 20 20 20 20 20 69 66 28 20 70 42 65 73 74 20        if( pBest 
37970 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f  ){.          iRo
37980 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d  ot = pBest->tnum
37990 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79  ;.          pKey
379a0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
379b0 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61  yInfoOfIndex(pPa
379c0 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20  rse, pBest);.   
379d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
379e0 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f  /* Open a read-o
379f0 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63  nly cursor, exec
37a00 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74  ute the OP_Count
37a10 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73  , close the curs
37a20 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  or. */.        s
37a30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
37a40 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Int(v, OP_OpenRe
37a50 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c  ad, iCsr, iRoot,
37a60 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20   iDb, 1);.      
37a70 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
37a80 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
37a90 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
37aa0 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70  v, -1, (char *)p
37ab0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
37ac0 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NFO);.        }.
37ad0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
37ae0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
37af0 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67  Count, iCsr, sAg
37b00 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69  gInfo.aFunc[0].i
37b10 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
37b20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
37b30 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73  v, OP_Close, iCs
37b40 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c  r);.        expl
37b50 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70  ainSimpleCount(p
37b60 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65  Parse, pTab, pBe
37b70 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
37b80 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
37b90 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
37ba0 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20  T */.      {.   
37bb0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73       /* This cas
37bc0 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67  e runs if the ag
37bd0 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47  gregate has no G
37be0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
37bf0 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
37c00 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75  processing is mu
37c10 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65  ch simpler since
37c20 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61   there is only a
37c30 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20   single row.    
37c40 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74      ** of output
37c50 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
37c60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
37c70 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
37c80 20 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75         resetAccu
37c90 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
37ca0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 0a 20 20 20  &sAggInfo);..   
37cb0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
37cc0 71 75 65 72 79 20 69 73 20 61 20 63 61 6e 64 69  query is a candi
37cd0 64 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e  date for the min
37ce0 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f  /max optimizatio
37cf0 6e 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  n, then.        
37d00 2a 2a 20 6d 69 6e 4d 61 78 46 6c 61 67 20 77 69  ** minMaxFlag wi
37d10 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ll have been pre
37d20 76 69 6f 75 73 6c 79 20 73 65 74 20 74 6f 20 65  viously set to e
37d30 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  ither.        **
37d40 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
37d50 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45  IN or WHERE_ORDE
37d60 52 42 59 5f 4d 41 58 20 61 6e 64 20 70 4d 69 6e  RBY_MAX and pMin
37d70 4d 61 78 4f 72 64 65 72 42 79 20 77 69 6c 6c 0a  MaxOrderBy will.
37d80 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 61 6e          ** be an
37d90 20 61 70 70 72 6f 70 72 69 61 74 65 20 4f 52 44   appropriate ORD
37da0 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e  ER BY expression
37db0 20 66 6f 72 20 74 68 65 20 6f 70 74 69 6d 69 7a   for the optimiz
37dc0 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ation..        *
37dd0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
37de0 28 20 6d 69 6e 4d 61 78 46 6c 61 67 3d 3d 57 48  ( minMaxFlag==WH
37df0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
37e00 41 4c 20 7c 7c 20 70 4d 69 6e 4d 61 78 4f 72 64  AL || pMinMaxOrd
37e10 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 20 20 20  erBy!=0 );.     
37e20 20 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d     assert( pMinM
37e30 61 78 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  axOrderBy==0 || 
37e40 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 2d 3e  pMinMaxOrderBy->
37e50 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 0a 20 20 20  nExpr==1 );..   
37e60 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
37e70 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68  (1,pParse,p,("Wh
37e80 65 72 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20  ereBegin\n"));. 
37e90 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20         pWInfo = 
37ea0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
37eb0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
37ec0 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e  st, pWhere, pMin
37ed0 4d 61 78 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  MaxOrderBy,.    
37ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
37f00 2c 20 6d 69 6e 4d 61 78 46 6c 61 67 2c 20 30 29  , minMaxFlag, 0)
37f10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57  ;.        if( pW
37f20 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Info==0 ){.     
37f30 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
37f40 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
37f50 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41 63          updateAc
37f60 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
37f70 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
37f80 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
37f90 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
37fa0 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20  pWInfo)>0 ){.   
37fb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
37fc0 62 65 47 6f 74 6f 28 76 2c 20 73 71 6c 69 74 65  beGoto(v, sqlite
37fd0 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c  3WhereBreakLabel
37fe0 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  (pWInfo));.     
37ff0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
38000 28 28 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e  ((v, "%s() by in
38010 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20  dex",.          
38020 20 20 20 20 20 20 28 6d 69 6e 4d 61 78 46 6c 61        (minMaxFla
38030 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g==WHERE_ORDERBY
38040 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22  _MIN?"min":"max"
38050 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  )));.        }. 
38060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
38070 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
38080 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65          finalize
38090 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
380a0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
380b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
380c0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
380d0 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
380e0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
380f0 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
38100 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55  drEnd, SQLITE_JU
38110 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
38120 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
38130 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20  (pParse, p, -1, 
38140 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  0, 0, .         
38150 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
38160 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64  st, addrEnd, add
38170 72 45 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rEnd);.    }.   
38180 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
38190 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
381a0 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f  End);.    .  } /
381b0 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74  * endif aggregat
381c0 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66  e query */..  if
381d0 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63  ( sDistinct.eTnc
381e0 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53  tType==WHERE_DIS
381f0 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20  TINCT_UNORDERED 
38200 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
38210 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  mpTable(pParse, 
38220 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d  "DISTINCT");.  }
38230 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
38240 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
38250 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e  lause, then we n
38260 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20  eed to sort the 
38270 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64  results.  ** and
38280 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68   send them to th
38290 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62  e callback one b
382a0 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  y one..  */.  if
382b0 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
382c0 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54   ){.    explainT
382d0 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
382e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
382f0 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53        sSort.nOBS
38300 61 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41  at>0 ? "RIGHT PA
38310 52 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a  RT OF ORDER BY":
38320 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20  "ORDER BY");.   
38330 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
38340 73 74 3d 3d 70 45 4c 69 73 74 20 29 3b 0a 20 20  st==pEList );.  
38350 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
38360 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73  il(pParse, p, &s
38370 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Sort, pEList->nE
38380 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  xpr, pDest);.  }
38390 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
383a0 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75   to skip this qu
383b0 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
383c0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
383d0 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20  el(v, iEnd);..  
383e0 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 68 61  /* The SELECT ha
383f0 73 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 49 66  s been coded. If
38400 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72   there is an err
38410 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73 65 20  or in the Parse 
38420 73 74 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20  structure,.  ** 
38430 73 65 74 20 74 68 65 20 72 65 74 75 7