/ Hex Artifact Content
Login

Artifact 75ae3000bef42ea6a7271cf49f6bc5e94bdbf73026ddea251f2a8b6cf14960fd:


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: 61 64 64 72 45 78 70 6c 61 69 6e 2c 28 53 29 29  addrExplain,(S))
02e0: 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ,\.    sqlite3De
02f0: 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65 6c 73  bugPrintf X.#els
0300: 65 0a 23 20 64 65 66 69 6e 65 20 53 45 4c 45 43  e.# define SELEC
0310: 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c 58 29 0a  TTRACE(K,P,S,X).
0320: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
0330: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0340: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65  e following obje
0350: 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  ct is used to re
0360: 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  cord information
0370: 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f   about.** how to
0380: 20 70 72 6f 63 65 73 73 20 74 68 65 20 44 49 53   process the DIS
0390: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 2c 20 74  TINCT keyword, t
03a0: 6f 20 73 69 6d 70 6c 69 66 79 20 70 61 73 73 69  o simplify passi
03b0: 6e 67 20 74 68 61 74 20 69 6e 66 6f 72 6d 61 74  ng that informat
03c0: 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  ion.** into the 
03d0: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
03e0: 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79  ) routine..*/.ty
03f0: 70 65 64 65 66 20 73 74 72 75 63 74 20 44 69 73  pedef struct Dis
0400: 74 69 6e 63 74 43 74 78 20 44 69 73 74 69 6e 63  tinctCtx Distinc
0410: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 44 69 73  tCtx;.struct Dis
0420: 74 69 6e 63 74 43 74 78 20 7b 0a 20 20 75 38 20  tinctCtx {.  u8 
0430: 69 73 54 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20  isTnct;      /* 
0440: 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
0450: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
0460: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20  present */.  u8 
0470: 65 54 6e 63 74 54 79 70 65 3b 20 20 20 2f 2a 20  eTnctType;   /* 
0480: 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
0490: 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72  _DISTINCT_* oper
04a0: 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74  ators */.  int t
04b0: 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70  abTnct;    /* Ep
04c0: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73  hemeral table us
04d0: 65 64 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20  ed for DISTINCT 
04e0: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20  processing */.  
04f0: 69 6e 74 20 61 64 64 72 54 6e 63 74 3b 20 20 20  int addrTnct;   
0500: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
0510: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f  _OpenEphemeral o
0520: 70 63 6f 64 65 20 66 6f 72 20 74 61 62 54 6e 63  pcode for tabTnc
0530: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
0540: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0550: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65  e following obje
0560: 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  ct is used to re
0570: 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  cord information
0580: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 4f 52   about.** the OR
0590: 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50  DER BY (or GROUP
05a0: 20 42 59 29 20 63 6c 61 75 73 65 20 6f 66 20 71   BY) clause of q
05b0: 75 65 72 79 20 69 73 20 62 65 69 6e 67 20 63 6f  uery is being co
05c0: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ded..**.** The a
05d0: 44 65 66 65 72 5b 5d 20 61 72 72 61 79 20 69 73  Defer[] array is
05e0: 20 75 73 65 64 20 62 79 20 74 68 65 20 73 6f 72   used by the sor
05f0: 74 65 72 2d 72 65 66 65 72 65 6e 63 65 73 20 6f  ter-references o
0600: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 46 6f 72  ptimization. For
0610: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  .** example, ass
0620: 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 6e  uming there is n
0630: 6f 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e  o index that can
0640: 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
0650: 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 66 6f   ORDER BY,.** fo
0660: 72 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a  r the query:.**.
0670: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c  **     SELECT a,
0680: 20 62 69 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31   bigblob FROM t1
0690: 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49   ORDER BY a LIMI
06a0: 54 20 31 30 3b 0a 2a 2a 0a 2a 2a 20 69 74 20 6d  T 10;.**.** it m
06b0: 61 79 20 62 65 20 6d 6f 72 65 20 65 66 66 69 63  ay be more effic
06c0: 69 65 6e 74 20 74 6f 20 61 64 64 20 6a 75 73 74  ient to add just
06d0: 20 74 68 65 20 22 61 22 20 76 61 6c 75 65 73 20   the "a" values 
06e0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c 20 61  to the sorter, a
06f0: 6e 64 0a 2a 2a 20 72 65 74 72 69 65 76 65 20 74  nd.** retrieve t
0700: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 62  he associated "b
0710: 69 67 62 6c 6f 62 22 20 76 61 6c 75 65 73 20 64  igblob" values d
0720: 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 61 62  irectly from tab
0730: 6c 65 20 74 31 20 61 73 20 74 68 65 0a 2a 2a 20  le t1 as the.** 
0740: 31 30 20 73 6d 61 6c 6c 65 73 74 20 22 61 22 20  10 smallest "a" 
0750: 76 61 6c 75 65 73 20 61 72 65 20 65 78 74 72 61  values are extra
0760: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 6f  cted from the so
0770: 72 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  rter..**.** When
0780: 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65   the sorter-refe
0790: 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69  rence optimizati
07a0: 6f 6e 20 69 73 20 75 73 65 64 2c 20 74 68 65 72  on is used, ther
07b0: 65 20 69 73 20 6f 6e 65 20 65 6e 74 72 79 20 69  e is one entry i
07c0: 6e 20 74 68 65 0a 2a 2a 20 61 44 65 66 65 72 5b  n the.** aDefer[
07d0: 5d 20 61 72 72 61 79 20 66 6f 72 20 65 61 63 68  ] array for each
07e0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
07f0: 74 68 61 74 20 6d 61 79 20 62 65 20 72 65 61 64  that may be read
0800: 20 61 73 20 76 61 6c 75 65 73 20 61 72 65 0a 2a   as values are.*
0810: 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  * extracted from
0820: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
0830: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
0840: 6f 72 74 43 74 78 20 53 6f 72 74 43 74 78 3b 0a  ortCtx SortCtx;.
0850: 73 74 72 75 63 74 20 53 6f 72 74 43 74 78 20 7b  struct SortCtx {
0860: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
0870: 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
0880: 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f  ORDER BY (or GRO
0890: 55 50 20 42 59 20 63 6c 61 75 73 65 29 20 2a 2f  UP BY clause) */
08a0: 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20  .  int nOBSat;  
08b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
08c0: 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74  er of ORDER BY t
08d0: 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 62  erms satisfied b
08e0: 79 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  y indices */.  i
08f0: 6e 74 20 69 45 43 75 72 73 6f 72 3b 20 20 20 20  nt iECursor;    
0900: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
0910: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73 6f  umber for the so
0920: 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  rter */.  int re
0930: 67 52 65 74 75 72 6e 3b 20 20 20 20 20 20 20 20  gReturn;        
0940: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
0950: 69 6e 67 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74  ing block-output
0960: 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
0970: 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b  */.  int labelBk
0980: 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 74  Out;       /* St
0990: 61 72 74 20 6c 61 62 65 6c 20 66 6f 72 20 74 68  art label for th
09a0: 65 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73  e block-output s
09b0: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
09c0: 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  nt addrSortIndex
09d0: 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  ;    /* Address 
09e0: 6f 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72  of the OP_Sorter
09f0: 4f 70 65 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45  Open or OP_OpenE
0a00: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 69 6e  phemeral */.  in
0a10: 74 20 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20  t labelDone;    
0a20: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
0a30: 20 77 68 65 6e 20 64 6f 6e 65 2c 20 65 78 3a 20   when done, ex: 
0a40: 4c 49 4d 49 54 20 72 65 61 63 68 65 64 20 2a 2f  LIMIT reached */
0a50: 0a 20 20 75 38 20 73 6f 72 74 46 6c 61 67 73 3b  .  u8 sortFlags;
0a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f           /* Zero
0a70: 20 6f 72 20 6d 6f 72 65 20 53 4f 52 54 46 4c 41   or more SORTFLA
0a80: 47 5f 2a 20 62 69 74 73 20 2a 2f 0a 20 20 75 38  G_* bits */.  u8
0a90: 20 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f   bOrderedInnerLo
0aa0: 6f 70 3b 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  op; /* ORDER BY 
0ab0: 63 6f 72 72 65 63 74 6c 79 20 73 6f 72 74 73 20  correctly sorts 
0ac0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a  the inner loop *
0ad0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
0ae0: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
0af0: 46 45 52 45 4e 43 45 53 0a 20 20 75 38 20 6e 44  FERENCES.  u8 nD
0b00: 65 66 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  efer;           
0b10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
0b20: 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61  lid entries in a
0b30: 44 65 66 65 72 5b 5d 20 2a 2f 0a 20 20 73 74 72  Defer[] */.  str
0b40: 75 63 74 20 44 65 66 65 72 72 65 64 43 73 72 20  uct DeferredCsr 
0b50: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
0b60: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  b;        /* Tab
0b70: 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f  le definition */
0b80: 0a 20 20 20 20 69 6e 74 20 69 43 73 72 3b 20 20  .    int iCsr;  
0b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
0ba0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61  or number for ta
0bb0: 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ble */.    int n
0bc0: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Key;           /
0bd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 4b 20 63  * Number of PK c
0be0: 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 61 62 6c 65  olumns for table
0bf0: 20 70 54 61 62 20 28 3e 3d 31 29 20 2a 2f 0a 20   pTab (>=1) */. 
0c00: 20 7d 20 61 44 65 66 65 72 5b 34 5d 3b 0a 23 65   } aDefer[4];.#e
0c10: 6e 64 69 66 0a 7d 3b 0a 23 64 65 66 69 6e 65 20  ndif.};.#define 
0c20: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
0c30: 65 72 20 20 30 78 30 31 20 20 20 2f 2a 20 55 73  er  0x01   /* Us
0c40: 65 20 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73  e SorterOpen ins
0c50: 74 65 61 64 20 6f 66 20 4f 70 65 6e 45 70 68 65  tead of OpenEphe
0c60: 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  meral */../*.** 
0c70: 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20 63  Delete all the c
0c80: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c 65  ontent of a Sele
0c90: 63 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 44  ct structure.  D
0ca0: 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 74  eallocate the st
0cb0: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
0cc0: 66 20 6f 6e 6c 79 20 69 66 20 62 46 72 65 65 20  f only if bFree 
0cd0: 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
0ce0: 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65 6c  ic void clearSel
0cf0: 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ect(sqlite3 *db,
0d00: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
0d10: 62 46 72 65 65 29 7b 0a 20 20 77 68 69 6c 65 28  bFree){.  while(
0d20: 20 70 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74   p ){.    Select
0d30: 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50   *pPrior = p->pP
0d40: 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  rior;.    sqlite
0d50: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
0d60: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  db, p->pEList);.
0d70: 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
0d80: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
0d90: 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  pSrc);.    sqlit
0da0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0db0: 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20   p->pWhere);.   
0dc0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0dd0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0de0: 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c  roupBy);.    sql
0df0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0e00: 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  b, p->pHaving);.
0e10: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
0e20: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
0e30: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
0e40: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
0e50: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
0e60: 3b 0a 20 20 20 20 69 66 28 20 4f 4b 5f 49 46 5f  ;.    if( OK_IF_
0e70: 41 4c 57 41 59 53 5f 54 52 55 45 28 70 2d 3e 70  ALWAYS_TRUE(p->p
0e80: 57 69 74 68 29 20 29 20 73 71 6c 69 74 65 33 57  With) ) sqlite3W
0e90: 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ithDelete(db, p-
0ea0: 3e 70 57 69 74 68 29 3b 0a 20 20 20 20 69 66 28  >pWith);.    if(
0eb0: 20 62 46 72 65 65 20 29 20 73 71 6c 69 74 65 33   bFree ) sqlite3
0ec0: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b  DbFreeNN(db, p);
0ed0: 0a 20 20 20 20 70 20 3d 20 70 50 72 69 6f 72 3b  .    p = pPrior;
0ee0: 0a 20 20 20 20 62 46 72 65 65 20 3d 20 31 3b 0a  .    bFree = 1;.
0ef0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
0f00: 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63 74  tialize a Select
0f10: 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
0f20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
0f30: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53 65  electDestInit(Se
0f40: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
0f50: 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
0f60: 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74 2d  iParm){.  pDest-
0f70: 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44 65  >eDest = (u8)eDe
0f80: 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 44  st;.  pDest->iSD
0f90: 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20  Parm = iParm;.  
0fa0: 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 20  pDest->zAffSdst 
0fb0: 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53  = 0;.  pDest->iS
0fc0: 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  dst = 0;.  pDest
0fd0: 2d 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a  ->nSdst = 0;.}..
0fe0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
0ff0: 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72  a new Select str
1000: 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72  ucture and retur
1010: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1020: 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  hat.** structure
1030: 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c  ..*/.Select *sql
1040: 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20  ite3SelectNew(. 
1050: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1060: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1070: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
1080: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
1090: 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f       /* which co
10a0: 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65  lumns to include
10b0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a   in the result *
10c0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
10d0: 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  c,        /* the
10e0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20   FROM clause -- 
10f0: 77 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20  which tables to 
1100: 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  scan */.  Expr *
1110: 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
1120: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
1130: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
1140: 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f  t *pGroupBy,   /
1150: 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  * the GROUP BY c
1160: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20  lause */.  Expr 
1170: 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20  *pHaving,       
1180: 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63   /* the HAVING c
1190: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
11a0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
11b0: 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   /* the ORDER BY
11c0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 33 32   clause */.  u32
11d0: 20 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20 20   selFlags,      
11e0: 20 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61 6d     /* Flag param
11f0: 65 74 65 72 73 2c 20 73 75 63 68 20 61 73 20 53  eters, such as S
1200: 46 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  F_Distinct */.  
1210: 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 20 20 20  Expr *pLimit    
1220: 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76        /* LIMIT v
1230: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
1240: 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 29 7b  s not used */.){
1250: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b  .  Select *pNew;
1260: 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64 69  .  Select standi
1270: 6e 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  n;.  pNew = sqli
1280: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
1290: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
12a0: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
12b0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
12c0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
12d0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
12e0: 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20  led );.    pNew 
12f0: 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d 0a  = &standin;.  }.
1300: 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
1310: 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  ){.    pEList = 
1320: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
1330: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
1340: 0a 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 20 20 73 71 6c 69 74 65 33 45 78 70 72 28      sqlite3Expr(
1370: 70 50 61 72 73 65 2d 3e 64 62 2c 54 4b 5f 41 53  pParse->db,TK_AS
1380: 54 45 52 49 53 4b 2c 30 29 29 3b 0a 20 20 7d 0a  TERISK,0));.  }.
1390: 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d    pNew->pEList =
13a0: 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d   pEList;.  pNew-
13b0: 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b  >op = TK_SELECT;
13c0: 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67  .  pNew->selFlag
13d0: 73 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20  s = selFlags;.  
13e0: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pNew->iLimit = 0
13f0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65  ;.  pNew->iOffse
1400: 74 20 3d 20 30 3b 0a 23 69 66 20 53 45 4c 45 43  t = 0;.#if SELEC
1410: 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
1420: 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 5b   pNew->zSelName[
1430: 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  0] = 0;.#endif. 
1440: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
1450: 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[0] = -1;.  p
1460: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
1470: 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[1] = -1;.  pNe
1480: 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  w->nSelectRow = 
1490: 30 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30  0;.  if( pSrc==0
14a0: 20 29 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65   ) pSrc = sqlite
14b0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
14c0: 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  arse->db, sizeof
14d0: 28 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77  (*pSrc));.  pNew
14e0: 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
14f0: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
1500: 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e  pWhere;.  pNew->
1510: 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
1520: 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  pBy;.  pNew->pHa
1530: 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a  ving = pHaving;.
1540: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
1550: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
1560: 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b  New->pPrior = 0;
1570: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
1580: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d   0;.  pNew->pLim
1590: 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70  it = pLimit;.  p
15a0: 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a  New->pWith = 0;.
15b0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
15c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
15d0: 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65   {.    clearSele
15e0: 63 74 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ct(pParse->db, p
15f0: 4e 65 77 2c 20 70 4e 65 77 21 3d 26 73 74 61 6e  New, pNew!=&stan
1600: 64 69 6e 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d  din);.    pNew =
1610: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1620: 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
1630: 53 72 63 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  Src!=0 || pParse
1640: 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a  ->nErr>0 );.  }.
1650: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d    assert( pNew!=
1660: 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65  &standin );.  re
1670: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69  turn pNew;.}..#i
1680: 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
1690: 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ABLED./*.** Set 
16a0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 53 65  the name of a Se
16b0: 6c 65 63 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76  lect object.*/.v
16c0: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
16d0: 74 53 65 74 4e 61 6d 65 28 53 65 6c 65 63 74 20  tSetName(Select 
16e0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
16f0: 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 20  zName){.  if( p 
1700: 26 26 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  && zName ){.    
1710: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1720: 28 73 69 7a 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e  (sizeof(p->zSelN
1730: 61 6d 65 29 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d  ame), p->zSelNam
1740: 65 2c 20 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  e, "%s", zName);
1750: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
1760: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
1770: 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74   given Select st
1780: 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20  ructure and all 
1790: 6f 66 20 69 74 73 20 73 75 62 73 74 72 75 63 74  of its substruct
17a0: 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ures..*/.void sq
17b0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
17c0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  e(sqlite3 *db, S
17d0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28  elect *p){.  if(
17e0: 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52   OK_IF_ALWAYS_TR
17f0: 55 45 28 70 29 20 29 20 63 6c 65 61 72 53 65 6c  UE(p) ) clearSel
1800: 65 63 74 28 64 62 2c 20 70 2c 20 31 29 3b 0a 7d  ect(db, p, 1);.}
1810: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1820: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1830: 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43  right-most SELEC
1840: 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 61  T statement in a
1850: 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   compound..*/.st
1860: 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66 69 6e  atic Select *fin
1870: 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c 65 63  dRightmost(Selec
1880: 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20  t *p){.  while( 
1890: 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d 20 70  p->pNext ) p = p
18a0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75 72  ->pNext;.  retur
18b0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n p;.}../*.** Gi
18c0: 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74  ven 1 to 3 ident
18d0: 69 66 69 65 72 73 20 70 72 65 63 65 64 69 6e 67  ifiers preceding
18e0: 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72   the JOIN keywor
18f0: 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  d, determine the
1900: 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e  .** type of join
1910: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
1920: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  eger constant th
1930: 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61  at expresses tha
1940: 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72  t type.** in ter
1950: 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ms of the follow
1960: 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a  ing bit values:.
1970: 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e  **.**     JT_INN
1980: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f  ER.**     JT_CRO
1990: 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54  SS.**     JT_OUT
19a0: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54  ER.**     JT_NAT
19b0: 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c  URAL.**     JT_L
19c0: 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49  EFT.**     JT_RI
19d0: 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c  GHT.**.** A full
19e0: 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74   outer join is t
19f0: 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  he combination o
1a00: 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54  f JT_LEFT and JT
1a10: 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  _RIGHT..**.** If
1a20: 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75   an illegal or u
1a30: 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20  nsupported join 
1a40: 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68  type is seen, th
1a50: 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a  en still return.
1a60: 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20  ** a join type, 
1a70: 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72  but put an error
1a80: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
1a90: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
1aa0: 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65   sqlite3JoinType
1ab0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1ac0: 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e  Token *pA, Token
1ad0: 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29   *pB, Token *pC)
1ae0: 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65  {.  int jointype
1af0: 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61   = 0;.  Token *a
1b00: 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e  pAll[3];.  Token
1b10: 20 2a 70 3b 0a 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: 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37 38    /*   012345678
1b40: 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33 34  9 123456789 1234
1b50: 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20 73  56789 123 */.  s
1b60: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1b70: 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e   zKeyText[] = "n
1b80: 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69 67  aturaleftouterig
1b90: 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73  htfullinnercross
1ba0: 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ";.  static cons
1bb0: 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75  t struct {.    u
1bc0: 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  8 i;        /* B
1bd0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77  eginning of keyw
1be0: 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65 79  ord text in zKey
1bf0: 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38  Text[] */.    u8
1c00: 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65   nChar;    /* Le
1c10: 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77  ngth of the keyw
1c20: 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74 65 72  ord in character
1c30: 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64 65  s */.    u8 code
1c40: 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79  ;     /* Join ty
1c50: 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61  pe mask */.  } a
1c60: 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20  Keyword[] = {.  
1c70: 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20    /* natural */ 
1c80: 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55  { 0,  7, JT_NATU
1c90: 52 41 4c 20 20 20 20 20 20 20 20 20 20 20 20 20  RAL             
1ca0: 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66     },.    /* lef
1cb0: 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c  t    */ { 6,  4,
1cc0: 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45   JT_LEFT|JT_OUTE
1cd0: 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  R          },.  
1ce0: 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20    /* outer   */ 
1cf0: 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45  { 10, 5, JT_OUTE
1d00: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1d10: 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67     },.    /* rig
1d20: 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c  ht   */ { 14, 5,
1d30: 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54   JT_RIGHT|JT_OUT
1d40: 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  ER         },.  
1d50: 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20    /* full    */ 
1d60: 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54  { 19, 4, JT_LEFT
1d70: 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54  |JT_RIGHT|JT_OUT
1d80: 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e  ER },.    /* inn
1d90: 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c  er   */ { 23, 5,
1da0: 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20 20   JT_INNER       
1db0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1dc0: 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20    /* cross   */ 
1dd0: 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45  { 28, 5, JT_INNE
1de0: 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20 20  R|JT_CROSS      
1df0: 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74     },.  };.  int
1e00: 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30   i, j;.  apAll[0
1e10: 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b  ] = pA;.  apAll[
1e20: 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c  1] = pB;.  apAll
1e30: 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28  [2] = pC;.  for(
1e40: 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c  i=0; i<3 && apAl
1e50: 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  l[i]; i++){.    
1e60: 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20  p = apAll[i];.  
1e70: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72    for(j=0; j<Arr
1e80: 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29  aySize(aKeyword)
1e90: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
1ea0: 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64  ( p->n==aKeyword
1eb0: 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20  [j].nChar .     
1ec0: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53       && sqlite3S
1ed0: 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70  trNICmp((char*)p
1ee0: 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61  ->z, &zKeyText[a
1ef0: 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70  Keyword[j].i], p
1f00: 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->n)==0 ){.     
1f10: 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61     jointype |= a
1f20: 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b  Keyword[j].code;
1f30: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1f40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f50: 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30    testcase( j==0
1f60: 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32   || j==1 || j==2
1f70: 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34   || j==3 || j==4
1f80: 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36   || j==5 || j==6
1f90: 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41   );.    if( j>=A
1fa0: 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72  rraySize(aKeywor
1fb0: 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e  d) ){.      join
1fc0: 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52  type |= JT_ERROR
1fd0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1fe0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20     }.  }.  if(. 
1ff0: 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20      (jointype & 
2000: 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54  (JT_INNER|JT_OUT
2010: 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c  ER))==(JT_INNER|
2020: 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20  JT_OUTER) ||.   
2030: 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54    (jointype & JT
2040: 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a  _ERROR)!=0.  ){.
2050: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2060: 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61  zSp = " ";.    a
2070: 73 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a  ssert( pB!=0 );.
2080: 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b      if( pC==0 ){
2090: 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71   zSp++; }.    sq
20a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
20b0: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f  arse, "unknown o
20c0: 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f  r unsupported jo
20d0: 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20  in type: ".     
20e0: 20 20 22 25 54 20 25 54 25 73 25 54 22 2c 20 70    "%T %T%s%T", p
20f0: 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b  A, pB, zSp, pC);
2100: 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20  .    jointype = 
2110: 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73  JT_INNER;.  }els
2120: 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65 20  e if( (jointype 
2130: 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a  & JT_OUTER)!=0 .
2140: 20 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f 69           && (joi
2150: 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54  ntype & (JT_LEFT
2160: 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f  |JT_RIGHT))!=JT_
2170: 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c 69  LEFT ){.    sqli
2180: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2190: 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48  se, .      "RIGH
21a0: 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52  T and FULL OUTER
21b0: 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63   JOINs are not c
21c0: 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74  urrently support
21d0: 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79  ed");.    jointy
21e0: 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20  pe = JT_INNER;. 
21f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e   }.  return join
2200: 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  type;.}../*.** R
2210: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
2220: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  of a column in a
2230: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
2240: 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  -1 if the column
2250: 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  .** is not conta
2260: 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c  ined in the tabl
2270: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2280: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62   columnIndex(Tab
2290: 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20  le *pTab, const 
22a0: 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69  char *zCol){.  i
22b0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
22c0: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
22d0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
22e0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62  ite3StrICmp(pTab
22f0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c  ->aCol[i].zName,
2300: 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75   zCol)==0 ) retu
2310: 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
2320: 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
2330: 53 65 61 72 63 68 20 74 68 65 20 66 69 72 73 74  Search the first
2340: 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72   N tables in pSr
2350: 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  c, from left to 
2360: 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66  right, looking f
2370: 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68  or a.** table th
2380: 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20  at has a column 
2390: 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a  named zCol.  .**
23a0: 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20  .** When found, 
23b0: 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20 2a  set *piTab and *
23c0: 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61 62  piCol to the tab
23d0: 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c  le index and col
23e0: 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20  umn index.** of 
23f0: 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c  the matching col
2400: 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 54  umn and return T
2410: 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  RUE..**.** If no
2420: 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  t found, return 
2430: 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  FALSE..*/.static
2440: 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c   int tableAndCol
2450: 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63 4c  umnIndex(.  SrcL
2460: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
2470: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61 62   /* Array of tab
2480: 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  les to search */
2490: 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
24a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
24b0: 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 70  r of tables in p
24c0: 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72  Src->a[] to sear
24d0: 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ch */.  const ch
24e0: 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20  ar *zCol,    /* 
24f0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
2500: 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  mn we are lookin
2510: 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a  g for */.  int *
2520: 70 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  piTab,          
2530: 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f  /* Write index o
2540: 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65  f pSrc->a[] here
2550: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c   */.  int *piCol
2560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
2570: 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72  ite index of pSr
2580: 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61  c->a[*piTab].pTa
2590: 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a  b->aCol[] here *
25a0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
25c0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
25d0: 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20 2a  tables in pSrc *
25e0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20  /.  int iCol;   
25f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2600: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63  x of column matc
2610: 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20  hing zCol */..  
2620: 61 73 73 65 72 74 28 20 28 70 69 54 61 62 3d 3d  assert( (piTab==
2630: 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29  0)==(piCol==0) )
2640: 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65  ;  /* Both or ne
2650: 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a  ither are NULL *
2660: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e  /.  for(i=0; i<N
2670: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c  ; i++){.    iCol
2680: 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70   = columnIndex(p
2690: 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20  Src->a[i].pTab, 
26a0: 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 69  zCol);.    if( i
26b0: 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col>=0 ){.      
26c0: 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20 20  if( piTab ){.   
26d0: 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69 3b       *piTab = i;
26e0: 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20  .        *piCol 
26f0: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a  = iCol;.      }.
2700: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2710: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2720: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
2730: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2740: 75 73 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d  used to add term
2750: 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49  s implied by JOI
2760: 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a  N syntax to the.
2770: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
2780: 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20  expression of a 
2790: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
27a0: 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20  . The new term, 
27b0: 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65  which.** is ANDe
27c0: 64 20 77 69 74 68 20 74 68 65 20 65 78 69 73 74  d with the exist
27d0: 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73 65  ing WHERE clause
27e0: 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  , is of the form
27f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31  :.**.**    (tab1
2800: 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c  .col1 = tab2.col
2810: 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74  2).**.** where t
2820: 61 62 31 20 69 73 20 74 68 65 20 69 53 72 63 27  ab1 is the iSrc'
2830: 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c  th table in SrcL
2840: 69 73 74 20 70 53 72 63 20 61 6e 64 20 74 61 62  ist pSrc and tab
2850: 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53  2 is the .** (iS
2860: 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e  rc+1)'th. Column
2870: 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20   col1 is column 
2880: 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31  iColLeft of tab1
2890: 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a  , and col2 is.**
28a0: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68   column iColRigh
28b0: 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74  t of tab2..*/.st
28c0: 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65  atic void addWhe
28d0: 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20  reTerm(.  Parse 
28e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
28f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
2900: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
2910: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
2940: 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75  les in FROM clau
2950: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66  se */.  int iLef
2960: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2970: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2980: 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65 20   of first table 
2990: 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20  to join in pSrc 
29a0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66  */.  int iColLef
29b0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
29c0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
29d0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74   column in first
29e0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
29f0: 69 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  iRight,         
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2a10: 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20 74  ndex of second t
2a20: 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a  able in pSrc */.
2a30: 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c    int iColRight,
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a50: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
2a60: 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74  lumn in second t
2a70: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  able */.  int is
2a80: 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20  OuterJoin,      
2a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2aa0: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
2ab0: 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20  OUTER join */.  
2ac0: 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20 20  Expr **ppWhere  
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57  /* IN/OUT: The W
2af0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61  HERE clause to a
2b00: 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71  dd to */.){.  sq
2b10: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2b20: 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a  se->db;.  Expr *
2b30: 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45 32  pE1;.  Expr *pE2
2b40: 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a  ;.  Expr *pEq;..
2b50: 20 20 61 73 73 65 72 74 28 20 69 4c 65 66 74 3c    assert( iLeft<
2b60: 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65  iRight );.  asse
2b70: 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69  rt( pSrc->nSrc>i
2b80: 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72  Right );.  asser
2b90: 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74  t( pSrc->a[iLeft
2ba0: 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65  ].pTab );.  asse
2bb0: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69 67  rt( pSrc->a[iRig
2bc0: 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70  ht].pTab );..  p
2bd0: 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  E1 = sqlite3Crea
2be0: 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c  teColumnExpr(db,
2bf0: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 43   pSrc, iLeft, iC
2c00: 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d  olLeft);.  pE2 =
2c10: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f   sqlite3CreateCo
2c20: 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72  lumnExpr(db, pSr
2c30: 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c 52  c, iRight, iColR
2c40: 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20  ight);..  pEq = 
2c50: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
2c60: 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c  rse, TK_EQ, pE1,
2c70: 20 70 45 32 29 3b 0a 20 20 69 66 28 20 70 45 71   pE2);.  if( pEq
2c80: 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20   && isOuterJoin 
2c90: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
2ca0: 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 46  operty(pEq, EP_F
2cb0: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73  romJoin);.    as
2cc0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2cd0: 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 54  operty(pEq, EP_T
2ce0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
2cf0: 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72  ced) );.    Expr
2d00: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
2d10: 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  Eq, EP_NoReduce)
2d20: 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69 67 68  ;.    pEq->iRigh
2d30: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31  tJoinTable = (i1
2d40: 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20  6)pE2->iTable;. 
2d50: 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20 3d 20   }.  *ppWhere = 
2d60: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
2d70: 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45 71  b, *ppWhere, pEq
2d80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
2d90: 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  the EP_FromJoin 
2da0: 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20  property on all 
2db0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76  terms of the giv
2dc0: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  en expression..*
2dd0: 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78  * And set the Ex
2de0: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
2df0: 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72  le to iTable for
2e00: 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
2e10: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
2e20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46  ..**.** The EP_F
2e30: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
2e40: 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d   is used on term
2e50: 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  s of an expressi
2e60: 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68  on to tell.** th
2e70: 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  e LEFT OUTER JOI
2e80: 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  N processing log
2e90: 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72  ic that this ter
2ea0: 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  m is part of the
2eb0: 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63  .** join restric
2ec0: 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69  tion specified i
2ed0: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
2ee0: 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74  G clause and not
2ef0: 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68   a part.** of th
2f00: 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57  e more general W
2f10: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68  HERE clause.  Th
2f20: 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f  ese terms are mo
2f30: 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a  ved over to the.
2f40: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
2f50: 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63  during join proc
2f60: 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65  essing but we ne
2f70: 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
2f80: 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67  hat they.** orig
2f90: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
2fa0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2fb0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72  ..**.** The Expr
2fc0: 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
2fd0: 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45   tells the WHERE
2fe0: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
2ff0: 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65  ng that the.** e
3000: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64  xpression depend
3010: 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68  s on table iRigh
3020: 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20  tJoinTable even 
3030: 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73  if that table is
3040: 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74   not.** explicit
3050: 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  ly mentioned in 
3060: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  the expression. 
3070: 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f   That informatio
3080: 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66  n is needed.** f
3090: 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68  or cases like th
30a0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
30b0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
30c0: 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
30d0: 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78  .a=t2.b AND t1.x
30e0: 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65  =5.**.** The whe
30f0: 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20  re clause needs 
3100: 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  to defer the han
3110: 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e  dling of the t1.
3120: 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69  x=5.** term unti
3130: 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c  l after the t2 l
3140: 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  oop of the join.
3150: 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61    In that way, a
3160: 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20  .** NULL t2 row 
3170: 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
3180: 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d   whenever t1.x!=
3190: 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  5.  If we do not
31a0: 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61  .** defer the ha
31b0: 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35  ndling of t1.x=5
31c0: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f  , it will be pro
31d0: 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65  cessed immediate
31e0: 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20  ly.** after the 
31f0: 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73  t1 loop and rows
3200: 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69   with t1.x!=5 wi
3210: 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20  ll never appear 
3220: 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74  in.** the output
3230: 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72  , which is incor
3240: 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rect..*/.static 
3250: 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72  void setJoinExpr
3260: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54  (Expr *p, int iT
3270: 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20  able){.  while( 
3280: 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  p ){.    ExprSet
3290: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
32a0: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73  romJoin);.    as
32b0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
32c0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
32d0: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
32e0: 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65  d) );.    ExprSe
32f0: 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c 20  tVVAProperty(p, 
3300: 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
3310: 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54    p->iRightJoinT
3320: 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62  able = (i16)iTab
3330: 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  le;.    if( p->o
3340: 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26  p==TK_FUNCTION &
3350: 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a  & p->x.pList ){.
3360: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
3370: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
3380: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  >x.pList->nExpr;
3390: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
33a0: 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78 2e  etJoinExpr(p->x.
33b0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
33c0: 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r, iTable);.    
33d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65    }.    }.    se
33e0: 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65  tJoinExpr(p->pLe
33f0: 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  ft, iTable);.   
3400: 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a   p = p->pRight;.
3410: 20 20 7d 20 0a 7d 0a 0a 2f 2a 20 55 6e 64 6f 20    } .}../* Undo 
3420: 74 68 65 20 77 6f 72 6b 20 6f 66 20 73 65 74 4a  the work of setJ
3430: 6f 69 6e 45 78 70 72 28 29 2e 20 20 49 6e 20 74  oinExpr().  In t
3440: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  he expression tr
3450: 65 65 20 70 2c 20 63 6f 6e 76 65 72 74 20 65 76  ee p, convert ev
3460: 65 72 79 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74  ery.** term that
3470: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
3480: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 61 6e 64 20  EP_FromJoin and 
3490: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d  iRightJoinTable=
34a0: 3d 69 54 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20  =iTable into.** 
34b0: 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 65 72 6d  an ordinary term
34c0: 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65 20   that omits the 
34d0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 6d 61 72 6b  EP_FromJoin mark
34e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 68 61 70  ..**.** This hap
34f0: 70 65 6e 73 20 77 68 65 6e 20 61 20 4c 45 46 54  pens when a LEFT
3500: 20 4a 4f 49 4e 20 69 73 20 73 69 6d 70 6c 69 66   JOIN is simplif
3510: 69 65 64 20 69 6e 74 6f 20 61 6e 20 6f 72 64 69  ied into an ordi
3520: 6e 61 72 79 20 4a 4f 49 4e 2e 0a 2a 2f 0a 73 74  nary JOIN..*/.st
3530: 61 74 69 63 20 76 6f 69 64 20 75 6e 73 65 74 4a  atic void unsetJ
3540: 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c  oinExpr(Expr *p,
3550: 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
3560: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
3570: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
3580: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
3590: 69 6e 29 0a 20 20 20 20 20 26 26 20 28 69 54 61  in).     && (iTa
35a0: 62 6c 65 3c 30 20 7c 7c 20 70 2d 3e 69 52 69 67  ble<0 || p->iRig
35b0: 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61  htJoinTable==iTa
35c0: 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 45 78  ble) ){.      Ex
35d0: 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  prClearProperty(
35e0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  p, EP_FromJoin);
35f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
3600: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
3610: 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20  N && p->x.pList 
3620: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
3630: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
3640: 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  <p->x.pList->nEx
3650: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
3660: 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28    unsetJoinExpr(
3670: 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  p->x.pList->a[i]
3680: 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 29 3b  .pExpr, iTable);
3690: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
36a0: 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72     unsetJoinExpr
36b0: 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  (p->pLeft, iTabl
36c0: 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  e);.    p = p->p
36d0: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
36e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
36f0: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
3700: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
3710: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
3720: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
3730: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
3740: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
3750: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
3760: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
3770: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
3780: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
3790: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
37a0: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
37b0: 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61  * The terms of a
37c0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65   FROM clause are
37d0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
37e0: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74  e Select.pSrc st
37f0: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20  ructure..** The 
3800: 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20  left most table 
3810: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
3820: 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72  ry in Select.pSr
3830: 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  c.  The right-mo
3840: 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74  st.** table is t
3850: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20  he last entry.  
3860: 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  The join operato
3870: 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65  r is held in the
3880: 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65   entry to.** the
3890: 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74   left.  Thus ent
38a0: 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68  ry 0 contains th
38b0: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
38c0: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74  for the join bet
38d0: 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ween.** entries 
38e0: 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e  0 and 1.  Any ON
38f0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
3900: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
3910: 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a  h the join are.*
3920: 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20  * also attached 
3930: 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72  to the left entr
3940: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
3950: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
3960: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
3970: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
3980: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
3990: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
39a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
39b0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
39c0: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
39e0: 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  All tables in th
39f0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
3a00: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 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 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
3a30: 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ers */.  struct 
3a40: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
3a50: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74  eft;     /* Left
3a60: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
3a70: 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
3a80: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52  SrcList_item *pR
3a90: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68  ight;    /* Righ
3aa0: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
3ab0: 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  ined */..  pSrc 
3ac0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65  = p->pSrc;.  pLe
3ad0: 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d  ft = &pSrc->a[0]
3ae0: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c  ;.  pRight = &pL
3af0: 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  eft[1];.  for(i=
3b00: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
3b10: 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b  1; i++, pRight++
3b20: 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20  , pLeft++){.    
3b30: 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54 61 62  Table *pRightTab
3b40: 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61 62 3b   = pRight->pTab;
3b50: 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74 65 72  .    int isOuter
3b60: 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  ;..    if( NEVER
3b70: 28 70 4c 65 66 74 2d 3e 70 54 61 62 3d 3d 30 20  (pLeft->pTab==0 
3b80: 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29  || pRightTab==0)
3b90: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
3ba0: 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67   isOuter = (pRig
3bb0: 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  ht->fg.jointype 
3bc0: 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a  & JT_OUTER)!=0;.
3bd0: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  .    /* When the
3be0: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
3bf0: 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64   is present, add
3c00: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
3c10: 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65  rms for.    ** e
3c20: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74  very column that
3c30: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
3c40: 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a  have in common..
3c50: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
3c60: 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79  Right->fg.jointy
3c70: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20  pe & JT_NATURAL 
3c80: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69  ){.      if( pRi
3c90: 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67  ght->pOn || pRig
3ca0: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
3cb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
3cc0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
3cd0: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61   NATURAL join ma
3ce0: 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20  y not have ".   
3cf0: 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f          "an ON o
3d00: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c  r USING clause",
3d10: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   0);.        ret
3d20: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
3d30: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3d40: 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b  pRightTab->nCol;
3d50: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
3d60: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a  har *zName;   /*
3d70: 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20   Name of column 
3d80: 69 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62  in the right tab
3d90: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
3da0: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20  t iLeft;     /* 
3db0: 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61  Matching left ta
3dc0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ble */.        i
3dd0: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a  nt iLeftCol;  /*
3de0: 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   Matching column
3df0: 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62   in the left tab
3e00: 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a  le */..        z
3e10: 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62  Name = pRightTab
3e20: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
3e30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62  .        if( tab
3e40: 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
3e50: 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d  (pSrc, i+1, zNam
3e60: 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66  e, &iLeft, &iLef
3e70: 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  tCol) ){.       
3e80: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
3e90: 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c  pParse, pSrc, iL
3ea0: 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69  eft, iLeftCol, i
3eb0: 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20  +1, j,.         
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
3ed0: 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72  Outer, &p->pWher
3ee0: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
3ef0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
3f00: 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74   /* Disallow bot
3f10: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  h ON and USING c
3f20: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
3f30: 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20  me join.    */. 
3f40: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3f50: 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55  On && pRight->pU
3f60: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  sing ){.      sq
3f70: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3f80: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61  arse, "cannot ha
3f90: 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ve both ON and U
3fa0: 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22  SING ".        "
3fb0: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
3fc0: 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20  ame join");.    
3fd0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3fe0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  }..    /* Add th
3ff0: 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74  e ON clause to t
4000: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
4010: 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e  ERE clause, conn
4020: 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20  ected by.    ** 
4030: 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
4040: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
4050: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20  pRight->pOn ){. 
4060: 20 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72       if( isOuter
4070: 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70   ) setJoinExpr(p
4080: 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67  Right->pOn, pRig
4090: 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ht->iCursor);.  
40a0: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
40b0: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
40c0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57  Parse->db, p->pW
40d0: 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f  here, pRight->pO
40e0: 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  n);.      pRight
40f0: 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  ->pOn = 0;.    }
4100: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
4110: 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74  extra terms on t
4120: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
4130: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
4140: 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  named.    ** in 
4150: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
4160: 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74  .  Example: If t
4170: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f  he two tables to
4180: 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a   be joined are .
4190: 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61      ** A and B a
41a0: 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  nd the USING cla
41b0: 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20  use names X, Y, 
41c0: 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20  and Z, then add 
41d0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  this.    ** to t
41e0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a  he WHERE clause:
41f0: 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20      A.X=B.X AND 
4200: 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d  A.Y=B.Y AND A.Z=
4210: 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72  B.Z.    ** Repor
4220: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e  t an error if an
4230: 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e  y column mention
4240: 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ed in the USING 
4250: 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a  clause is.    **
4260: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
4270: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f  n both tables to
4280: 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20   be joined..    
4290: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
42a0: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
42b0: 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74     IdList *pList
42c0: 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e   = pRight->pUsin
42d0: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  g;.      for(j=0
42e0: 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; j<pList->nId; 
42f0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
4300: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f  ar *zName;     /
4310: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65  * Name of the te
4320: 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  rm in the USING 
4330: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
4340: 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20    int iLeft;    
4350: 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74     /* Table on t
4360: 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74  he left with mat
4370: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ching column nam
4380: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
4390: 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a   iLeftCol;    /*
43a0: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
43b0: 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  f matching colum
43c0: 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f  n on the left */
43d0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69  .        int iRi
43e0: 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c  ghtCol;   /* Col
43f0: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  umn number of ma
4400: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e  tching column on
4410: 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20   the right */.. 
4420: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70         zName = p
4430: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
4440: 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74  ;.        iRight
4450: 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65  Col = columnInde
4460: 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61  x(pRightTab, zNa
4470: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
4480: 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20   iRightCol<0.   
4490: 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41        || !tableA
44a0: 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53  ndColumnIndex(pS
44b0: 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20  rc, i+1, zName, 
44c0: 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f  &iLeft, &iLeftCo
44d0: 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  l).        ){.  
44e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
44f0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4500: 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69  "cannot join usi
4510: 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63  ng column %s - c
4520: 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20  olumn ".        
4530: 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74      "not present
4540: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22   in both tables"
4550: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
4560: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
4570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4580: 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61  addWhereTerm(pPa
4590: 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74  rse, pSrc, iLeft
45a0: 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c  , iLeftCol, i+1,
45b0: 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20   iRightCol,.    
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45d0: 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57   isOuter, &p->pW
45e0: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  here);.      }. 
45f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
4600: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  n 0;.}../* Forwa
4610: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
4620: 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a  static KeyInfo *
4630: 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
4640: 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
4650: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
4660: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
4670: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
4680: 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d  ist,     /* Form
4690: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a   the KeyInfo obj
46a0: 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78  ect from this Ex
46b0: 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  prList */.  int 
46c0: 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20  iStart,         
46d0: 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74   /* Begin with t
46e0: 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c  his column of pL
46f0: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ist */.  int nEx
4700: 74 72 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a  tra           /*
4710: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65   Add this many e
4720: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  xtra columns to 
4730: 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a 2f  the end */.);../
4740: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
4750: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  de that will pus
4760: 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20  h the record in 
4770: 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61 74  registers regDat
4780: 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65 67  a.** through reg
4790: 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e 74  Data+nData-1 ont
47a0: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f  o the sorter..*/
47b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
47c0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50  hOntoSorter(.  P
47d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
47e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
47f0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72  context */.  Sor
4800: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
4810: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
4820: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44  on about the ORD
4830: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
4840: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4850: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
4860: 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61  whole SELECT sta
4870: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
4880: 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20 20  regData,        
4890: 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69     /* First regi
48a0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74  ster holding dat
48b0: 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  a to be sorted *
48c0: 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67 44  /.  int regOrigD
48d0: 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20 46 69  ata,       /* Fi
48e0: 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c  rst register hol
48f0: 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65  ding data before
4900: 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e   packing */.  in
4910: 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20  t nData,        
4920: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4930: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
4940: 65 20 64 61 74 61 20 61 72 72 61 79 20 2a 2f 0a  e data array */.
4950: 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67    int nPrefixReg
4960: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20           /* No. 
4970: 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74 6f 20  of reg prior to 
4980: 72 65 67 44 61 74 61 20 61 76 61 69 6c 61 62 6c  regData availabl
4990: 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b 0a  e for use */.){.
49a0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
49b0: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49d0: 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65 72     /* Stmt under
49e0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
49f0: 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20 28 28  .  int bSeq = ((
4a00: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
4a10: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
4a20: 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69 6e  orter)==0);.  in
4a30: 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74 2d  t nExpr = pSort-
4a40: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
4a50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4a60: 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20 42  * No. of ORDER B
4a70: 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  Y terms */.  int
4a80: 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20 2b   nBase = nExpr +
4a90: 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b 20 20   bSeq + nData;  
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4ab0: 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74 65   Fields in sorte
4ac0: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
4ad0: 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t 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 20 20 2f                 /
4b00: 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74 65  * Regs for sorte
4b10: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
4b20: 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 2b 2b  t regRecord = ++
4b30: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20  pParse->nMem;   
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4b50: 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f 72 74  * Assembled sort
4b60: 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  er record */.  i
4b70: 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72  nt nOBSat = pSor
4b80: 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20 20  t->nOBSat;      
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ba0: 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  /* ORDER BY term
4bb0: 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 69  s to skip */.  i
4bc0: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4be0: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61    /* Opcode to a
4bf0: 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  dd sorter record
4c00: 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20   to sorter */.  
4c10: 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20 20 20  int iLimit;     
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c30: 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f 75 6e     /* LIMIT coun
4c40: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
4c50: 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53 65  ( bSeq==0 || bSe
4c60: 71 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  q==1 );.  assert
4c70: 28 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 72 65  ( nData==1 || re
4c80: 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67 44 61  gData==regOrigDa
4c90: 74 61 20 7c 7c 20 72 65 67 4f 72 69 67 44 61 74  ta || regOrigDat
4ca0: 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 50  a==0 );.  if( nP
4cb0: 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20 20 20  refixReg ){.    
4cc0: 61 73 73 65 72 74 28 20 6e 50 72 65 66 69 78 52  assert( nPrefixR
4cd0: 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20 29  eg==nExpr+bSeq )
4ce0: 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  ;.    regBase = 
4cf0: 72 65 67 44 61 74 61 20 2d 20 6e 45 78 70 72 20  regData - nExpr 
4d00: 2d 20 62 53 65 71 3b 0a 20 20 7d 65 6c 73 65 7b  - bSeq;.  }else{
4d10: 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 70  .    regBase = p
4d20: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
4d30: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
4d40: 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a  m += nBase;.  }.
4d50: 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63    assert( pSelec
4d60: 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t->iOffset==0 ||
4d70: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
4d80: 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69 74 20  !=0 );.  iLimit 
4d90: 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  = pSelect->iOffs
4da0: 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e 69 4f  et ? pSelect->iO
4db0: 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c 65 63  ffset+1 : pSelec
4dc0: 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70 53 6f  t->iLimit;.  pSo
4dd0: 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d 20  rt->labelDone = 
4de0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
4df0: 61 62 65 6c 28 76 29 3b 0a 20 20 73 71 6c 69 74  abel(v);.  sqlit
4e00: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
4e10: 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  st(pParse, pSort
4e20: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42  ->pOrderBy, regB
4e30: 61 73 65 2c 20 72 65 67 4f 72 69 67 44 61 74 61  ase, regOrigData
4e40: 2c 0a 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 20 20 53 51 4c 49              SQLI
4e60: 54 45 5f 45 43 45 4c 5f 44 55 50 20 7c 20 28 72  TE_ECEL_DUP | (r
4e70: 65 67 4f 72 69 67 44 61 74 61 3f 20 53 51 4c 49  egOrigData? SQLI
4e80: 54 45 5f 45 43 45 4c 5f 52 45 46 20 3a 20 30 29  TE_ECEL_REF : 0)
4e90: 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29 7b  );.  if( bSeq ){
4ea0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4eb0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
4ec0: 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69 45  uence, pSort->iE
4ed0: 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b  Cursor, regBase+
4ee0: 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66  nExpr);.  }.  if
4ef0: 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30 20  ( nPrefixReg==0 
4f00: 26 26 20 6e 44 61 74 61 3e 30 20 29 7b 0a 20 20  && nData>0 ){.  
4f10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
4f20: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
4f30: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
4f40: 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61 74 61  Expr+bSeq, nData
4f50: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 42  );.  }.  if( nOB
4f60: 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  Sat>0 ){.    int
4f70: 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20 20 2f   regPrevKey;   /
4f80: 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f 42 53  * The first nOBS
4f90: 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  at columns of th
4fa0: 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a  e previous row *
4fb0: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 46 69  /.    int addrFi
4fc0: 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64 72 65  rst;    /* Addre
4fd0: 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49 66 4e  ss of the OP_IfN
4fe0: 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  ot opcode */.   
4ff0: 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20 20   int addrJmp;   
5000: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
5010: 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70 63   the OP_Jump opc
5020: 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62 65 4f  ode */.    VdbeO
5030: 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a 20  p *pOp;      /* 
5040: 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70 65 6e  Opcode that open
5050: 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a  s the sorter */.
5060: 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20      int nKey;   
5070: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5080: 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79 20 63  of sorting key c
5090: 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69 6e  olumns, includin
50a0: 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a 2f  g OP_Sequence */
50b0: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
50c0: 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  I;     /* Origin
50d0: 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74 68  al KeyInfo on th
50e0: 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65 20 2a  e sorter table *
50f0: 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  /..    sqlite3Vd
5100: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
5110: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61  akeRecord, regBa
5120: 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65  se+nOBSat, nBase
5130: 2d 6e 4f 42 53 61 74 2c 72 65 67 52 65 63 6f 72  -nOBSat,regRecor
5140: 64 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 4b  d);.    regPrevK
5150: 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ey = pParse->nMe
5160: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
5170: 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e  >nMem += pSort->
5180: 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79  nOBSat;.    nKey
5190: 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74   = nExpr - pSort
51a0: 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b  ->nOBSat + bSeq;
51b0: 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b  .    if( bSeq ){
51c0: 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74  .      addrFirst
51d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
51e0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
51f0: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
5200: 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ; .    }else{.  
5210: 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20      addrFirst = 
5220: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5230: 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  1(v, OP_Sequence
5240: 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43  Test, pSort->iEC
5250: 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
5260: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
5270: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5280: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
5290: 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b  ompare, regPrevK
52a0: 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f  ey, regBase, pSo
52b0: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
52c0: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
52d0: 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74  beGetOp(v, pSort
52e0: 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  ->addrSortIndex)
52f0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
5300: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
5310: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ed ) return;.   
5320: 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20   pOp->p2 = nKey 
5330: 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49  + nData;.    pKI
5340: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
5350: 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  nfo;.    memset(
5360: 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  pKI->aSortOrder,
5370: 20 30 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65   0, pKI->nKeyFie
5380: 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50  ld); /* Makes OP
5390: 5f 4a 75 6d 70 20 74 65 73 74 61 62 6c 65 20 2a  _Jump testable *
53a0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
53b0: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
53c0: 20 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f   (char*)pKI, P4_
53d0: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65  KEYINFO);.    te
53e0: 73 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41 6c  stcase( pKI->nAl
53f0: 6c 46 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e 4b  lField > pKI->nK
5400: 65 79 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20 20  eyField+2 );.   
5410: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
5420: 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
5430: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
5440: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
5450: 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20 20 20 20   nOBSat,.       
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5480: 20 20 20 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65      pKI->nAllFie
5490: 6c 64 2d 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c  ld-pKI->nKeyFiel
54a0: 64 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d  d-1);.    addrJm
54b0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
54c0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
54d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
54e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
54f0: 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61   addrJmp+1, 0, a
5500: 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43  ddrJmp+1); VdbeC
5510: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
5520: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
5530: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
5540: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
5550: 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72   pSort->regRetur
5560: 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
5570: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
5580: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5590: 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65  Gosub, pSort->re
55a0: 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  gReturn, pSort->
55b0: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20  labelBkOut);.   
55c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
55d0: 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f  p1(v, OP_ResetSo
55e0: 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43  rter, pSort->iEC
55f0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ursor);.    if( 
5600: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
5610: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5620: 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69  2(v, OP_IfNot, i
5630: 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61  Limit, pSort->la
5640: 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20  belDone);.      
5650: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5660: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5670: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
5680: 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  , addrFirst);.  
5690: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
56a0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
56b0: 67 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65  gBase, regPrevKe
56c0: 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  y, pSort->nOBSat
56d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
56e0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
56f0: 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66  drJmp);.  }.  if
5700: 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ( iLimit ){.    
5710: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
5720: 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20   the values for 
5730: 74 68 65 20 6e 65 77 20 73 6f 72 74 65 72 20 65  the new sorter e
5740: 6e 74 72 79 20 61 72 65 20 73 74 6f 72 65 64 0a  ntry are stored.
5750: 20 20 20 20 2a 2a 20 69 6e 20 61 6e 20 61 72 72      ** in an arr
5760: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e  ay of registers.
5770: 20 54 68 65 79 20 6e 65 65 64 20 74 6f 20 62 65   They need to be
5780: 20 63 6f 6d 70 6f 73 65 64 20 69 6e 74 6f 20 61   composed into a
5790: 20 72 65 63 6f 72 64 0a 20 20 20 20 2a 2a 20 61   record.    ** a
57a0: 6e 64 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  nd inserted into
57b0: 20 74 68 65 20 73 6f 72 74 65 72 20 69 66 20 65   the sorter if e
57c0: 69 74 68 65 72 20 28 61 29 20 74 68 65 72 65 20  ither (a) there 
57d0: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  are currently.  
57e0: 20 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 4c    ** less than L
57f0: 49 4d 49 54 2b 4f 46 46 53 45 54 20 69 74 65 6d  IMIT+OFFSET item
5800: 73 20 6f 72 20 28 62 29 20 74 68 65 20 6e 65 77  s or (b) the new
5810: 20 72 65 63 6f 72 64 20 69 73 20 73 6d 61 6c 6c   record is small
5820: 65 72 20 74 68 61 6e 20 0a 20 20 20 20 2a 2a 20  er than .    ** 
5830: 74 68 65 20 6c 61 72 67 65 73 74 20 72 65 63 6f  the largest reco
5840: 72 64 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  rd currently in 
5850: 74 68 65 20 73 6f 72 74 65 72 2e 20 49 66 20 28  the sorter. If (
5860: 62 29 20 69 73 20 74 72 75 65 20 61 6e 64 20 74  b) is true and t
5870: 68 65 72 65 0a 20 20 20 20 2a 2a 20 61 72 65 20  here.    ** are 
5880: 61 6c 72 65 61 64 79 20 4c 49 4d 49 54 2b 4f 46  already LIMIT+OF
5890: 46 53 45 54 20 69 74 65 6d 73 20 69 6e 20 74 68  FSET items in th
58a0: 65 20 73 6f 72 74 65 72 2c 20 64 65 6c 65 74 65  e sorter, delete
58b0: 20 74 68 65 20 6c 61 72 67 65 73 74 0a 20 20 20   the largest.   
58c0: 20 2a 2a 20 65 6e 74 72 79 20 62 65 66 6f 72 65   ** entry before
58d0: 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 20 6e   inserting the n
58e0: 65 77 20 6f 6e 65 2e 20 54 68 69 73 20 77 61 79  ew one. This way
58f0: 20 74 68 65 72 65 20 61 72 65 20 6e 65 76 65 72   there are never
5900: 20 6d 6f 72 65 20 0a 20 20 20 20 2a 2a 20 74 68   more .    ** th
5910: 61 6e 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20  an LIMIT+OFFSET 
5920: 69 74 65 6d 73 20 69 6e 20 74 68 65 20 73 6f 72  items in the sor
5930: 74 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ter..    **.    
5940: 2a 2a 20 49 66 20 74 68 65 20 6e 65 77 20 72 65  ** If the new re
5950: 63 6f 72 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65  cord does not ne
5960: 65 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  ed to be inserte
5970: 64 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65  d into the sorte
5980: 72 2c 0a 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74  r,.    ** jump t
5990: 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
59a0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
59b0: 2e 20 4f 72 2c 20 69 66 20 74 68 65 0a 20 20 20  . Or, if the.   
59c0: 20 2a 2a 20 70 53 6f 72 74 2d 3e 62 4f 72 64 65   ** pSort->bOrde
59d0: 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 66 6c 61  redInnerLoop fla
59e0: 67 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69  g is set to indi
59f0: 63 61 74 65 20 74 68 61 74 20 74 68 65 20 69 6e  cate that the in
5a00: 6e 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 20  ner.    ** loop 
5a10: 64 65 6c 69 76 65 72 73 20 69 74 65 6d 73 20 69  delivers items i
5a20: 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20  n sorted order, 
5a30: 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74  jump to the next
5a40: 20 69 74 65 72 61 74 69 6f 6e 0a 20 20 20 20 2a   iteration.    *
5a50: 2a 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c  * of the outer l
5a60: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
5a70: 69 6e 74 20 69 43 73 72 20 3d 20 70 53 6f 72 74  int iCsr = pSort
5a80: 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 20 20  ->iECursor;.    
5a90: 69 6e 74 20 69 4a 6d 70 20 3d 20 73 71 6c 69 74  int iJmp = sqlit
5aa0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
5ab0: 72 28 76 29 2b 35 2b 28 6e 4f 42 53 61 74 3c 3d  r(v)+5+(nOBSat<=
5ac0: 30 29 2b 70 53 6f 72 74 2d 3e 62 4f 72 64 65 72  0)+pSort->bOrder
5ad0: 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 0a 20 20 20  edInnerLoop;.   
5ae0: 20 61 73 73 65 72 74 28 20 70 53 6f 72 74 2d 3e   assert( pSort->
5af0: 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f  bOrderedInnerLoo
5b00: 70 3d 3d 30 20 7c 7c 20 70 53 6f 72 74 2d 3e 62  p==0 || pSort->b
5b10: 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70  OrderedInnerLoop
5b20: 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==1 );.    sqlit
5b30: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5b40: 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20 69 4c  OP_IfNotZero, iL
5b50: 69 6d 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62  imit, sqlite3Vdb
5b60: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
5b70: 34 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  4);.    VdbeCove
5b80: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
5b90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5ba0: 2c 20 4f 50 5f 4c 61 73 74 2c 20 69 43 73 72 2c  , OP_Last, iCsr,
5bb0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
5bc0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
5bd0: 20 4f 50 5f 49 64 78 4c 45 2c 20 69 43 73 72 2c   OP_IdxLE, iCsr,
5be0: 20 69 4a 6d 70 2c 20 72 65 67 42 61 73 65 2b 6e   iJmp, regBase+n
5bf0: 4f 42 53 61 74 2c 20 6e 45 78 70 72 2d 6e 4f 42  OBSat, nExpr-nOB
5c00: 53 61 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Sat);.    VdbeCo
5c10: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
5c20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5c30: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69  (v, OP_Delete, i
5c40: 43 73 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Csr);.  }.  if( 
5c50: 6e 4f 42 53 61 74 3c 3d 30 20 29 7b 0a 20 20 20  nOBSat<=0 ){.   
5c60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5c70: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
5c80: 6f 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42  ord, regBase+nOB
5c90: 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61  Sat, nBase-nOBSa
5ca0: 74 2c 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  t,regRecord);.  
5cb0: 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73  }.  if( pSort->s
5cc0: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
5cd0: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b  LAG_UseSorter ){
5ce0: 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72  .    op = OP_Sor
5cf0: 74 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c  terInsert;.  }el
5d00: 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f  se{.    op = OP_
5d10: 49 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20  IdxInsert;.  }. 
5d20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5d30: 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 70 53 6f  p4Int(v, op, pSo
5d40: 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65  rt->iECursor, re
5d50: 67 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20  gRecord,.       
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d70: 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20  regBase+nOBSat, 
5d80: 6e 42 61 73 65 2d 6e 4f 42 53 61 74 29 3b 0a 7d  nBase-nOBSat);.}
5d90: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65  ../*.** Add code
5da0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
5db0: 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74  e OFFSET.*/.stat
5dc0: 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73  ic void codeOffs
5dd0: 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  et(.  Vdbe *v,  
5de0: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
5df0: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
5e00: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69  is VM */.  int i
5e10: 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20  Offset,      /* 
5e20: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
5e30: 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e   the offset coun
5e40: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ter */.  int iCo
5e50: 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75  ntinue     /* Ju
5e60: 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  mp here to skip 
5e70: 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f  the current reco
5e80: 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69  rd */.){.  if( i
5e90: 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20  Offset>0 ){.    
5ea0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5eb0: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  3(v, OP_IfPos, i
5ec0: 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75  Offset, iContinu
5ed0: 65 2c 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72  e, 1); VdbeCover
5ee0: 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65  age(v);.    Vdbe
5ef0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46  Comment((v, "OFF
5f00: 53 45 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  SET"));.  }.}../
5f10: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68  *.** Add code th
5f20: 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f  at will check to
5f30: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e   make sure the N
5f40: 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
5f50: 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66  ing at iMem.** f
5f60: 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65  orm a distinct e
5f70: 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61  ntry.  iTab is a
5f80: 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
5f90: 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f  hat holds previo
5fa0: 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d  usly.** seen com
5fb0: 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  binations of the
5fc0: 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65   N values.  A ne
5fd0: 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20  w entry is made 
5fe0: 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68  in iTab.** if th
5ff0: 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75  e current N valu
6000: 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a  es are new..**.*
6010: 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72  * A jump to addr
6020: 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61  Repeat is made a
6030: 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65  nd the N+1 value
6040: 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f  s are popped fro
6050: 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69  m the.** stack i
6060: 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d  f the top N elem
6070: 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73  ents are not dis
6080: 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  tinct..*/.static
6090: 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e   void codeDistin
60a0: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
60b0: 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
60c0: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
60d0: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
60e0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
60f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72          /* A sor
6100: 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20  ting index used 
6110: 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74  to test for dist
6120: 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e  inctness */.  in
6130: 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20  t addrRepeat,   
6140: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
6150: 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74   if not distinct
6160: 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20   */.  int N,    
6170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6180: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a  er of elements *
6190: 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20  /.  int iMem    
61a0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
61b0: 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  element */.){.  
61c0: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72  Vdbe *v;.  int r
61d0: 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65  1;..  v = pParse
61e0: 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20  ->pVdbe;.  r1 = 
61f0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
6200: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
6210: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
6220: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
6230: 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c  Tab, addrRepeat,
6240: 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43   iMem, N); VdbeC
6250: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
6260: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6270: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
6280: 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a  , iMem, N, r1);.
6290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
62a0: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
62b0: 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31  Insert, iTab, r1
62c0: 2c 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71  , iMem, N);.  sq
62d0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
62e0: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
62f0: 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71  EEKRESULT);.  sq
6300: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
6310: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
6320: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
6330: 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f  E_ENABLE_SORTER_
6340: 52 45 46 45 52 45 4e 43 45 53 0a 2f 2a 0a 2a 2a  REFERENCES./*.**
6350: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
6360: 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
6370: 20 6f 66 20 69 6e 6e 65 72 2d 6c 6f 6f 70 20 67   of inner-loop g
6380: 65 6e 65 72 61 74 69 6f 6e 20 66 6f 72 20 61 20  eneration for a 
6390: 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
63a0: 65 6e 74 20 77 69 74 68 20 61 6e 20 4f 52 44 45  ent with an ORDE
63b0: 52 20 42 59 20 74 68 61 74 20 69 73 20 6e 6f 74  R BY that is not
63c0: 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 61 6e   optimized by an
63d0: 20 69 6e 64 65 78 2e 20 49 74 20 0a 2a 2a 20 64   index. It .** d
63e0: 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 65 78  etermines the ex
63f0: 70 72 65 73 73 69 6f 6e 73 2c 20 69 66 20 61 6e  pressions, if an
6400: 79 2c 20 74 68 61 74 20 74 68 65 20 73 6f 72 74  y, that the sort
6410: 65 72 2d 72 65 66 65 72 65 6e 63 65 20 0a 2a 2a  er-reference .**
6420: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73 68   optimization sh
6430: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
6440: 2e 20 54 68 65 20 73 6f 72 74 65 72 2d 72 65 66  . The sorter-ref
6450: 65 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74  erence optimizat
6460: 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20 66  ion.** is used f
6470: 6f 72 20 53 45 4c 45 43 54 20 71 75 65 72 69 65  or SELECT querie
6480: 73 20 6c 69 6b 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  s like:.**.**   
6490: 53 45 4c 45 43 54 20 61 2c 20 62 69 67 62 6c 6f  SELECT a, bigblo
64a0: 62 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  b FROM t1 ORDER 
64b0: 42 59 20 61 20 4c 49 4d 49 54 20 31 30 0a 2a 2a  BY a LIMIT 10.**
64c0: 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d  .** If the optim
64d0: 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  ization is used 
64e0: 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 22  for expression "
64f0: 62 69 67 62 6c 6f 62 22 2c 20 74 68 65 6e 20 69  bigblob", then i
6500: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 73 74 6f  nstead of.** sto
6510: 72 69 6e 67 20 76 61 6c 75 65 73 20 72 65 61 64  ring values read
6520: 20 66 72 6f 6d 20 74 68 61 74 20 63 6f 6c 75 6d   from that colum
6530: 6e 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20  n in the sorter 
6540: 72 65 63 6f 72 64 73 2c 20 74 68 65 20 50 4b 20  records, the PK 
6550: 6f 66 0a 2a 2a 20 74 68 65 20 72 6f 77 20 66 72  of.** the row fr
6560: 6f 6d 20 74 61 62 6c 65 20 74 31 20 69 73 20 73  om table t1 is s
6570: 74 6f 72 65 64 20 69 6e 73 74 65 61 64 2e 20 54  tored instead. T
6580: 68 65 6e 2c 20 61 73 20 72 65 63 6f 72 64 73 20  hen, as records 
6590: 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72  are extracted fr
65a0: 6f 6d 0a 2a 2a 20 74 68 65 20 73 6f 72 74 65 72  om.** the sorter
65b0: 20 74 6f 20 72 65 74 75 72 6e 20 74 6f 20 74 68   to return to th
65c0: 65 20 75 73 65 72 2c 20 74 68 65 20 72 65 71 75  e user, the requ
65d0: 69 72 65 64 20 76 61 6c 75 65 20 6f 66 20 62 69  ired value of bi
65e0: 67 62 6c 6f 62 20 69 73 0a 2a 2a 20 72 65 74 72  gblob is.** retr
65f0: 69 65 76 65 64 20 64 69 72 65 63 74 6c 79 20 66  ieved directly f
6600: 72 6f 6d 20 74 61 62 6c 65 20 74 31 2e 20 49 66  rom table t1. If
6610: 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20   the values are 
6620: 76 65 72 79 20 6c 61 72 67 65 2c 20 74 68 69 73  very large, this
6630: 20 0a 2a 2a 20 63 61 6e 20 62 65 20 6d 6f 72 65   .** can be more
6640: 20 65 66 66 69 63 69 65 6e 74 20 74 68 61 6e 20   efficient than 
6650: 73 74 6f 72 69 6e 67 20 74 68 65 6d 20 64 69 72  storing them dir
6660: 65 63 74 6c 79 20 69 6e 20 74 68 65 20 73 6f 72  ectly in the sor
6670: 74 65 72 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a  ter records..**.
6680: 2a 2a 20 54 68 65 20 45 78 70 72 4c 69 73 74 5f  ** The ExprList_
6690: 69 74 65 6d 2e 62 53 6f 72 74 65 72 52 65 66 20  item.bSorterRef 
66a0: 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20  flag is set for 
66b0: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
66c0: 69 6e 20 70 45 4c 69 73 74 20 0a 2a 2a 20 66 6f  in pEList .** fo
66d0: 72 20 77 68 69 63 68 20 74 68 65 20 73 6f 72 74  r which the sort
66e0: 65 72 2d 72 65 66 65 72 65 6e 63 65 20 6f 70 74  er-reference opt
66f0: 69 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c 64  imization should
6700: 20 62 65 20 65 6e 61 62 6c 65 64 2e 20 0a 2a 2a   be enabled. .**
6710: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74   Additionally, t
6720: 68 65 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72  he pSort->aDefer
6730: 5b 5d 20 61 72 72 61 79 20 69 73 20 70 6f 70 75  [] array is popu
6740: 6c 61 74 65 64 20 77 69 74 68 20 65 6e 74 72 69  lated with entri
6750: 65 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 63 75  es.** for all cu
6760: 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20 74  rsors required t
6770: 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 73  o evaluate all s
6780: 65 6c 65 63 74 65 64 20 65 78 70 72 65 73 73 69  elected expressi
6790: 6f 6e 73 2e 20 46 69 6e 61 6c 6c 79 2e 0a 2a 2a  ons. Finally..**
67a0: 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
67b0: 20 28 2a 70 70 45 78 74 72 61 29 20 69 73 20 73   (*ppExtra) is s
67c0: 65 74 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  et to an express
67d0: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ion list contain
67e0: 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ing.** expressio
67f0: 6e 73 20 66 6f 72 20 61 6c 6c 20 65 78 74 72 61  ns for all extra
6800: 20 50 4b 20 76 61 6c 75 65 73 20 74 68 61 74 20   PK values that 
6810: 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64  should be stored
6820: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 6f 72 74 65   in the.** sorte
6830: 72 20 72 65 63 6f 72 64 73 2e 0a 2a 2f 0a 73 74  r records..*/.st
6840: 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
6850: 45 78 70 72 44 65 66 65 72 28 0a 20 20 50 61 72  ExprDefer(.  Par
6860: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
6870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6880: 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
6890: 68 65 72 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74  here */.  SortCt
68a0: 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20  x *pSort,       
68b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72            /* Sor
68c0: 74 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ter context */. 
68d0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
68e0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
68f0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
6900: 64 65 73 74 69 6e 65 64 20 66 6f 72 20 73 6f 72  destined for sor
6910: 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ter */.  ExprLis
6920: 74 20 2a 2a 70 70 45 78 74 72 61 20 20 20 20 20  t **ppExtra     
6930: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
6940: 65 73 73 69 6f 6e 73 20 74 6f 20 61 70 70 65 6e  essions to appen
6950: 64 20 74 6f 20 73 6f 72 74 65 72 20 72 65 63 6f  d to sorter reco
6960: 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  rd */.){.  int i
6970: 3b 0a 20 20 69 6e 74 20 6e 44 65 66 65 72 20 3d  ;.  int nDefer =
6980: 20 30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   0;.  ExprList *
6990: 70 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 66 6f  pExtra = 0;.  fo
69a0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
69b0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
69c0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
69d0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
69e0: 26 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20  &pEList->a[i];. 
69f0: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e     if( pItem->u.
6a00: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30  x.iOrderByCol==0
6a10: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
6a20: 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70  pExpr = pItem->p
6a30: 45 78 70 72 3b 0a 20 20 20 20 20 20 54 61 62 6c  Expr;.      Tabl
6a40: 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d  e *pTab = pExpr-
6a50: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  >pTab;.      if(
6a60: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
6a70: 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 20 26 26  OLUMN && pTab &&
6a80: 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
6a90: 29 0a 20 20 20 20 20 20 20 26 26 20 28 70 54 61  ).       && (pTa
6aa0: 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
6ab0: 43 6f 6c 75 6d 6e 5d 2e 63 6f 6c 46 6c 61 67 73  Column].colFlags
6ac0: 20 26 20 43 4f 4c 46 4c 41 47 5f 53 4f 52 54 45   & COLFLAG_SORTE
6ad0: 52 52 45 46 29 0a 23 69 66 20 30 0a 20 20 20 20  RREF).#if 0.    
6ae0: 20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70        && pTab->p
6af0: 53 63 68 65 6d 61 20 26 26 20 70 54 61 62 2d 3e  Schema && pTab->
6b00: 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 21 49  pSelect==0 && !I
6b10: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 0a 23  sVirtual(pTab).#
6b20: 65 6e 64 69 66 0a 20 20 20 20 20 20 29 7b 0a 20  endif.      ){. 
6b30: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
6b40: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
6b50: 3c 6e 44 65 66 65 72 3b 20 6a 2b 2b 29 7b 0a 20  <nDefer; j++){. 
6b60: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 6f           if( pSo
6b70: 72 74 2d 3e 61 44 65 66 65 72 5b 6a 5d 2e 69 43  rt->aDefer[j].iC
6b80: 73 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  sr==pExpr->iTabl
6b90: 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  e ) break;.     
6ba0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
6bb0: 20 6a 3d 3d 6e 44 65 66 65 72 20 29 7b 0a 20 20   j==nDefer ){.  
6bc0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 44 65 66          if( nDef
6bd0: 65 72 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 53  er==ArraySize(pS
6be0: 6f 72 74 2d 3e 61 44 65 66 65 72 29 20 29 7b 0a  ort->aDefer) ){.
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
6c00: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
6c10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
6c20: 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 31 3b     int nKey = 1;
6c30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
6c40: 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   k;.            
6c50: 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 0a  Index *pPk = 0;.
6c60: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
6c70: 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
6c80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
6c90: 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72   pPk = sqlite3Pr
6ca0: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
6cb0: 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ab);.           
6cc0: 20 20 20 6e 4b 65 79 20 3d 20 70 50 6b 2d 3e 6e     nKey = pPk->n
6cd0: 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  KeyCol;.        
6ce0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6cf0: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65    for(k=0; k<nKe
6d00: 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; k++){.       
6d10: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65         Expr *pNe
6d20: 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  w = sqlite3PExpr
6d30: 28 70 50 61 72 73 65 2c 20 54 4b 5f 43 4f 4c 55  (pParse, TK_COLU
6d40: 4d 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  MN, 0, 0);.     
6d50: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
6d60: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  w ){.           
6d70: 20 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 6c       pNew->iTabl
6d80: 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  e = pExpr->iTabl
6d90: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
6da0: 20 20 20 70 4e 65 77 2d 3e 70 54 61 62 20 3d 20     pNew->pTab = 
6db0: 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
6dd0: 77 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 50 6b  w->iColumn = pPk
6de0: 20 3f 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   ? pPk->aiColumn
6df0: 5b 6b 5d 20 3a 20 2d 31 3b 0a 20 20 20 20 20 20  [k] : -1;.      
6e00: 20 20 20 20 20 20 20 20 20 20 70 45 78 74 72 61            pExtra
6e10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
6e20: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
6e30: 20 70 45 78 74 72 61 2c 20 70 4e 65 77 29 3b 0a   pExtra, pNew);.
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
6e60: 20 20 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d            pSort-
6e70: 3e 61 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e  >aDefer[nDefer].
6e80: 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
6e90: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
6ea0: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44  pSort->aDefer[nD
6eb0: 65 66 65 72 5d 2e 69 43 73 72 20 3d 20 70 45 78  efer].iCsr = pEx
6ec0: 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
6ed0: 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61          pSort->a
6ee0: 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e 6e 4b  Defer[nDefer].nK
6ef0: 65 79 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 20  ey = nKey;.     
6f00: 20 20 20 20 20 20 20 6e 44 65 66 65 72 2b 2b 3b         nDefer++;
6f10: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6f20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
6f30: 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66  Item->bSorterRef
6f40: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
6f50: 20 20 7d 0a 20 20 7d 0a 20 20 70 53 6f 72 74 2d    }.  }.  pSort-
6f60: 3e 6e 44 65 66 65 72 20 3d 20 28 75 38 29 6e 44  >nDefer = (u8)nD
6f70: 65 66 65 72 3b 0a 20 20 2a 70 70 45 78 74 72 61  efer;.  *ppExtra
6f80: 20 3d 20 70 45 78 74 72 61 3b 0a 7d 0a 23 65 6e   = pExtra;.}.#en
6f90: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
6fa0: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
6fb0: 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74  s the code for t
6fc0: 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65  he inside of the
6fd0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f   inner loop.** o
6fe0: 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a  f a SELECT..**.*
6ff0: 2a 20 49 66 20 73 72 63 54 61 62 20 69 73 20 6e  * If srcTab is n
7000: 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68  egative, then th
7010: 65 20 70 2d 3e 70 45 4c 69 73 74 20 65 78 70 72  e p->pEList expr
7020: 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65  essions.** are e
7030: 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65  valuated in orde
7040: 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74  r to get the dat
7050: 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20  a for this row. 
7060: 20 49 66 20 73 72 63 54 61 62 20 69 73 0a 2a 2a   If srcTab is.**
7070: 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74   zero or more, t
7080: 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c  hen data is pull
7090: 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61  ed from srcTab a
70a0: 6e 64 20 70 2d 3e 70 45 4c 69 73 74 20 69 73 20  nd p->pEList is 
70b0: 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f  used only .** to
70c0: 20 67 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   get the number 
70d0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74  of columns and t
70e0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
70f0: 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63  uence for each c
7100: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  olumn..*/.static
7110: 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65   void selectInne
7120: 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a  rLoop(.  Parse *
7130: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
7140: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
7150: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
7160: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
7170: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
7180: 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  ete select state
7190: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
71a0: 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62   */.  int srcTab
71b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
71c0: 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20   Pull data from 
71d0: 74 68 69 73 20 74 61 62 6c 65 20 69 66 20 6e 6f  this table if no
71e0: 6e 2d 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20 20  n-negative */.  
71f0: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20  SortCtx *pSort, 
7200: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
7210: 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20  t NULL, info on 
7220: 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f  how to process O
7230: 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73  RDER BY */.  Dis
7240: 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69  tinctCtx *pDisti
7250: 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e  nct, /* If not N
7260: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
7270: 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54   to process DIST
7280: 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74  INCT */.  Select
7290: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
72a0: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
72b0: 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ose of the resul
72c0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  ts */.  int iCon
72d0: 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20  tinue,          
72e0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
72f0: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65  continue with ne
7300: 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20  xt row */.  int 
7310: 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
7320: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
7330: 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
7340: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
7350: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
7360: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
7370: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
7380: 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20  hasDistinct;    
7390: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
73a0: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
73b0: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
73c0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  nt */.  int eDes
73d0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
73e0: 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69  ;   /* How to di
73f0: 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73  spose of results
7400: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20   */.  int iParm 
7410: 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  = pDest->iSDParm
7420: 3b 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d  ; /* First argum
7430: 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20  ent to disposal 
7440: 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20  method */.  int 
7450: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20  nResultCol;     
7460: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7470: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
7480: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  mns */.  int nPr
7490: 65 66 69 78 52 65 67 20 3d 20 30 3b 20 20 20 20  efixReg = 0;    
74a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
74b0: 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
74c0: 73 20 62 65 66 6f 72 65 20 72 65 67 52 65 73 75  s before regResu
74d0: 6c 74 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 75 61  lt */..  /* Usua
74e0: 6c 6c 79 2c 20 72 65 67 52 65 73 75 6c 74 20 69  lly, regResult i
74f0: 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  s the first cell
7500: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
7510: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 0a 20 20 2a  memory cells.  *
7520: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
7530: 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 20   current result 
7540: 72 6f 77 2e 20 49 6e 20 74 68 69 73 20 63 61 73  row. In this cas
7550: 65 20 72 65 67 4f 72 69 67 20 69 73 20 73 65 74  e regOrig is set
7560: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d   to the.  ** sam
7570: 65 20 76 61 6c 75 65 2e 20 48 6f 77 65 76 65 72  e value. However
7580: 2c 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73  , if the results
7590: 20 61 72 65 20 62 65 69 6e 67 20 73 65 6e 74 20   are being sent 
75a0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c 20 74  to the sorter, t
75b0: 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 66  he.  ** values f
75c0: 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  or any expressio
75d0: 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f  ns that are also
75e0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 6f 72   part of the sor
75f0: 74 2d 6b 65 79 20 61 72 65 20 6f 6d 69 74 74 65  t-key are omitte
7600: 64 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 69 73  d.  ** from this
7610: 20 61 72 72 61 79 2e 20 49 6e 20 74 68 69 73 20   array. In this 
7620: 63 61 73 65 20 72 65 67 4f 72 69 67 20 69 73 20  case regOrig is 
7630: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 2a 2f  set to zero.  */
7640: 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74  .  int regResult
7650: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7660: 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72  * Start of memor
7670: 79 20 68 6f 6c 64 69 6e 67 20 63 75 72 72 65 6e  y holding curren
7680: 74 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  t results */.  i
7690: 6e 74 20 72 65 67 4f 72 69 67 3b 20 20 20 20 20  nt regOrig;     
76a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
76b0: 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f  art of memory ho
76c0: 6c 64 69 6e 67 20 66 75 6c 6c 20 72 65 73 75 6c  lding full resul
76d0: 74 20 28 6f 72 20 30 29 20 2a 2f 0a 0a 20 20 61  t (or 0) */..  a
76e0: 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 61 73  ssert( v );.  as
76f0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21  sert( p->pEList!
7700: 3d 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69  =0 );.  hasDisti
7710: 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20  nct = pDistinct 
7720: 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ? pDistinct->eTn
7730: 63 74 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44  ctType : WHERE_D
7740: 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20  ISTINCT_NOOP;.  
7750: 69 66 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f  if( pSort && pSo
7760: 72 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  rt->pOrderBy==0 
7770: 29 20 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69  ) pSort = 0;.  i
7780: 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21  f( pSort==0 && !
7790: 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  hasDistinct ){. 
77a0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74     assert( iCont
77b0: 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63  inue!=0 );.    c
77c0: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
77d0: 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
77e0: 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  ue);.  }..  /* P
77f0: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
7800: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
7810: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70    nResultCol = p
7820: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
7830: 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69  ..  if( pDest->i
7840: 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Sdst==0 ){.    i
7850: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
7860: 20 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20 70    nPrefixReg = p
7870: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
7880: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  nExpr;.      if(
7890: 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c   !(pSort->sortFl
78a0: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
78b0: 73 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72 65  seSorter) ) nPre
78c0: 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20  fixReg++;.      
78d0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
78e0: 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20 20  nPrefixReg;.    
78f0: 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64  }.    pDest->iSd
7900: 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  st = pParse->nMe
7910: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
7920: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
7930: 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Col;.  }else if(
7940: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52   pDest->iSdst+nR
7950: 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73  esultCol > pPars
7960: 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f  e->nMem ){.    /
7970: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72 72  * This is an err
7980: 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61  or condition tha
7990: 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f  t can result, fo
79a0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
79b0: 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  a SELECT.    ** 
79c0: 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
79d0: 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e 53  d side of an INS
79e0: 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ERT contains mor
79f0: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  e result columns
7a00: 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65   than.    ** the
7a10: 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69  re are columns i
7a20: 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  n the table on t
7a30: 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65 72  he left.  The er
7a40: 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67  ror will be caug
7a50: 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  ht.    ** and re
7a60: 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20 42  ported later.  B
7a70: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61  ut we need to ma
7a80: 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20 6d  ke sure enough m
7a90: 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74  emory is allocat
7aa0: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f  ed.    ** to avo
7ab0: 69 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f 75  id other spuriou
7ac0: 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20  s errors in the 
7ad0: 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20  meantime. */.   
7ae0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
7af0: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
7b00: 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
7b10: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
7b20: 72 65 67 4f 72 69 67 20 3d 20 72 65 67 52 65 73  regOrig = regRes
7b30: 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64  ult = pDest->iSd
7b40: 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62  st;.  if( srcTab
7b50: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
7b60: 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  =0; i<nResultCol
7b70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
7b80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7b90: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
7ba0: 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75  cTab, i, regResu
7bb0: 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62  lt+i);.      Vdb
7bc0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
7bd0: 22 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  ", p->pEList->a[
7be0: 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  i].zName));.    
7bf0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44  }.  }else if( eD
7c00: 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20  est!=SRT_Exists 
7c10: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
7c20: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
7c30: 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 45 78  EFERENCES.    Ex
7c40: 70 72 4c 69 73 74 20 2a 70 45 78 74 72 61 20 3d  prList *pExtra =
7c50: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f   0;.#endif.    /
7c60: 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61  * If the destina
7c70: 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54  tion is an EXIST
7c80: 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f  S(...) expressio
7c90: 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20  n, the actual.  
7ca0: 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75    ** values retu
7cb0: 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45  rned by the SELE
7cc0: 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69  CT are not requi
7cd0: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
7ce0: 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 0a 20 20  u8 ecelFlags;.  
7cf0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
7d00: 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53  _Mem || eDest==S
7d10: 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65  RT_Output || eDe
7d20: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
7d30: 65 20 29 7b 0a 20 20 20 20 20 20 65 63 65 6c 46  e ){.      ecelF
7d40: 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 45 43  lags = SQLITE_EC
7d50: 45 4c 5f 44 55 50 3b 0a 20 20 20 20 7d 65 6c 73  EL_DUP;.    }els
7d60: 65 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61  e{.      ecelFla
7d70: 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  gs = 0;.    }.  
7d80: 20 20 69 66 28 20 70 53 6f 72 74 20 26 26 20 68    if( pSort && h
7d90: 61 73 44 69 73 74 69 6e 63 74 3d 3d 30 20 26 26  asDistinct==0 &&
7da0: 20 65 44 65 73 74 21 3d 53 52 54 5f 45 70 68 65   eDest!=SRT_Ephe
7db0: 6d 54 61 62 20 26 26 20 65 44 65 73 74 21 3d 53  mTab && eDest!=S
7dc0: 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  RT_Table ){.    
7dd0: 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 65 78    /* For each ex
7de0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 70 2d 3e 70  pression in p->p
7df0: 45 4c 69 73 74 20 74 68 61 74 20 69 73 20 61 20  EList that is a 
7e00: 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65  copy of an expre
7e10: 73 73 69 6f 6e 20 69 6e 0a 20 20 20 20 20 20 2a  ssion in.      *
7e20: 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
7e30: 6c 61 75 73 65 20 28 70 53 6f 72 74 2d 3e 70 4f  lause (pSort->pO
7e40: 72 64 65 72 42 79 29 2c 20 73 65 74 20 74 68 65  rderBy), set the
7e50: 20 61 73 73 6f 63 69 61 74 65 64 20 0a 20 20 20   associated .   
7e60: 20 20 20 2a 2a 20 69 4f 72 64 65 72 42 79 43 6f     ** iOrderByCo
7e70: 6c 20 76 61 6c 75 65 20 74 6f 20 6f 6e 65 20 6d  l value to one m
7e80: 6f 72 65 20 74 68 61 6e 20 74 68 65 20 69 6e 64  ore than the ind
7e90: 65 78 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ex of the ORDER 
7ea0: 42 59 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  BY .      ** exp
7eb0: 72 65 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74  ression within t
7ec0: 68 65 20 73 6f 72 74 2d 6b 65 79 20 74 68 61 74  he sort-key that
7ed0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
7ee0: 29 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e  ) will generate.
7ef0: 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 61  .      ** This a
7f00: 6c 6c 6f 77 73 20 74 68 65 20 70 2d 3e 70 45 4c  llows the p->pEL
7f10: 69 73 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20  ist field to be 
7f20: 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
7f30: 20 73 6f 72 74 65 64 20 72 65 63 6f 72 64 2c 0a   sorted record,.
7f40: 20 20 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20        ** saving 
7f50: 73 70 61 63 65 20 61 6e 64 20 43 50 55 20 63 79  space and CPU cy
7f60: 63 6c 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  cles.  */.      
7f70: 65 63 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53 51  ecelFlags |= (SQ
7f80: 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45  LITE_ECEL_OMITRE
7f90: 46 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  F|SQLITE_ECEL_RE
7fa0: 46 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  F);.      for(i=
7fb0: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69  pSort->nOBSat; i
7fc0: 3c 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79  <pSort->pOrderBy
7fd0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
7fe0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
7ff0: 20 20 20 20 20 20 69 66 28 20 28 6a 20 3d 20 70        if( (j = p
8000: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
8010: 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
8020: 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20  yCol)>0 ){.     
8030: 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e       p->pEList->
8040: 61 5b 6a 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64 65  a[j-1].u.x.iOrde
8050: 72 42 79 43 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f  rByCol = i+1-pSo
8060: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20  rt->nOBSat;.    
8070: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69      }.      }.#i
8080: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8090: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
80a0: 4e 43 45 53 0a 20 20 20 20 20 20 73 65 6c 65 63  NCES.      selec
80b0: 74 45 78 70 72 44 65 66 65 72 28 70 50 61 72 73  tExprDefer(pPars
80c0: 65 2c 20 70 53 6f 72 74 2c 20 70 2d 3e 70 45 4c  e, pSort, p->pEL
80d0: 69 73 74 2c 20 26 70 45 78 74 72 61 29 3b 0a 20  ist, &pExtra);. 
80e0: 20 20 20 20 20 69 66 28 20 70 45 78 74 72 61 20       if( pExtra 
80f0: 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  && pParse->db->m
8100: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
8110: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
8120: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 65 78  there are any ex
8130: 74 72 61 20 50 4b 20 63 6f 6c 75 6d 6e 73 20 74  tra PK columns t
8140: 6f 20 61 64 64 20 74 6f 20 74 68 65 20 73 6f 72  o add to the sor
8150: 74 65 72 20 72 65 63 6f 72 64 73 2c 0a 20 20 20  ter records,.   
8160: 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
8170: 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 63 65   extra memory ce
8180: 6c 6c 73 20 61 6e 64 20 61 64 6a 75 73 74 20 74  lls and adjust t
8190: 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  he OpenEphemeral
81a0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73   .        ** ins
81b0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 61 63 63 6f  truction to acco
81c0: 75 6e 74 20 66 6f 72 20 74 68 65 20 6c 61 72 67  unt for the larg
81d0: 65 72 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73  er records. This
81e0: 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20   is only.       
81f0: 20 2a 2a 20 72 65 71 75 69 72 65 64 20 69 66 20   ** required if 
8200: 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72  there are one or
8210: 20 6d 6f 72 65 20 57 49 54 48 4f 55 54 20 52 4f   more WITHOUT RO
8220: 57 49 44 20 74 61 62 6c 65 73 20 77 69 74 68 0a  WID tables with.
8230: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6f          ** compo
8240: 73 69 74 65 20 70 72 69 6d 61 72 79 20 6b 65 79  site primary key
8250: 73 20 69 6e 20 74 68 65 20 53 6f 72 74 43 74 78  s in the SortCtx
8260: 2e 61 44 65 66 65 72 5b 5d 20 61 72 72 61 79 2e  .aDefer[] array.
8270: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 56 64 62    */.        Vdb
8280: 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74  eOp *pOp = sqlit
8290: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
82a0: 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e  Sort->addrSortIn
82b0: 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  dex);.        pO
82c0: 70 2d 3e 70 32 20 2b 3d 20 28 70 45 78 74 72 61  p->p2 += (pExtra
82d0: 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  ->nExpr - pSort-
82e0: 3e 6e 44 65 66 65 72 29 3b 0a 20 20 20 20 20 20  >nDefer);.      
82f0: 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e    pOp->p4.pKeyIn
8300: 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 2b 3d  fo->nAllField +=
8310: 20 28 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 20   (pExtra->nExpr 
8320: 2d 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 29  - pSort->nDefer)
8330: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
8340: 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 45 78 74 72 61  ->nMem += pExtra
8350: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 7d  ->nExpr;.      }
8360: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
8370: 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20 20 20  gOrig = 0;.     
8380: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
8390: 53 52 54 5f 53 65 74 20 7c 7c 20 65 44 65 73 74  SRT_Set || eDest
83a0: 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20 20 20 20 20  ==SRT_Mem .     
83b0: 20 20 20 20 20 20 7c 7c 20 65 44 65 73 74 3d 3d        || eDest==
83c0: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c 7c  SRT_Coroutine ||
83d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
83e0: 75 74 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ut );.    }.    
83f0: 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 73 71 6c  nResultCol = sql
8400: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
8410: 4c 69 73 74 28 70 50 61 72 73 65 2c 70 2d 3e 70  List(pParse,p->p
8420: 45 4c 69 73 74 2c 72 65 67 52 65 73 75 6c 74 2c  EList,regResult,
8430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8450: 20 20 20 20 20 20 20 20 20 20 30 2c 65 63 65 6c            0,ecel
8460: 46 6c 61 67 73 29 3b 0a 23 69 66 64 65 66 20 53  Flags);.#ifdef S
8470: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
8480: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20  TER_REFERENCES. 
8490: 20 20 20 69 66 28 20 70 45 78 74 72 61 20 29 7b     if( pExtra ){
84a0: 0a 20 20 20 20 20 20 6e 52 65 73 75 6c 74 43 6f  .      nResultCo
84b0: 6c 20 2b 3d 20 73 71 6c 69 74 65 33 45 78 70 72  l += sqlite3Expr
84c0: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
84d0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
84e0: 70 45 78 74 72 61 2c 20 72 65 67 52 65 73 75 6c  pExtra, regResul
84f0: 74 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  t + nResultCol, 
8500: 30 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  0, 0.      );.  
8510: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
8520: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
8530: 2d 3e 64 62 2c 20 70 45 78 74 72 61 29 3b 0a 20  ->db, pExtra);. 
8540: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
8550: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53  .  /* If the DIS
8560: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61  TINCT keyword wa
8570: 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65  s present on the
8580: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
8590: 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20  t.  ** and this 
85a0: 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65  row has been see
85b0: 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64  n before, then d
85c0: 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20  o not make this 
85d0: 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66  row.  ** part of
85e0: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
85f0: 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69  /.  if( hasDisti
8600: 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69 74 63  nct ){.    switc
8610: 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54  h( pDistinct->eT
8620: 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20 20  nctType ){.     
8630: 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
8640: 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a  INCT_ORDERED: {.
8650: 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a          VdbeOp *
8660: 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  pOp;            
8670: 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71  /* No longer req
8680: 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65  uired OpenEpheme
8690: 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20  ral instr. */.  
86a0: 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b        int iJump;
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
86c0: 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   Jump destinatio
86d0: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  n */.        int
86e0: 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20   regPrev;       
86f0: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
8700: 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a   row content */.
8710: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f  .        /* Allo
8720: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
8730: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
8740: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50 72  */.        regPr
8750: 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ev = pParse->nMe
8760: 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  m+1;.        pPa
8770: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
8780: 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20 20  sultCol;..      
8790: 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20    /* Change the 
87a0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
87b0: 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74   coded earlier t
87c0: 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20  o an OP_Null.   
87d0: 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65       ** sets the
87e0: 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74   MEM_Cleared bit
87f0: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72 65   on the first re
8800: 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20  gister of the.  
8810: 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
8820: 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77  s value.  This w
8830: 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50  ill cause the OP
8840: 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77  _Ne below to alw
8850: 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  ays.        ** f
8860: 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74  ail on the first
8870: 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
8880: 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74  e loop even if t
8890: 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20  he first.       
88a0: 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e   ** row is all N
88b0: 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ULLs..        */
88c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
88d0: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
88e0: 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61  (v, pDistinct->a
88f0: 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20  ddrTnct);.      
8900: 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
8910: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73  dbeGetOp(v, pDis
8920: 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29  tinct->addrTnct)
8930: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f  ;.        pOp->o
8940: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b  pcode = OP_Null;
8950: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31  .        pOp->p1
8960: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 1;.        pO
8970: 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b  p->p2 = regPrev;
8980: 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20  ..        iJump 
8990: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
89a0: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 52  rentAddr(v) + nR
89b0: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20 20  esultCol;.      
89c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
89d0: 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  sultCol; i++){. 
89e0: 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
89f0: 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
8a00: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
8a10: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
8a20: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
8a30: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65         if( i<nRe
8a40: 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20  sultCol-1 ){.   
8a50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8a60: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8a70: 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  _Ne, regResult+i
8a80: 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76  , iJump, regPrev
8a90: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
8aa0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
8ab0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
8ac0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
8ad0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8ae0: 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65  (v, OP_Eq, regRe
8af0: 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75  sult+i, iContinu
8b00: 65 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20  e, regPrev+i);. 
8b10: 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
8b20: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
8b30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8b40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
8b50: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
8b60: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c  onst char *)pCol
8b70: 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
8b80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8b90: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
8ba0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
8bb0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8bc0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
8bd0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
8be0: 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70  r(v)==iJump || p
8bf0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
8c00: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
8c10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8c20: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
8c30: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50   regResult, regP
8c40: 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d  rev, nResultCol-
8c50: 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
8c60: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
8c70: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
8c80: 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a  TINCT_UNIQUE: {.
8c90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8ca0: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
8cb0: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
8cc0: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
8cd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
8ce0: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
8cf0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
8d00: 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ( pDistinct->eTn
8d10: 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49  ctType==WHERE_DI
8d20: 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
8d30: 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
8d40: 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
8d50: 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54   pDistinct->tabT
8d60: 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  nct, iContinue, 
8d70: 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20  nResultCol,.    
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d90: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
8da0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8db0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
8dc0: 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20  ( pSort==0 ){.  
8dd0: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
8de0: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
8df0: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a  ontinue);.    }.
8e00: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65    }..  switch( e
8e10: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Dest ){.    /* I
8e20: 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69  n this mode, wri
8e30: 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65  te each query re
8e40: 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20  sult to the key 
8e50: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
8e60: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50  .    ** table iP
8e70: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  arm..    */.#ifn
8e80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8e90: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
8ea0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
8eb0: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  on: {.      int 
8ec0: 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  r1;.      r1 = s
8ed0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
8ee0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
8ef0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8f00: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
8f10: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
8f20: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a  ResultCol, r1);.
8f30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8f40: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
8f50: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
8f60: 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74  m, r1, regResult
8f70: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
8f80: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
8f90: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
8fa0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
8fb0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
8fc0: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
8fd0: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
8fe0: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
8ff0: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
9000: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
9010: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
9020: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
9030: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
9040: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
9050: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
9060: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
9070: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
9080: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9090: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
90a0: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72  Delete, iParm, r
90b0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
90c0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  tCol);.      bre
90d0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
90e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
90f0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
9100: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65  */..    /* Store
9110: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
9120: 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
9130: 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
9140: 20 20 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f     case SRT_Fifo
9150: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44  :.    case SRT_D
9160: 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  istFifo:.    cas
9170: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
9180: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
9190: 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
91a0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
91b0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
91c0: 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a   nPrefixReg+1);.
91d0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
91e0: 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65  eDest==SRT_Table
91f0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
9200: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45  se( eDest==SRT_E
9210: 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
9220: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
9230: 3d 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20  ==SRT_Fifo );.  
9240: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
9250: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66  est==SRT_DistFif
9260: 6f 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  o );.      sqlit
9270: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
9280: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
9290: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
92a0: 74 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78  tCol, r1+nPrefix
92b0: 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Reg);.#ifndef SQ
92c0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
92d0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
92e0: 52 54 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20  RT_DistFifo ){. 
92f0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
9300: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
9310: 44 69 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63  DistFifo, then c
9320: 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20  ursor (iParm+1) 
9330: 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  is open.        
9340: 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72  ** on an ephemer
9350: 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65  al index. If the
9360: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20   current row is 
9370: 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a  already present.
9380: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
9390: 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20  e index, do not 
93a0: 77 72 69 74 65 20 69 74 20 74 6f 20 74 68 65 20  write it to the 
93b0: 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20  output. If not, 
93c0: 61 64 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  add the.        
93d0: 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74  ** current row t
93e0: 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  o the index and 
93f0: 70 72 6f 63 65 65 64 20 77 69 74 68 20 77 72 69  proceed with wri
9400: 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20  ting it to the. 
9410: 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
9420: 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20   table as well. 
9430: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
9440: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
9450: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
9460: 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71   + 4;.        sq
9470: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
9480: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
9490: 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72  iParm+1, addr, r
94a0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56  1, 0);.        V
94b0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
94c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
94d0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
94e0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
94f0: 61 72 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73  arm+1, r1,regRes
9500: 75 6c 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  ult,nResultCol);
9510: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9520: 20 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20   pSort==0 );.   
9530: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
9540: 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20    if( pSort ){. 
9550: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
9560: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53  orter(pParse, pS
9570: 6f 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66  ort, p, r1+nPref
9580: 69 78 52 65 67 2c 72 65 67 52 65 73 75 6c 74 2c  ixReg,regResult,
9590: 31 2c 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  1,nPrefixReg);. 
95a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
95b0: 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
95c0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
95d0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
95e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
95f0: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
9600: 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20  , iParm, r2);.  
9610: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9620: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
9630: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c  sert, iParm, r1,
9640: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r2);.        sq
9650: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
9660: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
9670: 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ND);.        sql
9680: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
9690: 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
96a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
96b0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
96c0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  Range(pParse, r1
96d0: 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b  , nPrefixReg+1);
96e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
96f0: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
9700: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
9710: 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
9720: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
9730: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
9740: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
9750: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
9760: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
9770: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
9780: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
9790: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
97a0: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
97b0: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
97c0: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
97d0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
97e0: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
97f0: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
9800: 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74       /* At first
9810: 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c   glance you woul
9820: 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64  d think we could
9830: 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68   optimize out th
9840: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44  e.        ** ORD
9850: 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61  ER BY in this ca
9860: 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64  se since the ord
9870: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
9880: 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20   the set.       
9890: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   ** does not mat
98a0: 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20  ter.  But there 
98b0: 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54  might be a LIMIT
98c0: 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63   clause, in whic
98d0: 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73  h.        ** cas
98e0: 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73  e the order does
98f0: 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20   matter */.     
9900: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
9910: 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r(.            p
9920: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c  Parse, pSort, p,
9930: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f   regResult, regO
9940: 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  rig, nResultCol,
9950: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
9960: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9970: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
9980: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
9990: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61  arse);.        a
99a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 74  ssert( sqlite3St
99b0: 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41  rlen30(pDest->zA
99c0: 66 66 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74  ffSdst)==nResult
99d0: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73  Col );.        s
99e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
99f0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
9a00: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
9a10: 65 73 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20  esultCol, .     
9a20: 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74         r1, pDest
9a30: 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73  ->zAffSdst, nRes
9a40: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
9a50: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
9a60: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
9a70: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
9a80: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
9a90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9aa0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
9ab0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
9ac0: 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75  arm, r1, regResu
9ad0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
9ae0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9af0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
9b00: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
9b10: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
9b20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
9b30: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
9b40: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
9b50: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
9b60: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
9b70: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
9b80: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
9b90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9ba0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
9bb0: 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20  er, 1, iParm);. 
9bc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
9bd0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
9be0: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
9bf0: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
9c00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
9c10: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
9c20: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
9c30: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
9c40: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
9c50: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
9c60: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
9c70: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
9c80: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20   memory cell or 
9c90: 61 72 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a  array of .    **
9ca0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e   memory cells an
9cb0: 64 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  d break out of t
9cc0: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
9cd0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
9ce0: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69  T_Mem: {.      i
9cf0: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
9d00: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
9d10: 75 6c 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e  ultCol<=pDest->n
9d20: 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Sdst );.        
9d30: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a  pushOntoSorter(.
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
9d50: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65  se, pSort, p, re
9d60: 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67  gResult, regOrig
9d70: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50  , nResultCol, nP
9d80: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
9d90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9da0: 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43  assert( nResultC
9db0: 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74  ol==pDest->nSdst
9dc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
9dd0: 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69  rt( regResult==i
9de0: 50 61 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  Parm );.        
9df0: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
9e00: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
9e10: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
9e20: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r us */.      }.
9e30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9e40: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
9e50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9e60: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
9e70: 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
9e80: 74 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53  tine:       /* S
9e90: 65 6e 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f  end data to a co
9ea0: 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  -routine */.    
9eb0: 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a  case SRT_Output:
9ec0: 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74   {        /* Ret
9ed0: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  urn the results 
9ee0: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
9ef0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
9f00: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
9f10: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
9f20: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
9f30: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
9f40: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
9f50: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
9f60: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
9f70: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
9f80: 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20  nResultCol,.    
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fa0: 20 20 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a     nPrefixReg);.
9fb0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
9fc0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
9fd0: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tine ){.        
9fe0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9ff0: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
a000: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
a010: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a020: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a030: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
a040: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
a050: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
a060: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
a070: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
a080: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
a090: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
a0a0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tCol);.      }. 
a0b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a0c0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
a0d0: 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f  E_OMIT_CTE.    /
a0e0: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73 75  * Write the resu
a0f0: 6c 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72  lts into a prior
a100: 69 74 79 20 71 75 65 75 65 20 74 68 61 74 20 69  ity queue that i
a110: 73 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e  s order accordin
a120: 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73  g to.    ** pDes
a130: 74 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20  t->pOrderBy (in 
a140: 70 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53  pSO).  pDest->iS
a150: 44 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29  DParm (in iParm)
a160: 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66   is the cursor f
a170: 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64  or an.    ** ind
a180: 65 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78  ex with pSO->nEx
a190: 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42  pr+2 columns.  B
a1a0: 75 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67  uild a key using
a1b0: 20 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72   pSO for the fir
a1c0: 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e  st.    ** pSO->n
a1d0: 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  Expr columns, th
a1e0: 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  en make sure all
a1f0: 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65   keys are unique
a200: 20 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20   by adding a.   
a210: 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71   ** final OP_Seq
a220: 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54  uence column.  T
a230: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
a240: 73 20 74 68 65 20 72 65 63 6f 72 64 20 61 73 20  s the record as 
a250: 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  a blob..    */. 
a260: 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74     case SRT_Dist
a270: 51 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20  Queue:.    case 
a280: 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20  SRT_Queue: {.   
a290: 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20     int nKey;.   
a2a0: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
a2b0: 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  3;.      int add
a2c0: 72 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  rTest = 0;.     
a2d0: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a   ExprList *pSO;.
a2e0: 20 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73        pSO = pDes
a2f0: 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  t->pOrderBy;.   
a300: 20 20 20 61 73 73 65 72 74 28 20 70 53 4f 20 29     assert( pSO )
a310: 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70  ;.      nKey = p
a320: 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  SO->nExpr;.     
a330: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
a340: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
a350: 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
a360: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
a370: 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b  pParse, nKey+2);
a380: 0a 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e  .      r3 = r2+n
a390: 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28  Key+1;.      if(
a3a0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
a3b0: 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Queue ){.       
a3c0: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
a3d0: 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75  nation is DistQu
a3e0: 65 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72  eue, then cursor
a3f0: 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70   (iParm+1) is op
a400: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  en.        ** on
a410: 20 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65   a second epheme
a420: 72 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68  ral index that h
a430: 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20  olds all values 
a440: 65 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79  every previously
a450: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65  .        ** adde
a460: 64 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20  d to the queue. 
a470: 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72 54  */.        addrT
a480: 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
a490: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
a4a0: 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c  _Found, iParm+1,
a4b0: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
a4e0: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
a4f0: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  ol);.        Vdb
a500: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
a510: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
a520: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a530: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
a540: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
a550: 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20  ltCol, r3);.    
a560: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
a570: 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20  _DistQueue ){.  
a580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a590: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
a5a0: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31  xInsert, iParm+1
a5b0: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73  , r3);.        s
a5c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
a5d0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
a5e0: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20  SEEKRESULT);.   
a5f0: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
a600: 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29  =0; i<nKey; i++)
a610: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a620: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a630: 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20  P_SCopy,.       
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 20 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70     regResult + p
a660: 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  SO->a[i].u.x.iOr
a670: 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20  derByCol - 1,.  
a680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a690: 20 20 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20          r2+i);. 
a6a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
a6b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a6c0: 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69  , OP_Sequence, i
a6d0: 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a  Parm, r2+nKey);.
a6e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a6f0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
a700: 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b  keRecord, r2, nK
a710: 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20  ey+2, r1);.     
a720: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a730: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
a740: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
a750: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  , r2, nKey+2);. 
a760: 20 20 20 20 20 69 66 28 20 61 64 64 72 54 65 73       if( addrTes
a770: 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  t ) sqlite3VdbeJ
a780: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
a790: 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
a7a0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
a7b0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
a7c0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
a7d0: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
a7e0: 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29  rse, r2, nKey+2)
a7f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a800: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
a810: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a  QLITE_OMIT_CTE *
a820: 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  /....#if !define
a830: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
a840: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
a850: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
a860: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
a870: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
a880: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
a890: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
a8a0: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
a8b0: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
a8c0: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
a8d0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
a8e0: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
a8f0: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
a900: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
a910: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
a920: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
a930: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
a940: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
a950: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
a960: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
a970: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
a980: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a990: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
a9a0: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
a9b0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
a9c0: 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
a9d0: 69 73 20 72 65 61 63 68 65 64 2e 20 20 45 78 63  is reached.  Exc
a9e0: 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65  ept, if.  ** the
a9f0: 72 65 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20  re is a sorter, 
aa00: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
aa10: 65 20 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72  e sorter has alr
aa20: 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a  eady limited.  *
aa30: 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72  * the output for
aa40: 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   us..  */.  if( 
aa50: 70 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69  pSort==0 && p->i
aa60: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
aa70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
aa80: 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
aa90: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
aaa0: 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
aab0: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  age(v);.  }.}../
aac0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
aad0: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73  KeyInfo object s
aae0: 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e  ufficient for an
aaf0: 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20   index of N key 
ab00: 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58  columns and.** X
ab10: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a   extra columns..
ab20: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
ab30: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
ab40: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
ab50: 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e   N, int X){.  in
ab60: 74 20 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29  t nExtra = (N+X)
ab70: 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
ab80: 2a 29 2b 31 29 20 2d 20 73 69 7a 65 6f 66 28 43  *)+1) - sizeof(C
ab90: 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49  ollSeq*);.  KeyI
aba0: 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  nfo *p = sqlite3
abb0: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
abc0: 2c 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f  , sizeof(KeyInfo
abd0: 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  ) + nExtra);.  i
abe0: 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  f( p ){.    p->a
abf0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
ac00: 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b  )&p->aColl[N+X];
ac10: 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c  .    p->nKeyFiel
ac20: 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20  d = (u16)N;.    
ac30: 70 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28  p->nAllField = (
ac40: 75 31 36 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70  u16)(N+X);.    p
ac50: 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
ac60: 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  .    p->db = db;
ac70: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31  .    p->nRef = 1
ac80: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 5b  ;.    memset(&p[
ac90: 31 5d 2c 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a  1], 0, nExtra);.
aca0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
acb0: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
acc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
acd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
ace0: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
acf0: 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73  object.*/.void s
ad00: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
ad10: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
ad20: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
ad30: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
ad40: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d   );.    p->nRef-
ad50: 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  -;.    if( p->nR
ad60: 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44  ef==0 ) sqlite3D
ad70: 62 46 72 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70  bFreeNN(p->db, p
ad80: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
ad90: 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74  Make a new point
ada0: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
adb0: 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66  object.*/.KeyInf
adc0: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
add0: 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29  oRef(KeyInfo *p)
ade0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
adf0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
ae00: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
ae10: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  f++;.  }.  retur
ae20: 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n p;.}..#ifdef S
ae30: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
ae40: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
ae50: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
ae60: 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e  t can be change.
ae70: 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62    The KeyInfo ob
ae80: 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79  ject.** can only
ae90: 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20 74   be changed if t
aea0: 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73 69  his is just a si
aeb0: 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74  ngle reference t
aec0: 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  o the object..**
aed0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
aee0: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e   is used only in
aef0: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
af00: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
af10: 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  int sqlite3KeyIn
af20: 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65  foIsWriteable(Ke
af30: 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72  yInfo *p){ retur
af40: 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a  n p->nRef==1; }.
af50: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
af60: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
af70: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
af80: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
af90: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
afa0: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
afb0: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
afc0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
afd0: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
afe0: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
aff0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
b000: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
b010: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
b020: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
b030: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
b040: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
b050: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
b060: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
b070: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
b080: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
b090: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
b0a0: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
b0b0: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
b0c0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
b0d0: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
b0e0: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
b0f0: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
b100: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
b110: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
b120: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
b130: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
b140: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
b150: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
b160: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
b170: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
b180: 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63  m malloc.  The c
b190: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
b1a0: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
b1b0: 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61  e for seeing tha
b1c0: 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
b1d0: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
b1e0: 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  * freed..*/.stat
b1f0: 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49  ic KeyInfo *keyI
b200: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
b210: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b220: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
b230: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
b240: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
b250: 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65       /* Form the
b260: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
b270: 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69  from this ExprLi
b280: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  st */.  int iSta
b290: 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rt,          /* 
b2a0: 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73 20  Begin with this 
b2b0: 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20  column of pList 
b2c0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
b2d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
b2e0: 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61   this many extra
b2f0: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
b300: 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  end */.){.  int 
b310: 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f  nExpr;.  KeyInfo
b320: 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   *pInfo;.  struc
b330: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
b340: 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
b350: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
b360: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  db;.  int i;..  
b370: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
b380: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
b390: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
b3a0: 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53  loc(db, nExpr-iS
b3b0: 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b  tart, nExtra+1);
b3c0: 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a  .  if( pInfo ){.
b3d0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
b3e0: 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
b3f0: 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a  eable(pInfo) );.
b400: 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74      for(i=iStart
b410: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
b420: 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72  +iStart; i<nExpr
b430: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
b440: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  .      pInfo->aC
b450: 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  oll[i-iStart] = 
b460: 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c  sqlite3ExprNNCol
b470: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
b480: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
b490: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
b4a0: 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  der[i-iStart] = 
b4b0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
b4c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
b4d0: 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f  turn pInfo;.}../
b4e0: 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  *.** Name of the
b4f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72   connection oper
b500: 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65  ator, used for e
b510: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a  rror messages..*
b520: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
b530: 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d  har *selectOpNam
b540: 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61  e(int id){.  cha
b550: 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20  r *z;.  switch( 
b560: 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  id ){.    case T
b570: 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d  K_ALL:       z =
b580: 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20   "UNION ALL";   
b590: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
b5a0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20  TK_INTERSECT: z 
b5b0: 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20  = "INTERSECT";  
b5c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
b5d0: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a   TK_EXCEPT:    z
b5e0: 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20   = "EXCEPT";    
b5f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
b600: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
b610: 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20  z = "UNION";    
b620: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
b630: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66  return z;.}..#if
b640: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b650: 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55  _EXPLAIN./*.** U
b660: 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49  nless an "EXPLAI
b670: 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f  N QUERY PLAN" co
b680: 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70  mmand is being p
b690: 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66  rocessed, this f
b6a0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20  unction.** is a 
b6b0: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
b6c0: 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67  , it adds a sing
b6d0: 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  le row of output
b6e0: 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75   to the EQP resu
b6f0: 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65  lt,.** where the
b700: 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74   caption is of t
b710: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
b720: 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   "USE TEMP B-TRE
b730: 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a  E FOR xxx".**.**
b740: 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e   where xxx is on
b750: 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c  e of "DISTINCT",
b760: 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22   "ORDER BY" or "
b770: 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74  GROUP BY". Exact
b780: 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ly which.** is d
b790: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
b7a0: 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74   zUsage argument
b7b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b7c0: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
b7d0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
b7e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73   const char *zUs
b7f0: 61 67 65 29 7b 0a 20 20 45 78 70 6c 61 69 6e 51  age){.  ExplainQ
b800: 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
b810: 2c 20 30 2c 20 22 55 53 45 20 54 45 4d 50 20 42  , 0, "USE TEMP B
b820: 2d 54 52 45 45 20 46 4f 52 20 25 73 22 2c 20 7a  -TREE FOR %s", z
b830: 55 73 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Usage));.}../*.*
b840: 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65 73 73  * Assign express
b850: 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20  ion b to lvalue 
b860: 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d  a. A second, no-
b870: 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  op, version of t
b880: 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20  his macro.** is 
b890: 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51  provided when SQ
b8a0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
b8b0: 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68  N is defined. Th
b8c0: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f  is allows the co
b8d0: 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33  de.** in sqlite3
b8e0: 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69  Select() to assi
b8f0: 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72  gn values to str
b900: 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61  ucture member va
b910: 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20  riables that.** 
b920: 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20 53 51  only exist if SQ
b930: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
b940: 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  N is not defined
b950: 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69   without polluti
b960: 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  ng the.** code w
b970: 69 74 68 20 23 69 66 6e 64 65 66 20 64 69 72 65  ith #ifndef dire
b980: 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66  ctives..*/.# def
b990: 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  ine explainSetIn
b9a0: 74 65 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20  teger(a, b) a = 
b9b0: 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f  b..#else./* No-o
b9c0: 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  p versions of th
b9d0: 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66  e explainXXX() f
b9e0: 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63  unctions and mac
b9f0: 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65  ros. */.# define
ba00: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
ba10: 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20  e(y,z).# define 
ba20: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
ba30: 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 0a  r(y,z).#endif...
ba40: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
ba50: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
ba60: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
ba70: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
ba80: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
ba90: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
baa0: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
bab0: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
bac0: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
bad0: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
bae0: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
baf0: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
bb00: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
bb10: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
bb20: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
bb30: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
bb40: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
bb50: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
bb60: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72  eSortTail(.  Par
bb70: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
bb80: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
bb90: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
bba0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
bbb0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
bbc0: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
bbd0: 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72  Sort,   /* Infor
bbe0: 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52  mation on the OR
bbf0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
bc00: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
bc10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
bc20: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
bc30: 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
bc40: 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74  t *pDest /* Writ
bc50: 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73  e the sorted res
bc60: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
bc70: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
bc80: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bca0: 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
bcb0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
bcc0: 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20 70 53  t addrBreak = pS
bcd0: 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20  ort->labelDone; 
bce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
bcf0: 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69 74 20  mp here to exit 
bd00: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
bd10: 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c  drContinue = sql
bd20: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
bd30: 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68  l(v);  /* Jump h
bd40: 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63  ere for next cyc
bd50: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
bd60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bd70: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
bd80: 66 20 6f 75 74 70 75 74 20 6c 6f 6f 70 2e 20 4a  f output loop. J
bd90: 75 6d 70 20 66 6f 72 20 4e 65 78 74 2e 20 2a 2f  ump for Next. */
bda0: 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20  .  int addrOnce 
bdb0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
bdc0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
bdd0: 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70  derBy = pSort->p
bde0: 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65  OrderBy;.  int e
bdf0: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
be00: 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d  est;.  int iParm
be10: 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72   = pDest->iSDPar
be20: 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b  m;.  int regRow;
be30: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b  .  int regRowid;
be40: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69  .  int iCol;.  i
be50: 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20  nt nKey;        
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
be70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20  * Number of key 
be80: 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 6f 72 74 65  columns in sorte
be90: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
bea0: 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20  t iSortTab;     
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bec0: 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74   Sorter cursor t
bed0: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
bee0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 53   int i;.  int bS
bef0: 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eq;             
bf00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
bf10: 65 20 69 66 20 73 6f 72 74 65 72 20 72 65 63 6f  e if sorter reco
bf20: 72 64 20 69 6e 63 6c 75 64 65 73 20 73 65 71 2e  rd includes seq.
bf30: 20 6e 6f 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52   no. */.  int nR
bf40: 65 66 4b 65 79 20 3d 20 30 3b 0a 20 20 73 74 72  efKey = 0;.  str
bf50: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
bf60: 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70  m *aOutEx = p->p
bf70: 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20 20 61 73 73  EList->a;..  ass
bf80: 65 72 74 28 20 61 64 64 72 42 72 65 61 6b 3c 30  ert( addrBreak<0
bf90: 20 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d   );.  if( pSort-
bfa0: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20  >labelBkOut ){. 
bfb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bfc0: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
bfd0: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
bfe0: 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  rn, pSort->label
bff0: 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  BkOut);.    sqli
c000: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
c010: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73  ddrBreak);.    s
c020: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
c030: 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d  eLabel(v, pSort-
c040: 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20  >labelBkOut);.  
c050: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
c060: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
c070: 45 46 45 52 45 4e 43 45 53 0a 20 20 2f 2a 20 4f  EFERENCES.  /* O
c080: 70 65 6e 20 61 6e 79 20 63 75 72 73 6f 72 73 20  pen any cursors 
c090: 6e 65 65 64 65 64 20 66 6f 72 20 73 6f 72 74 65  needed for sorte
c0a0: 72 2d 72 65 66 65 72 65 6e 63 65 20 65 78 70 72  r-reference expr
c0b0: 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72  essions */.  for
c0c0: 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e  (i=0; i<pSort->n
c0d0: 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  Defer; i++){.   
c0e0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
c0f0: 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e  Sort->aDefer[i].
c100: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 44  pTab;.    int iD
c110: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
c120: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
c130: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
c140: 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ma);.    sqlite3
c150: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
c160: 2c 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b  , pSort->aDefer[
c170: 69 5d 2e 69 43 73 72 2c 20 69 44 62 2c 20 70 54  i].iCsr, iDb, pT
c180: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
c190: 3b 0a 20 20 20 20 6e 52 65 66 4b 65 79 20 3d 20  ;.    nRefKey = 
c1a0: 4d 41 58 28 6e 52 65 66 4b 65 79 2c 20 70 53 6f  MAX(nRefKey, pSo
c1b0: 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e 4b  rt->aDefer[i].nK
c1c0: 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ey);.  }.#endif.
c1d0: 0a 20 20 69 54 61 62 20 3d 20 70 53 6f 72 74 2d  .  iTab = pSort-
c1e0: 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  >iECursor;.  if(
c1f0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
c200: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
c210: 5f 43 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44  _Coroutine || eD
c220: 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a  est==SRT_Mem ){.
c230: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30      regRowid = 0
c240: 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 70  ;.    regRow = p
c250: 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 7d  Dest->iSdst;.  }
c260: 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77  else{.    regRow
c270: 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  id = sqlite3GetT
c280: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
c290: 20 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c      regRow = sql
c2a0: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
c2b0: 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e  (pParse, nColumn
c2c0: 29 3b 0a 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20  );.  }.  nKey = 
c2d0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
c2e0: 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  - pSort->nOBSat;
c2f0: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f  .  if( pSort->so
c300: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
c310: 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  AG_UseSorter ){.
c320: 20 20 20 20 69 6e 74 20 72 65 67 53 6f 72 74 4f      int regSortO
c330: 75 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ut = ++pParse->n
c340: 4d 65 6d 3b 0a 20 20 20 20 69 53 6f 72 74 54 61  Mem;.    iSortTa
c350: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
c360: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72  ++;.    if( pSor
c370: 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b  t->labelBkOut ){
c380: 0a 20 20 20 20 20 20 61 64 64 72 4f 6e 63 65 20  .      addrOnce 
c390: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c3a0: 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
c3b0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
c3c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
c3d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
c3e0: 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
c3f0: 69 53 6f 72 74 54 61 62 2c 20 72 65 67 53 6f 72  iSortTab, regSor
c400: 74 4f 75 74 2c 20 0a 20 20 20 20 20 20 20 20 6e  tOut, .        n
c410: 4b 65 79 2b 31 2b 6e 43 6f 6c 75 6d 6e 2b 6e 52  Key+1+nColumn+nR
c420: 65 66 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20  efKey);.    if( 
c430: 61 64 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74  addrOnce ) sqlit
c440: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
c450: 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20  , addrOnce);.   
c460: 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69   addr = 1 + sqli
c470: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c480: 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
c490: 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29  iTab, addrBreak)
c4a0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
c4b0: 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f  ge(v);.    codeO
c4c0: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
c4d0: 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  set, addrContinu
c4e0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
c4f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
c500: 53 6f 72 74 65 72 44 61 74 61 2c 20 69 54 61 62  SorterData, iTab
c510: 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 69 53  , regSortOut, iS
c520: 6f 72 74 54 61 62 29 3b 0a 20 20 20 20 62 53 65  ortTab);.    bSe
c530: 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  q = 0;.  }else{.
c540: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
c550: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c560: 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61  (v, OP_Sort, iTa
c570: 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56  b, addrBreak); V
c580: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
c590: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
c5a0: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64  , p->iOffset, ad
c5b0: 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20  drContinue);.   
c5c0: 20 69 53 6f 72 74 54 61 62 20 3d 20 69 54 61 62   iSortTab = iTab
c5d0: 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 31 3b 0a  ;.    bSeq = 1;.
c5e0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 69    }.  for(i=0, i
c5f0: 43 6f 6c 3d 6e 4b 65 79 2b 62 53 65 71 2d 31 3b  Col=nKey+bSeq-1;
c600: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
c610: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
c620: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
c630: 46 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28  FERENCES.    if(
c640: 20 61 4f 75 74 45 78 5b 69 5d 2e 62 53 6f 72 74   aOutEx[i].bSort
c650: 65 72 52 65 66 20 29 20 63 6f 6e 74 69 6e 75 65  erRef ) continue
c660: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
c670: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
c680: 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20  OrderByCol==0 ) 
c690: 69 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 23 69 66 64  iCol++;.  }.#ifd
c6a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c6b0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
c6c0: 45 53 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  ES.  if( pSort->
c6d0: 6e 44 65 66 65 72 20 29 7b 0a 20 20 20 20 69 6e  nDefer ){.    in
c6e0: 74 20 69 4b 65 79 20 3d 20 69 43 6f 6c 2b 31 3b  t iKey = iCol+1;
c6f0: 0a 20 20 20 20 69 6e 74 20 72 65 67 4b 65 79 20  .    int regKey 
c700: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
c710: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 52  Range(pParse, nR
c720: 65 66 4b 65 79 29 3b 0a 0a 20 20 20 20 66 6f 72  efKey);..    for
c730: 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e  (i=0; i<pSort->n
c740: 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  Defer; i++){.   
c750: 20 20 20 69 6e 74 20 69 43 73 72 20 3d 20 70 53     int iCsr = pS
c760: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 69  ort->aDefer[i].i
c770: 43 73 72 3b 0a 20 20 20 20 20 20 54 61 62 6c 65  Csr;.      Table
c780: 20 2a 70 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e   *pTab = pSort->
c790: 61 44 65 66 65 72 5b 69 5d 2e 70 54 61 62 3b 0a  aDefer[i].pTab;.
c7a0: 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d        int nKey =
c7b0: 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69   pSort->aDefer[i
c7c0: 5d 2e 6e 4b 65 79 3b 0a 0a 20 20 20 20 20 20 73  ].nKey;..      s
c7d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c7e0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
c7f0: 69 43 73 72 29 3b 0a 20 20 20 20 20 20 69 66 28  iCsr);.      if(
c800: 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
c810: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
c820: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
c830: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74  OP_Column, iSort
c840: 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20 72 65 67  Tab, iKey++, reg
c850: 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Key);.        sq
c860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
c870: 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
c880: 20 69 43 73 72 2c 20 0a 20 20 20 20 20 20 20 20   iCsr, .        
c890: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
c8a0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 2c  urrentAddr(v)+1,
c8b0: 20 72 65 67 4b 65 79 29 3b 0a 20 20 20 20 20 20   regKey);.      
c8c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
c8d0: 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e  nt k;.        in
c8e0: 74 20 69 4a 6d 70 3b 0a 20 20 20 20 20 20 20 20  t iJmp;.        
c8f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c900: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
c910: 54 61 62 29 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e  Tab)->nKeyCol==n
c920: 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 66  Key );.        f
c930: 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20  or(k=0; k<nKey; 
c940: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
c950: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c960: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
c970: 69 53 6f 72 74 54 61 62 2c 20 69 4b 65 79 2b 2b  iSortTab, iKey++
c980: 2c 20 72 65 67 4b 65 79 2b 6b 29 3b 0a 20 20 20  , regKey+k);.   
c990: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
c9a0: 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Jmp = sqlite3Vdb
c9b0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
c9c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c9d0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
c9e0: 20 4f 50 5f 53 65 65 6b 47 45 2c 20 69 43 73 72   OP_SeekGE, iCsr
c9f0: 2c 20 69 4a 6d 70 2b 32 2c 20 72 65 67 4b 65 79  , iJmp+2, regKey
ca00: 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  , nKey);.       
ca10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ca20: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 4c  p4Int(v, OP_IdxL
ca30: 45 2c 20 69 43 73 72 2c 20 69 4a 6d 70 2b 33 2c  E, iCsr, iJmp+3,
ca40: 20 72 65 67 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a   regKey, nKey);.
ca50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ca60: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
ca70: 4e 75 6c 6c 52 6f 77 2c 20 69 43 73 72 29 3b 0a  NullRow, iCsr);.
ca80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ca90: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
caa0: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
cab0: 2c 20 72 65 67 4b 65 79 2c 20 6e 52 65 66 4b 65  , regKey, nRefKe
cac0: 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  y);.  }.#endif. 
cad0: 20 66 6f 72 28 69 3d 6e 43 6f 6c 75 6d 6e 2d 31   for(i=nColumn-1
cae0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 23 69  ; i>=0; i--){.#i
caf0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
cb00: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
cb10: 4e 43 45 53 0a 20 20 20 20 69 66 28 20 61 4f 75  NCES.    if( aOu
cb20: 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65  tEx[i].bSorterRe
cb30: 66 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  f ){.      sqlit
cb40: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
cb50: 65 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 70 45 78  e, aOutEx[i].pEx
cb60: 70 72 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20  pr, regRow+i);. 
cb70: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
cb80: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
cb90: 69 52 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28  iRead;.      if(
cba0: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
cbb0: 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b 0a 20 20  OrderByCol ){.  
cbc0: 20 20 20 20 20 20 69 52 65 61 64 20 3d 20 61 4f        iRead = aO
cbd0: 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  utEx[i].u.x.iOrd
cbe0: 65 72 42 79 43 6f 6c 2d 31 3b 0a 20 20 20 20 20  erByCol-1;.     
cbf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
cc00: 69 52 65 61 64 20 3d 20 69 43 6f 6c 2d 2d 3b 0a  iRead = iCol--;.
cc10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
cc20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
cc30: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
cc40: 6f 72 74 54 61 62 2c 20 69 52 65 61 64 2c 20 72  ortTab, iRead, r
cc50: 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 20 20  egRow+i);.      
cc60: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
cc70: 22 25 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e  "%s", aOutEx[i].
cc80: 7a 4e 61 6d 65 3f 61 4f 75 74 45 78 5b 69 5d 2e  zName?aOutEx[i].
cc90: 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69  zName : aOutEx[i
cca0: 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 20 20 7d  ].zSpan));.    }
ccb0: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65  .  }.  switch( e
ccc0: 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65  Dest ){.    case
ccd0: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
cce0: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
ccf0: 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b: {.      sqlit
cd00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
cd10: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
cd20: 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  rm, regRowid);. 
cd30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cd40: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
cd50: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
cd60: 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  ow, regRowid);. 
cd70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cd80: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
cd90: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
cda0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
cdb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cdc0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
cdd0: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
cde0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
cdf0: 6f 6c 75 6d 6e 3d 3d 73 71 6c 69 74 65 33 53 74  olumn==sqlite3St
ce00: 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41  rlen30(pDest->zA
ce10: 66 66 53 64 73 74 29 20 29 3b 0a 20 20 20 20 20  ffSdst) );.     
ce20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ce30: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
ce40: 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f  ord, regRow, nCo
ce50: 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 2c 0a  lumn, regRowid,.
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce70: 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a          pDest->z
ce80: 41 66 66 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e  AffSdst, nColumn
ce90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
cea0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
ceb0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
cec0: 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29  regRow, nColumn)
ced0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
cee0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
cef0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
cf00: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 2c 20 72  arm, regRowid, r
cf10: 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  egRow, nColumn);
cf20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
cf30: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
cf40: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  _Mem: {.      /*
cf50: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
cf60: 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
cf70: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
cf80: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
cf90: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
cfa0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
cfb0: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
cfc0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
cfd0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
cfe0: 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74  tine ); .      t
cff0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
d000: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
d010: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
d020: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
d030: 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ne );.      if( 
d040: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
d050: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
d060: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d070: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
d080: 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43  pDest->iSdst, nC
d090: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
d0a0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
d0b0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
d0c0: 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53  Parse, pDest->iS
d0d0: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
d0e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d0f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d100: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
d110: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
d120: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
d130: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d140: 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77 69   }.  if( regRowi
d150: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 65 44 65  d ){.    if( eDe
d160: 73 74 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a 20  st==SRT_Set ){. 
d170: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
d180: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
d190: 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f  rse, regRow, nCo
d1a0: 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lumn);.    }else
d1b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
d1c0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
d1d0: 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20  arse, regRow);. 
d1e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
d1f0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
d200: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29  Parse, regRowid)
d210: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62  ;.  }.  /* The b
d220: 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
d230: 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
d240: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
d250: 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  (v, addrContinue
d260: 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  );.  if( pSort->
d270: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
d280: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29  FLAG_UseSorter )
d290: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
d2a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
d2b0: 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20  rterNext, iTab, 
d2c0: 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72  addr); VdbeCover
d2d0: 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b  age(v);.  }else{
d2e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d2f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
d300: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20  t, iTab, addr); 
d310: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
d320: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74  .  }.  if( pSort
d330: 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73 71  ->regReturn ) sq
d340: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
d350: 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53  v, OP_Return, pS
d360: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  ort->regReturn);
d370: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
d380: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
d390: 64 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a  drBreak);.}../*.
d3a0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
d3b0: 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20  ter to a string 
d3c0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27  containing the '
d3d0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
d3e0: 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  ' of the.** expr
d3f0: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68  ession pExpr. Th
d400: 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20  e string may be 
d410: 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69  treated as stati
d420: 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  c by the caller.
d430: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20  .**.** Also try 
d440: 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
d450: 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75  size of the retu
d460: 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72  rned value and r
d470: 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65  eturn that.** re
d480: 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64  sult in *pEstWid
d490: 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  th..**.** The de
d4a0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69  claration type i
d4b0: 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61  s the exact data
d4c0: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
d4d0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
d4e0: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43  he.** original C
d4f0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
d500: 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70  ement if the exp
d510: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
d520: 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c  umn. The.** decl
d530: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
d540: 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69   a ROWID field i
d550: 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74  s INTEGER. Exact
d560: 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65  ly when an expre
d570: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73  ssion.** is cons
d580: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
d590: 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69  can be complex i
d5a0: 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  n the presence o
d5b0: 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68  f subqueries. Th
d5c0: 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20  e.** result-set 
d5d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c  expression in al
d5e0: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
d5f0: 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ng SELECT statem
d600: 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73  ents is .** cons
d610: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
d620: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
d630: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  ..**.**   SELECT
d640: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
d650: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
d660: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
d670: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
d680: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
d690: 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  l);.**   SELECT 
d6a0: 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  abc FROM (SELECT
d6b0: 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d   col AS abc FROM
d6c0: 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68   tbl);.** .** Th
d6d0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
d6e0: 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65  pe for any expre
d6f0: 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ssion other than
d700: 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c   a column is NUL
d710: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  L..**.** This ro
d720: 75 74 69 6e 65 20 68 61 73 20 65 69 74 68 65 72  utine has either
d730: 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65   3 or 6 paramete
d740: 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  rs depending on 
d750: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
d760: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  * the SQLITE_ENA
d770: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
d780: 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ATA compile-time
d790: 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e   option is used.
d7a0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
d7b0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
d7c0: 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e  METADATA.# defin
d7d0: 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42  e columnType(A,B
d7e0: 2c 43 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79  ,C,D,E) columnTy
d7f0: 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45  peImpl(A,B,C,D,E
d800: 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21 64  ).#else /* if !d
d810: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
d820: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
d830: 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e  DATA) */.# defin
d840: 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42  e columnType(A,B
d850: 2c 43 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79  ,C,D,E) columnTy
d860: 70 65 49 6d 70 6c 28 41 2c 42 29 0a 23 65 6e 64  peImpl(A,B).#end
d870: 69 66 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  if.static const 
d880: 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65  char *columnType
d890: 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74  Impl(.  NameCont
d8a0: 65 78 74 20 2a 70 4e 43 2c 20 0a 23 69 66 6e 64  ext *pNC, .#ifnd
d8b0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d8c0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
d8d0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 0a 23  .  Expr *pExpr.#
d8e0: 65 6c 73 65 0a 20 20 45 78 70 72 20 2a 70 45 78  else.  Expr *pEx
d8f0: 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pr,.  const char
d900: 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63   **pzOrigDb,.  c
d910: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
d920: 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63  igTab,.  const c
d930: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 0a  har **pzOrigCol.
d940: 23 65 6e 64 69 66 0a 29 7b 0a 20 20 63 68 61 72  #endif.){.  char
d950: 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20   const *zType = 
d960: 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 23 69 66 64  0;.  int j;.#ifd
d970: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d980: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
d990: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
d9a0: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 63 68  OrigDb = 0;.  ch
d9b0: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54  ar const *zOrigT
d9c0: 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  ab = 0;.  char c
d9d0: 6f 6e 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d  onst *zOrigCol =
d9e0: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   0;.#endif..  as
d9f0: 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29  sert( pExpr!=0 )
da00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d  ;.  assert( pNC-
da10: 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a  >pSrcList!=0 );.
da20: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
da30: 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op!=TK_AGG_COLU
da40: 4d 4e 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 72  MN );  /* This r
da50: 6f 75 74 69 6e 65 20 72 75 6e 65 73 20 62 65 66  outine runes bef
da60: 6f 72 65 20 61 67 67 72 65 67 61 74 65 73 0a 20  ore aggregates. 
da70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da90: 20 20 20 20 20 20 2a 2a 20 61 72 65 20 70 72 6f        ** are pro
daa0: 63 65 73 73 65 64 20 2a 2f 0a 20 20 73 77 69 74  cessed */.  swit
dab0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
dac0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
dad0: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
dae0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
daf0: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61  s a column. Loca
db00: 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65  te the table the
db10: 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67   column is being
db20: 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63  .      ** extrac
db30: 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65  ted from in Name
db40: 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74  Context.pSrcList
db50: 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79  . This table may
db60: 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a   be real.      *
db70: 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  * database table
db80: 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
db90: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
dba0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
dbb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
dbc0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  ble structure co
dbd0: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
dbe0: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
dbf0: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20  Select *pS = 0; 
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
dc10: 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e  elect the column
dc20: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
dc30: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  om */.      int 
dc40: 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
dc50: 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78  olumn;  /* Index
dc60: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54   of column in pT
dc70: 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  ab */.      whil
dc80: 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20  e( pNC && !pTab 
dc90: 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69  ){.        SrcLi
dca0: 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
dcb0: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
dcc0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c        for(j=0;j<
dcd0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26  pTabList->nSrc &
dce0: 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  & pTabList->a[j]
dcf0: 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d  .iCursor!=pExpr-
dd00: 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20  >iTable;j++);.  
dd10: 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62        if( j<pTab
dd20: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20  List->nSrc ){.  
dd30: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
dd40: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
dd50: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ab;.          pS
dd60: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
dd70: 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ].pSelect;.     
dd80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dd90: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
dda0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
ddb0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
ddc0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
ddd0: 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20        /* At one 
dde0: 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68 20  time, code such 
ddf0: 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78  as "SELECT new.x
de00: 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67  " within a trigg
de10: 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20  er would.       
de20: 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20 63   ** cause this c
de30: 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e  ondition to run.
de40: 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77 65    Since then, we
de50: 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75 72   have restructur
de60: 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20 2a  ed how.        *
de70: 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20 69  * trigger code i
de80: 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64 20  s generated and 
de90: 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f  so this conditio
dea0: 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a  n is no longer .
deb0: 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69          ** possi
dec0: 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 74  ble. However, it
ded0: 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74 72   can still be tr
dee0: 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74  ue for statement
def0: 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20 2a  s like.        *
df00: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  * the following:
df10: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
df20: 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
df30: 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54  TABLE t1(col INT
df40: 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20 2a  EGER);.        *
df50: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
df60: 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20  CT t1.col) FROM 
df70: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20  FROM t1;.       
df80: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   **.        ** w
df90: 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29  hen columnType()
dfa0: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
dfb0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74 31  e expression "t1
dfc0: 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20 20  .col" in the .  
dfd0: 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c        ** sub-sel
dfe0: 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ect. In this cas
dff0: 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75 6d  e, set the colum
e000: 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20  n type to NULL, 
e010: 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  even.        ** 
e020: 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64  though it should
e030: 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54 45   really be "INTE
e040: 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a  GER"..        **
e050: 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
e060: 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65   is not a proble
e070: 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e  m, as the column
e080: 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c   type of "t1.col
e090: 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20 20  " is never.     
e0a0: 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e     ** used. When
e0b0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
e0c0: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
e0d0: 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20 20  xpression .     
e0e0: 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20 74     ** "(SELECT t
e0f0: 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72  1.col)", the cor
e100: 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65 74  rect type is ret
e110: 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20 54  urned (see the T
e120: 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20  K_SELECT.       
e130: 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f 77   ** branch below
e140: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  .  */.        br
e150: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
e160: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
e170: 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62 3d   && pExpr->pTab=
e180: 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69  =pTab );.      i
e190: 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20  f( pS ){.       
e1a0: 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20   /* The "table" 
e1b0: 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75  is actually a su
e1c0: 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69  b-select or a vi
e1d0: 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ew in the FROM c
e1e0: 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  lause.        **
e1f0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
e200: 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e  tatement. Return
e210: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
e220: 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e   type and origin
e230: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
e240: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d   for the result-
e250: 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  set column of th
e260: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20  e sub-select..  
e270: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
e280: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
e290: 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d  iCol<pS->pEList-
e2a0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
e2b0: 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69      /* If iCol i
e2c0: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
e2d0: 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
e2e0: 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74  ssion requests t
e2f0: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
e300: 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62  rowid of the sub
e310: 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
e320: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
e330: 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a   is legal (see .
e340: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73            ** tes
e350: 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32  t case misc2.2.2
e360: 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76  ) - it always ev
e370: 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e  aluates to NULL.
e380: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
e390: 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74          NameCont
e3a0: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20  ext sNC;.       
e3b0: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
e3c0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
e3d0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
e3e0: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
e3f0: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
e400: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
e410: 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20   pNC;.          
e420: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
e430: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
e440: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
e450: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26  mnType(&sNC, p,&
e460: 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61  zOrigDb,&zOrigTa
e470: 62 2c 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20  b,&zOrigCol); . 
e480: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e490: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
e4a0: 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72   A real table or
e4b0: 20 61 20 43 54 45 20 74 61 62 6c 65 20 2a 2f 0a   a CTE table */.
e4c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e4d0: 21 70 53 20 29 3b 0a 23 69 66 64 65 66 20 53 51  !pS );.#ifdef SQ
e4e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
e4f0: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
e500: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
e510: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
e520: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Key;.        ass
e530: 65 72 74 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f  ert( iCol==XN_RO
e540: 57 49 44 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  WID || (iCol>=0 
e550: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
e560: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ol) );.        i
e570: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
e580: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
e590: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20  INTEGER";.      
e5a0: 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22      zOrigCol = "
e5b0: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20  rowid";.        
e5c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
e5d0: 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62   zOrigCol = pTab
e5e0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
e5f0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  me;.          zT
e600: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c  ype = sqlite3Col
e610: 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d 3e 61  umnType(&pTab->a
e620: 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20  Col[iCol],0);.  
e630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e640: 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d  zOrigTab = pTab-
e650: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
e660: 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20  if( pNC->pParse 
e670: 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  && pTab->pSchema
e680: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
e690: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
e6a0: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43  chemaToIndex(pNC
e6b0: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  ->pParse->db, pT
e6c0: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
e6d0: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20          zOrigDb 
e6e0: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pNC->pParse->d
e6f0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
e700: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Name;.        }.
e710: 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 61 73  #else.        as
e720: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52  sert( iCol==XN_R
e730: 4f 57 49 44 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  OWID || (iCol>=0
e740: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
e750: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20  Col) );.        
e760: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
e770: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
e780: 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20  "INTEGER";.     
e790: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e7a0: 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69      zType = sqli
e7b0: 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70  te3ColumnType(&p
e7c0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c  Tab->aCol[iCol],
e7d0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  0);.        }.#e
e7e0: 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
e7f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e800: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e810: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
e820: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
e830: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
e840: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
e850: 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75  sub-select. Retu
e860: 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rn the declarati
e870: 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20  on type and.    
e880: 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f    ** origin info
e890: 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20   for the single 
e8a0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
e8b0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
e8c0: 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20  SELECT.      ** 
e8d0: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
e8e0: 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f   */.      NameCo
e8f0: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20  ntext sNC;.     
e900: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45   Select *pS = pE
e910: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
e920: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
e930: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  pS->pEList->a[0]
e940: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  .pExpr;.      as
e950: 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f  sert( ExprHasPro
e960: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
e970: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
e980: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
e990: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
e9a0: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
e9b0: 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50  NC;.      sNC.pP
e9c0: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
e9d0: 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20  se;.      zType 
e9e0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
e9f0: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
ea00: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
ea10: 67 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72  gCol); .      br
ea20: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
ea30: 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  f.  }..#ifdef SQ
ea40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
ea50: 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20 0a 20 20  MN_METADATA  .  
ea60: 69 66 28 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a  if( pzOrigDb ){.
ea70: 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72      assert( pzOr
ea80: 69 67 54 61 62 20 26 26 20 70 7a 4f 72 69 67 43  igTab && pzOrigC
ea90: 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  ol );.    *pzOri
eaa0: 67 44 62 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20  gDb = zOrigDb;. 
eab0: 20 20 20 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20     *pzOrigTab = 
eac0: 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20 20 2a 70  zOrigTab;.    *p
ead0: 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67  zOrigCol = zOrig
eae0: 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  Col;.  }.#endif.
eaf0: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
eb00: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
eb10: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
eb20: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
eb30: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
eb40: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
eb50: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
eb60: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
eb70: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
eb80: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
eb90: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
eba0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
ebb0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
ebc0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
ebd0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
ebe0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
ebf0: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
ec00: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
ec10: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
ec20: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
ec30: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a  E_OMIT_DECLTYPE.
ec40: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
ec50: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
ec60: 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
ec70: 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72  t sNC;.  sNC.pSr
ec80: 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
ec90: 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
eca0: 20 70 50 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70   pParse;.  sNC.p
ecb0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Next = 0;.  for(
ecc0: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
ecd0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
ece0: 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74  Expr *p = pEList
ecf0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
ed00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
ed10: 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ype;.#ifdef SQLI
ed20: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
ed30: 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f  _METADATA.    co
ed40: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44  nst char *zOrigD
ed50: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
ed60: 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20   char *zOrigTab 
ed70: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
ed80: 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20  har *zOrigCol = 
ed90: 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63  0;.    zType = c
eda0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
edb0: 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f  p, &zOrigDb, &zO
edc0: 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f  rigTab, &zOrigCo
edd0: 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  l);..    /* The 
ede0: 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69  vdbe must make i
edf0: 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74  ts own copy of t
ee00: 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61  he column-type a
ee10: 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a  nd other .    **
ee20: 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63   column specific
ee30: 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73   strings, in cas
ee40: 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  e the schema is 
ee50: 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69  reset before thi
ee60: 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  s.    ** virtual
ee70: 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65   machine is dele
ee80: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
ee90: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
eea0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
eeb0: 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f  AME_DATABASE, zO
eec0: 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52  rigDb, SQLITE_TR
eed0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
eee0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
eef0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
ef00: 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61  E_TABLE, zOrigTa
ef10: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
ef20: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
ef30: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
ef40: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f  v, i, COLNAME_CO
ef50: 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20  LUMN, zOrigCol, 
ef60: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
ef70: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79  );.#else.    zTy
ef80: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
ef90: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
efa0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
efb0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
efc0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
efd0: 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70  E_DECLTYPE, zTyp
efe0: 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  e, SQLITE_TRANSI
eff0: 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ENT);.  }.#endif
f000: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
f010: 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
f020: 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E) */.}.../*.** 
f030: 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75  Compute the colu
f040: 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 53  mn names for a S
f050: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
f060: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  .**.** The only 
f070: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 53  guarantee that S
f080: 51 4c 69 74 65 20 6d 61 6b 65 73 20 61 62 6f 75  QLite makes abou
f090: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  t column names i
f0a0: 73 20 74 68 61 74 20 69 66 20 74 68 65 0a 2a 2a  s that if the.**
f0b0: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20 41   column has an A
f0c0: 53 20 63 6c 61 75 73 65 20 61 73 73 69 67 6e 69  S clause assigni
f0d0: 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c 20 74 68  ng it a name, th
f0e0: 61 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 6e  at will be the n
f0f0: 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20 54 68 61  ame used..** Tha
f100: 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f  t is the only do
f110: 63 75 6d 65 6e 74 65 64 20 67 75 61 72 61 6e 74  cumented guarant
f120: 65 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 63 6f  ee.  However, co
f130: 75 6e 74 6c 65 73 73 20 61 70 70 6c 69 63 61 74  untless applicat
f140: 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f 70 65  ions.** develope
f150: 64 20 6f 76 65 72 20 74 68 65 20 79 65 61 72 73  d over the years
f160: 20 68 61 76 65 20 6d 61 64 65 20 62 61 73 65 6c   have made basel
f170: 65 73 73 20 61 73 73 75 6d 70 74 69 6f 6e 73 20  ess assumptions 
f180: 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  about column nam
f190: 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c 20 62  es.** and will b
f1a0: 72 65 61 6b 20 69 66 20 74 68 6f 73 65 20 61 73  reak if those as
f1b0: 73 75 6d 70 74 69 6f 6e 73 20 63 68 61 6e 67 65  sumptions change
f1c0: 73 2e 20 20 48 65 6e 63 65 2c 20 75 73 65 20 65  s.  Hence, use e
f1d0: 78 74 72 65 6d 65 20 63 61 75 74 69 6f 6e 0a 2a  xtreme caution.*
f1e0: 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67  * when modifying
f1f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
f200: 20 61 76 6f 69 64 20 62 72 65 61 6b 69 6e 67 20   avoid breaking 
f210: 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65  legacy..**.** Se
f220: 65 20 41 6c 73 6f 3a 20 73 71 6c 69 74 65 33 43  e Also: sqlite3C
f230: 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
f240: 73 74 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  st().**.** The P
f250: 52 41 47 4d 41 20 73 68 6f 72 74 5f 63 6f 6c 75  RAGMA short_colu
f260: 6d 6e 5f 6e 61 6d 65 73 20 61 6e 64 20 50 52 41  mn_names and PRA
f270: 47 4d 41 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f  GMA full_column_
f280: 6e 61 6d 65 73 20 73 65 74 74 69 6e 67 73 20 61  names settings a
f290: 72 65 0a 2a 2a 20 64 65 70 72 65 63 61 74 65 64  re.** deprecated
f2a0: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 73  .  The default s
f2b0: 65 74 74 69 6e 67 20 69 73 20 73 68 6f 72 74 3d  etting is short=
f2c0: 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 2e 20 20 39  ON, full=OFF.  9
f2d0: 39 2e 39 25 20 6f 66 20 61 6c 6c 0a 2a 2a 20 61  9.9% of all.** a
f2e0: 70 70 6c 69 63 61 74 69 6f 6e 73 20 73 68 6f 75  pplications shou
f2f0: 6c 64 20 6f 70 65 72 61 74 65 20 74 68 69 73 20  ld operate this 
f300: 77 61 79 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  way.  Neverthele
f310: 73 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 73  ss, we need to s
f320: 75 70 70 6f 72 74 20 74 68 65 0a 2a 2a 20 6f 74  upport the.** ot
f330: 68 65 72 20 6d 6f 64 65 73 20 66 6f 72 20 6c 65  her modes for le
f340: 67 61 63 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73  gacy:.**.**    s
f350: 68 6f 72 74 3d 4f 46 46 2c 20 66 75 6c 6c 3d 4f  hort=OFF, full=O
f360: 46 46 3a 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20  FF:      Column 
f370: 6e 61 6d 65 20 69 73 20 74 68 65 20 74 65 78 74  name is the text
f380: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
f390: 6f 6e 20 68 61 73 20 69 74 0a 2a 2a 20 20 20 20  on has it.**    
f3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3b0: 20 20 20 20 20 20 20 20 20 20 6f 72 69 67 69 6e            origin
f3c0: 61 6c 6c 79 20 61 70 70 65 61 72 73 20 69 6e 20  ally appears in 
f3d0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
f3e0: 6d 65 6e 74 2e 20 20 49 6e 0a 2a 2a 20 20 20 20  ment.  In.**    
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f400: 20 20 20 20 20 20 20 20 20 20 6f 74 68 65 72 20            other 
f410: 77 6f 72 64 73 2c 20 74 68 65 20 7a 53 70 61 6e  words, the zSpan
f420: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 65   of the result e
f430: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
f440: 20 20 20 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75      short=ON, fu
f450: 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20 20 28 54  ll=OFF:       (T
f460: 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
f470: 6c 74 20 73 65 74 74 69 6e 67 29 2e 20 20 49 66  lt setting).  If
f480: 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20   the result.**  
f490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4a0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66 65              refe
f4b0: 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61  rs directly to a
f4c0: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74   table column, t
f4d0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  hen the.**      
f4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4f0: 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 63          result c
f500: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6a 75  olumn name is ju
f510: 73 74 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  st the table col
f520: 75 6d 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  umn.**          
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f540: 20 20 20 20 6e 61 6d 65 3a 20 43 4f 4c 55 4d 4e      name: COLUMN
f550: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 75 73 65  .  Otherwise use
f560: 20 7a 53 70 61 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20   zSpan..**.**   
f570: 20 66 75 6c 6c 3d 4f 4e 2c 20 73 68 6f 72 74 3d   full=ON, short=
f580: 41 4e 59 3a 20 20 20 20 20 20 20 49 66 20 74 68  ANY:       If th
f590: 65 20 72 65 73 75 6c 74 20 72 65 66 65 72 73 20  e result refers 
f5a0: 64 69 72 65 63 74 6c 79 20 74 6f 20 61 20 74 61  directly to a ta
f5b0: 62 6c 65 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 20  ble column,.**  
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 6e              then
f5e0: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75   the result colu
f5f0: 6d 6e 20 6e 61 6d 65 20 77 69 74 68 20 74 68 65  mn name with the
f600: 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20   table name.**  
f610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f620: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66              pref
f630: 69 78 2c 20 65 78 3a 20 54 41 42 4c 45 2e 43 4f  ix, ex: TABLE.CO
f640: 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73 65  LUMN.  Otherwise
f650: 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2f 0a 73   use zSpan..*/.s
f660: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
f670: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a  ateColumnNames(.
f680: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
f690: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
f6a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
f6b0: 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20  ect *pSelect    
f6c0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 6c   /* Generate col
f6d0: 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 74 68  umn names for th
f6e0: 69 73 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  is SELECT statem
f6f0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ent */.){.  Vdbe
f700: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
f710: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
f720: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 53  Table *pTab;.  S
f730: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
f740: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
f750: 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  List;.  sqlite3 
f760: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
f770: 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65  ;.  int fullName
f780: 3b 20 20 20 20 2f 2a 20 54 41 42 4c 45 2e 43 4f  ;    /* TABLE.CO
f790: 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c  LUMN if no AS cl
f7a0: 61 75 73 65 20 61 6e 64 20 69 73 20 61 20 64 69  ause and is a di
f7b0: 72 65 63 74 20 74 61 62 6c 65 20 72 65 66 20 2a  rect table ref *
f7c0: 2f 0a 20 20 69 6e 74 20 73 72 63 4e 61 6d 65 3b  /.  int srcName;
f7d0: 20 20 20 20 20 2f 2a 20 43 4f 4c 55 4d 4e 20 6f       /* COLUMN o
f7e0: 72 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69  r TABLE.COLUMN i
f7f0: 66 20 6e 6f 20 41 53 20 63 6c 61 75 73 65 20 61  f no AS clause a
f800: 6e 64 20 69 73 20 64 69 72 65 63 74 20 2a 2f 0a  nd is direct */.
f810: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f820: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f  OMIT_EXPLAIN.  /
f830: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
f840: 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68  EXPLAIN, skip th
f850: 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28  is step */.  if(
f860: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
f870: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
f880: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
f890: 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d  ( pParse->colNam
f8a0: 65 73 53 65 74 20 7c 7c 20 64 62 2d 3e 6d 61 6c  esSet || db->mal
f8b0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
f8c0: 72 6e 3b 0a 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  rn;.  /* Column 
f8d0: 6e 61 6d 65 73 20 61 72 65 20 64 65 74 65 72 6d  names are determ
f8e0: 69 6e 65 64 20 62 79 20 74 68 65 20 6c 65 66 74  ined by the left
f8f0: 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 61 20  -most term of a 
f900: 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
f910: 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c  */.  while( pSel
f920: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53  ect->pPrior ) pS
f930: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d  elect = pSelect-
f940: 3e 70 50 72 69 6f 72 3b 0a 20 20 53 45 4c 45 43  >pPrior;.  SELEC
f950: 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
f960: 70 53 65 6c 65 63 74 2c 28 22 67 65 6e 65 72 61  pSelect,("genera
f970: 74 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  ting column name
f980: 73 5c 6e 22 29 29 3b 0a 20 20 70 54 61 62 4c 69  s\n"));.  pTabLi
f990: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
f9a0: 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
f9b0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
f9c0: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
f9d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
f9e0: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 70 50 61  List!=0 );.  pPa
f9f0: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
fa00: 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65   = 1;.  fullName
fa10: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
fa20: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
fa30: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 72 63 4e 61  mes)!=0;.  srcNa
fa40: 6d 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  me = (db->flags 
fa50: 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
fa60: 6c 4e 61 6d 65 73 29 21 3d 30 20 7c 7c 20 66 75  lNames)!=0 || fu
fa70: 6c 6c 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  llName;.  sqlite
fa80: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
fa90: 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  v, pEList->nExpr
faa0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
fab0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
fac0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
fad0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
fae0: 70 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65  pExpr;..    asse
faf0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 20 20  rt( p!=0 );.    
fb00: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54  assert( p->op!=T
fb10: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20  K_AGG_COLUMN ); 
fb20: 20 2f 2a 20 41 67 67 20 70 72 6f 63 65 73 73 69   /* Agg processi
fb30: 6e 67 20 68 61 73 20 6e 6f 74 20 72 75 6e 20 79  ng has not run y
fb40: 65 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  et */.    assert
fb50: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  ( p->op!=TK_COLU
fb60: 4d 4e 20 7c 7c 20 70 2d 3e 70 54 61 62 21 3d 30  MN || p->pTab!=0
fb70: 20 29 3b 20 2f 2a 20 43 6f 76 65 72 69 6e 67 20   ); /* Covering 
fb80: 69 64 78 20 6e 6f 74 20 79 65 74 20 63 6f 64 65  idx not yet code
fb90: 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 45 4c  d */.    if( pEL
fba0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
fbb0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 41  ){.      /* An A
fbc0: 53 20 63 6c 61 75 73 65 20 61 6c 77 61 79 73 20  S clause always 
fbd0: 74 61 6b 65 73 20 66 69 72 73 74 20 70 72 69 6f  takes first prio
fbe0: 72 69 74 79 20 2a 2f 0a 20 20 20 20 20 20 63 68  rity */.      ch
fbf0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  ar *zName = pELi
fc00: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
fc10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fc20: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
fc30: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
fc40: 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52  zName, SQLITE_TR
fc50: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65  ANSIENT);.    }e
fc60: 6c 73 65 20 69 66 28 20 73 72 63 4e 61 6d 65 20  lse if( srcName 
fc70: 26 26 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  && p->op==TK_COL
fc80: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 68 61  UMN ){.      cha
fc90: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69  r *zCol;.      i
fca0: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
fcb0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 61 62  lumn;.      pTab
fcc0: 20 3d 20 70 2d 3e 70 54 61 62 3b 0a 20 20 20 20   = p->pTab;.    
fcd0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
fce0: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  0 );.      if( i
fcf0: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
fd00: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
fd10: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
fd20: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
fd30: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
fd40: 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l) );.      if( 
fd50: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
fd60: 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22    zCol = "rowid"
fd70: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
fd80: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54         zCol = pT
fd90: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
fda0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Name;.      }.  
fdb0: 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65      if( fullName
fdc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
fdd0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
fde0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
fdf0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
fe00: 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a  "%s.%s", pTab->z
fe10: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  Name, zCol);.   
fe20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fe30: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
fe40: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
fe50: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e  Name, SQLITE_DYN
fe60: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
fe70: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
fe80: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
fe90: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
fea0: 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49  NAME, zCol, SQLI
feb0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
fec0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
fed0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
fee0: 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e  ar *z = pEList->
fef0: 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
ff00: 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c    z = z==0 ? sql
ff10: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
ff20: 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29  "column%d", i+1)
ff30: 20 3a 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   : sqlite3DbStrD
ff40: 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20  up(db, z);.     
ff50: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
ff60: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
ff70: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51  NAME_NAME, z, SQ
ff80: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
ff90: 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72     }.  }.  gener
ffa0: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70  ateColumnTypes(p
ffb0: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
ffc0: 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a   pEList);.}../*.
ffd0: 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72  ** Given an expr
ffe0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69  ession list (whi
fff0: 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65  ch is really the
10000 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
10010 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72  ions.** that for
10020 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  m the result set
10030 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
10040 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20  tement) compute 
10050 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63  appropriate.** c
10060 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
10070 61 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75  a table that wou
10080 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  ld hold the expr
10090 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
100a0 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61  ** All column na
100b0 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71  mes will be uniq
100c0 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ue..**.** Only t
100d0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
100e0 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43  are computed.  C
100f0 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c  olumn.zType, Col
10100 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e  umn.zColl,.** an
10110 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f  d other fields o
10120 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72  f Column are zer
10130 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  oed..**.** Retur
10140 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
10150 75 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65  uccess.  If a me
10160 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
10170 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a  error occurs,.**
10180 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a   store NULL in *
10190 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a  paCol and 0 in *
101a0 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e  pnCol and return
101b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a   SQLITE_NOMEM..*
101c0 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67 75  *.** The only gu
101d0 61 72 61 6e 74 65 65 20 74 68 61 74 20 53 51 4c  arantee that SQL
101e0 69 74 65 20 6d 61 6b 65 73 20 61 62 6f 75 74 20  ite makes about 
101f0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73 20  column names is 
10200 74 68 61 74 20 69 66 20 74 68 65 0a 2a 2a 20 63  that if the.** c
10210 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20 41 53 20  olumn has an AS 
10220 63 6c 61 75 73 65 20 61 73 73 69 67 6e 69 6e 67  clause assigning
10230 20 69 74 20 61 20 6e 61 6d 65 2c 20 74 68 61 74   it a name, that
10240 20 77 69 6c 6c 20 62 65 20 74 68 65 20 6e 61 6d   will be the nam
10250 65 20 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74 20  e used..** That 
10260 69 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75  is the only docu
10270 6d 65 6e 74 65 64 20 67 75 61 72 61 6e 74 65 65  mented guarantee
10280 2e 20 20 48 6f 77 65 76 65 72 2c 20 63 6f 75 6e  .  However, coun
10290 74 6c 65 73 73 20 61 70 70 6c 69 63 61 74 69 6f  tless applicatio
102a0 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64 20  ns.** developed 
102b0 6f 76 65 72 20 74 68 65 20 79 65 61 72 73 20 68  over the years h
102c0 61 76 65 20 6d 61 64 65 20 62 61 73 65 6c 65 73  ave made baseles
102d0 73 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 61 62  s assumptions ab
102e0 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  out column names
102f0 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72 65  .** and will bre
10300 61 6b 20 69 66 20 74 68 6f 73 65 20 61 73 73 75  ak if those assu
10310 6d 70 74 69 6f 6e 73 20 63 68 61 6e 67 65 73 2e  mptions changes.
10320 20 20 48 65 6e 63 65 2c 20 75 73 65 20 65 78 74    Hence, use ext
10330 72 65 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a 20  reme caution.** 
10340 77 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74  when modifying t
10350 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 61  his routine to a
10360 76 6f 69 64 20 62 72 65 61 6b 69 6e 67 20 6c 65  void breaking le
10370 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  gacy..**.** See 
10380 41 6c 73 6f 3a 20 67 65 6e 65 72 61 74 65 43 6f  Also: generateCo
10390 6c 75 6d 6e 4e 61 6d 65 73 28 29 0a 2a 2f 0a 69  lumnNames().*/.i
103a0 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  nt sqlite3Column
103b0 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  sFromExprList(. 
103c0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
103d0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
103e0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
103f0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
10400 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  t,       /* Expr
10410 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63 68   list from which
10420 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75 6d   to derive colum
10430 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36  n names */.  i16
10440 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20   *pnCol,        
10450 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
10460 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
10470 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f  mns here */.  Co
10480 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20  lumn **paCol    
10490 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
104a0 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69  he new column li
104b0 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  st here */.){.  
104c0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
104d0 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44  arse->db;   /* D
104e0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
104f0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  on */.  int i, j
10500 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10510 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
10520 74 65 72 73 20 2a 2f 0a 20 20 75 33 32 20 63 6e  ters */.  u32 cn
10530 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
10540 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 61        /* Index a
10550 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  dded to make the
10560 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a   name unique */.
10570 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20    Column *aCol, 
10580 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a  *pCol;        /*
10590 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
105a0 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  r result columns
105b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20   */.  int nCol; 
105c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
105e0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
105f0 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 63 68  sult set */.  ch
10600 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
10610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
10620 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  umn name */.  in
10630 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
10640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10650 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61  e of name in zNa
10660 6d 65 5b 5d 20 2a 2f 0a 20 20 48 61 73 68 20 68  me[] */.  Hash h
10670 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
10680 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61        /* Hash ta
10690 62 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61  ble of column na
106a0 6d 65 73 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65  mes */..  sqlite
106b0 33 48 61 73 68 49 6e 69 74 28 26 68 74 29 3b 0a  3HashInit(&ht);.
106c0 20 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a    if( pEList ){.
106d0 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73      nCol = pELis
106e0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43  t->nExpr;.    aC
106f0 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ol = sqlite3DbMa
10700 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
10710 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f  eof(aCol[0])*nCo
10720 6c 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  l);.    testcase
10730 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ( aCol==0 );.   
10740 20 69 66 28 20 6e 43 6f 6c 3e 33 32 37 36 37 20   if( nCol>32767 
10750 29 20 6e 43 6f 6c 20 3d 20 33 32 37 36 37 3b 0a  ) nCol = 32767;.
10760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
10770 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20  l = 0;.    aCol 
10780 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
10790 74 28 20 6e 43 6f 6c 3d 3d 28 69 31 36 29 6e 43  t( nCol==(i16)nC
107a0 6f 6c 20 29 3b 0a 20 20 2a 70 6e 43 6f 6c 20 3d  ol );.  *pnCol =
107b0 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20   nCol;.  *paCol 
107c0 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69  = aCol;..  for(i
107d0 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69  =0, pCol=aCol; i
107e0 3c 6e 43 6f 6c 20 26 26 20 21 64 62 2d 3e 6d 61  <nCol && !db->ma
107f0 6c 6c 6f 63 46 61 69 6c 65 64 3b 20 69 2b 2b 2c  llocFailed; i++,
10800 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a   pCol++){.    /*
10810 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69   Get an appropri
10820 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ate name for the
10830 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20   column.    */. 
10840 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20     if( (zName = 
10850 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
10860 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
10870 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
10880 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53   contains an "AS
10890 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c   <name>" phrase,
108a0 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74   use <name> as t
108b0 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 7d  he name */.    }
108c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
108d0 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 73 71 6c   *pColExpr = sql
108e0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
108f0 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ate(pEList->a[i]
10900 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 77  .pExpr);.      w
10910 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e  hile( pColExpr->
10920 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20  op==TK_DOT ){.  
10930 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d        pColExpr =
10940 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68   pColExpr->pRigh
10950 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
10960 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29  t( pColExpr!=0 )
10970 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10980 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72  assert( pColExpr
10990 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
109a0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28  UMN );.      if(
109b0 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54   pColExpr->op==T
109c0 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
109d0 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d      /* For colum
109e0 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d  ns use the colum
109f0 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20  n name name */. 
10a00 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
10a10 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c  = pColExpr->iCol
10a20 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 54 61 62  umn;.        Tab
10a30 6c 65 20 2a 70 54 61 62 20 3d 20 70 43 6f 6c 45  le *pTab = pColE
10a40 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
10a50 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21     assert( pTab!
10a60 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
10a70 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
10a80 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
10a90 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 69         zName = i
10aa0 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61  Col>=0 ? pTab->a
10ab0 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20  Col[iCol].zName 
10ac0 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  : "rowid";.     
10ad0 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45   }else if( pColE
10ae0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
10af0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
10b00 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
10b10 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f  ty(pColExpr, EP_
10b20 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
10b30 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 43 6f       zName = pCo
10b40 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  lExpr->u.zToken;
10b50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10b60 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65        /* Use the
10b70 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f   original text o
10b80 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70  f the column exp
10b90 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e  ression as its n
10ba0 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a  ame */.        z
10bb0 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
10bc0 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [i].zSpan;.     
10bd0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
10be0 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   zName ){.      
10bf0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
10c00 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d  bStrDup(db, zNam
10c10 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
10c20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
10c30 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 22  ite3MPrintf(db,"
10c40 63 6f 6c 75 6d 6e 25 64 22 2c 69 2b 31 29 3b 0a  column%d",i+1);.
10c50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
10c60 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
10c70 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
10c80 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
10c90 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
10ca0 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e 20     ** append an 
10cb0 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e  integer to the n
10cc0 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62  ame so that it b
10cd0 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20  ecomes unique.. 
10ce0 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d 20     */.    cnt = 
10cf0 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4e  0;.    while( zN
10d00 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48 61  ame && sqlite3Ha
10d10 73 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e 61 6d  shFind(&ht, zNam
10d20 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  e)!=0 ){.      n
10d30 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
10d40 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
10d50 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e 30       if( nName>0
10d60 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
10d70 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20 26  j=nName-1; j>0 &
10d80 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  & sqlite3Isdigit
10d90 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d 29  (zName[j]); j--)
10da0 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  {}.        if( z
10db0 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20 6e  Name[j]==':' ) n
10dc0 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20 20 20  Name = j;.      
10dd0 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  }.      zName = 
10de0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
10df0 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e 4e  b, "%.*z:%u", nN
10e00 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e  ame, zName, ++cn
10e10 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e  t);.      if( cn
10e20 74 3e 33 20 29 20 73 71 6c 69 74 65 33 5f 72 61  t>3 ) sqlite3_ra
10e30 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
10e40 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20 20  cnt), &cnt);.   
10e50 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61   }.    pCol->zNa
10e60 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
10e70 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f  sqlite3ColumnPro
10e80 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28  pertiesFromName(
10e90 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69 66  0, pCol);.    if
10ea0 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74  ( zName && sqlit
10eb0 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 68 74  e3HashInsert(&ht
10ec0 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d 3d  , zName, pCol)==
10ed0 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  pCol ){.      sq
10ee0 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
10ef0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
10f00 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
10f10 26 68 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  &ht);.  if( db->
10f20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
10f30 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69      for(j=0; j<i
10f40 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; j++){.      sq
10f50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
10f60 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[j].zName);.
10f70 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
10f80 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
10f90 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20  );.    *paCol = 
10fa0 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20  0;.    *pnCol = 
10fb0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
10fc0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
10fd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
10fe0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10ff0 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20 63  * Add type and c
11000 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  ollation informa
11010 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  tion to a column
11020 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a   list based on.*
11030 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  * a SELECT state
11040 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65  ment..** .** The
11050 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65   column list pre
11060 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72 6f  sumably came fro
11070 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61  m selectColumnNa
11080 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mesFromExprList(
11090 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  )..** The column
110a0 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e   list has only n
110b0 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73 20  ames, not types 
110c0 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20  or collations.  
110d0 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
110e0 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e 64  goes through and
110f0 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73 20   adds the types 
11100 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a  and collations..
11110 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
11120 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74  ne requires that
11130 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73   all identifiers
11140 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a   in the SELECT.*
11150 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20 72  * statement be r
11160 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64  esolved..*/.void
11170 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
11180 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
11190 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65  llation(.  Parse
111a0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
111b0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
111c0 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20  exts */.  Table 
111d0 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
111e0 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74 79  /* Add column ty
111f0 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  pe information t
11200 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  o this table */.
11210 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
11220 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43  t       /* SELEC
11230 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  T used to determ
11240 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f  ine types and co
11250 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  llations */.){. 
11260 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
11270 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d  Parse->db;.  Nam
11280 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
11290 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
112a0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
112b0 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20    int i;.  Expr 
112c0 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  *p;.  struct Exp
112d0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 0a  rList_item *a;..
112e0 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63    assert( pSelec
112f0 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
11300 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46  ( (pSelect->selF
11310 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
11320 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ed)!=0 );.  asse
11330 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d  rt( pTab->nCol==
11340 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
11350 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  >nExpr || db->ma
11360 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
11370 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
11380 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
11390 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
113a0 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
113b0 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
113c0 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
113d0 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45   a = pSelect->pE
113e0 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69  List->a;.  for(i
113f0 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61  =0, pCol=pTab->a
11400 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  Col; i<pTab->nCo
11410 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
11420 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
11430 2a 7a 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20  *zType;.    int 
11440 6e 2c 20 6d 3b 0a 20 20 20 20 70 20 3d 20 61 5b  n, m;.    p = a[
11450 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7a 54  i].pExpr;.    zT
11460 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
11470 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
11480 30 29 3b 0a 20 20 20 20 2f 2a 20 70 43 6f 6c 2d  0);.    /* pCol-
11490 3e 73 7a 45 73 74 20 3d 20 2e 2e 2e 20 2f 2f 20  >szEst = ... // 
114a0 43 6f 6c 75 6d 6e 20 73 69 7a 65 20 65 73 74 20  Column size est 
114b0 66 6f 72 20 53 45 4c 45 43 54 20 74 61 62 6c 65  for SELECT table
114c0 73 20 6e 65 76 65 72 20 75 73 65 64 20 2a 2f 0a  s never used */.
114d0 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
114e0 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
114f0 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20  Affinity(p);.   
11500 20 69 66 28 20 7a 54 79 70 65 20 29 7b 0a 20 20   if( zType ){.  
11510 20 20 20 20 6d 20 3d 20 73 71 6c 69 74 65 33 53      m = sqlite3S
11520 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a  trlen30(zType);.
11530 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65        n = sqlite
11540 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 2d 3e  3Strlen30(pCol->
11550 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43  zName);.      pC
11560 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ol->zName = sqli
11570 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
11580 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  ee(db, pCol->zNa
11590 6d 65 2c 20 6e 2b 6d 2b 32 29 3b 0a 20 20 20 20  me, n+m+2);.    
115a0 20 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 4e 61 6d    if( pCol->zNam
115b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  e ){.        mem
115c0 63 70 79 28 26 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  cpy(&pCol->zName
115d0 5b 6e 2b 31 5d 2c 20 7a 54 79 70 65 2c 20 6d 2b  [n+1], zType, m+
115e0 31 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  1);.        pCol
115f0 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f  ->colFlags |= CO
11600 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20  LFLAG_HASTYPE;. 
11610 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11620 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e   if( pCol->affin
11630 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61  ity==0 ) pCol->a
11640 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
11650 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70  _AFF_BLOB;.    p
11660 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
11670 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
11680 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , p);.    if( pC
11690 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f  oll && pCol->zCo
116a0 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ll==0 ){.      p
116b0 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c  Col->zColl = sql
116c0 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
116d0 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
116e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62      }.  }.  pTab
116f0 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 31 3b 20  ->szTabRow = 1; 
11700 2f 2a 20 41 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20  /* Any non-zero 
11710 76 61 6c 75 65 20 77 6f 72 6b 73 20 2a 2f 0a 7d  value works */.}
11720 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
11730 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11740 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62  , generate a Tab
11750 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
11760 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74  t describes.** t
11770 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
11780 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f   that SELECT..*/
11790 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52  .Table *sqlite3R
117a0 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
117b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
117c0 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
117d0 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
117e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
117f0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
11800 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a  nt savedFlags;..
11810 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20 64    savedFlags = d
11820 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e  b->flags;.  db->
11830 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
11840 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20  _FullColNames;. 
11850 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
11860 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
11870 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  es;.  sqlite3Sel
11880 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
11890 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69  pSelect, 0);.  i
118a0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
118b0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68  ) return 0;.  wh
118c0 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50  ile( pSelect->pP
118d0 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d  rior ) pSelect =
118e0 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
118f0 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20  ;.  db->flags = 
11900 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70 54  savedFlags;.  pT
11910 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
11920 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
11930 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
11940 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
11950 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
11960 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65  .  /* The sqlite
11970 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
11980 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65  ct() is only use
11990 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68 65  d n contexts whe
119a0 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a  re lookaside.  *
119b0 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  * is disabled */
119c0 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c  .  assert( db->l
119d0 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c  ookaside.bDisabl
119e0 65 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 54 61  e );.  pTab->nTa
119f0 62 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62  bRef = 1;.  pTab
11a00 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
11a10 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
11a20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32  = 200; assert( 2
11a30 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  00==sqlite3LogEs
11a40 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20  t(1048576) );.  
11a50 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
11a60 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
11a70 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  e, pSelect->pELi
11a80 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
11a90 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
11aa0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
11ab0 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
11ac0 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
11ad0 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  pTab, pSelect);.
11ae0 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
11af0 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  -1;.  if( db->ma
11b00 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
11b10 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
11b20 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
11b30 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
11b40 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
11b50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
11b60 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76  VDBE for the giv
11b70 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  en parser contex
11b80 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
11b90 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
11ba0 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  y..** If an erro
11bb0 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
11bc0 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20   NULL and leave 
11bd0 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  a message in pPa
11be0 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  rse..*/.Vdbe *sq
11bf0 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72  lite3GetVdbe(Par
11c00 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
11c10 66 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  f( pParse->pVdbe
11c20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
11c30 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
11c40 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
11c50 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20  pToplevel==0.   
11c60 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
11c70 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64  nabled(pParse->d
11c80 62 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f  b,SQLITE_FactorO
11c90 75 74 43 6f 6e 73 74 29 0a 20 20 29 7b 0a 20 20  utConst).  ){.  
11ca0 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73    pParse->okCons
11cb0 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20 7d  tFactor = 1;.  }
11cc0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
11cd0 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72  3VdbeCreate(pPar
11ce0 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  se);.}.../*.** C
11cf0 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69  ompute the iLimi
11d00 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69  t and iOffset fi
11d10 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45  elds of the SELE
11d20 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  CT based on the.
11d30 2a 2a 20 70 4c 69 6d 69 74 20 65 78 70 72 65 73  ** pLimit expres
11d40 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 2d 3e  sions.  pLimit->
11d50 70 4c 65 66 74 20 61 6e 64 20 70 4c 69 6d 69 74  pLeft and pLimit
11d60 2d 3e 70 52 69 67 68 74 20 68 6f 6c 64 20 74 68  ->pRight hold th
11d70 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  e expressions.**
11d80 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
11d90 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
11da0 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72   statement after
11db0 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
11dc0 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64  FFSET.** keyword
11dd0 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74  s.  Or NULL if t
11de0 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72  hose keywords ar
11df0 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69  e omitted. iLimi
11e00 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a  t and iOffset .*
11e10 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65  * are the intege
11e20 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
11e30 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f  r numbers for co
11e40 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63  unters used to c
11e50 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c  ompute .** the l
11e60 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e  imit and offset.
11e70 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
11e80 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66   limit and/or of
11e90 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69  fset, then .** i
11ea0 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
11eb0 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a  t are negative..
11ec0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
11ed0 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76  ne changes the v
11ee0 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20  alues of iLimit 
11ef0 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79  and iOffset only
11f00 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f   if.** a limit o
11f10 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69  r offset is defi
11f20 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 2d 3e 70  ned by pLimit->p
11f30 4c 65 66 74 20 61 6e 64 20 70 4c 69 6d 69 74 2d  Left and pLimit-
11f40 3e 70 52 69 67 68 74 2e 20 20 69 4c 69 6d 69 74  >pRight.  iLimit
11f50 0a 2a 2a 20 61 6e 64 20 69 4f 66 66 73 65 74 20  .** and iOffset 
11f60 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
11f70 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f   preset to appro
11f80 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76  priate default v
11f90 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a 20  alues (zero).** 
11fa0 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
11fb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
11fc0 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73 65 74  *.** The iOffset
11fd0 20 72 65 67 69 73 74 65 72 20 28 69 66 20 69 74   register (if it
11fe0 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 69 74   exists) is init
11ff0 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76  ialized to the v
12000 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 4f  alue.** of the O
12010 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c 69 6d  FFSET.  The iLim
12020 69 74 20 72 65 67 69 73 74 65 72 20 69 73 20 69  it register is i
12030 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49  nitialized to LI
12040 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72 0a 2a  MIT.  Register.*
12050 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73 20 69  * iOffset+1 is i
12060 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49  nitialized to LI
12070 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a  MIT+OFFSET..**.*
12080 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74  * Only if pLimit
12090 2d 3e 70 4c 65 66 74 21 3d 30 20 64 6f 20 74 68  ->pLeft!=0 do th
120a0 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
120b0 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e  s get.** redefin
120c0 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41  ed.  The UNION A
120d0 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73  LL operator uses
120e0 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74   this property t
120f0 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72  o force.** the r
12100 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65  euse of the same
12110 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
12120 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f  t registers acro
12130 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53  ss multiple.** S
12140 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
12150 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12160 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
12170 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50  isters(Parse *pP
12180 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
12190 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20   int iBreak){.  
121a0 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69  Vdbe *v = 0;.  i
121b0 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  nt iLimit = 0;. 
121c0 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20   int iOffset;.  
121d0 69 6e 74 20 6e 3b 0a 20 20 45 78 70 72 20 2a 70  int n;.  Expr *p
121e0 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
121f0 74 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  t;..  if( p->iLi
12200 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  mit ) return;.. 
12210 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54   /* .  ** "LIMIT
12220 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77   -1" always show
12230 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65  s all rows.  The
12240 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20  re is some.  ** 
12250 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f 75  controversy abou
12260 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65  t what the corre
12270 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75  ct behavior shou
12280 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20  ld be..  ** The 
12290 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
122a0 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74  tation interpret
122b0 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d  s "LIMIT 0" to m
122c0 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73  ean.  ** no rows
122d0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
122e0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
122f0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 70 4c  Parse);.  if( pL
12300 69 6d 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65  imit ){.    asse
12310 72 74 28 20 70 4c 69 6d 69 74 2d 3e 6f 70 3d 3d  rt( pLimit->op==
12320 54 4b 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20  TK_LIMIT );.    
12330 61 73 73 65 72 74 28 20 70 4c 69 6d 69 74 2d 3e  assert( pLimit->
12340 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
12350 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d  p->iLimit = iLim
12360 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
12370 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c  Mem;.    v = sql
12380 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
12390 73 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  se);.    assert(
123a0 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   v!=0 );.    if(
123b0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
123c0 74 65 67 65 72 28 70 4c 69 6d 69 74 2d 3e 70 4c  teger(pLimit->pL
123d0 65 66 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20  eft, &n) ){.    
123e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
123f0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
12400 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  r, n, iLimit);. 
12410 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
12420 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
12430 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66  ter"));.      if
12440 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
12450 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
12460 6f 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  o(v, iBreak);.  
12470 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
12480 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74  =0 && p->nSelect
12490 52 6f 77 3e 73 71 6c 69 74 65 33 4c 6f 67 45 73  Row>sqlite3LogEs
124a0 74 28 28 75 36 34 29 6e 29 20 29 7b 0a 20 20 20  t((u64)n) ){.   
124b0 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
124c0 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
124d0 73 74 28 28 75 36 34 29 6e 29 3b 0a 20 20 20 20  st((u64)n);.    
124e0 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
124f0 7c 3d 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74  |= SF_FixedLimit
12500 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
12510 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
12520 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
12530 65 2c 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  e, pLimit->pLeft
12540 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
12550 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12560 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
12570 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62  nt, iLimit); Vdb
12580 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
12590 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
125a0 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
125b0 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  er"));.      sql
125c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
125d0 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d  , OP_IfNot, iLim
125e0 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  it, iBreak); Vdb
125f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
12600 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 6d    }.    if( pLim
12610 69 74 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  it->pRight ){.  
12620 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
12630 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61   iOffset = ++pPa
12640 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
12650 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
12660 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
12670 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  n extra register
12680 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65   for limit+offse
12690 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  t */.      sqlit
126a0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
126b0 65 2c 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68  e, pLimit->pRigh
126c0 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  t, iOffset);.   
126d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
126e0 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
126f0 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 20  eInt, iOffset); 
12700 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
12710 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
12720 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63  nt((v, "OFFSET c
12730 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
12740 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12750 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c  p3(v, OP_OffsetL
12760 69 6d 69 74 2c 20 69 4c 69 6d 69 74 2c 20 69 4f  imit, iLimit, iO
12770 66 66 73 65 74 2b 31 2c 20 69 4f 66 66 73 65 74  ffset+1, iOffset
12780 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
12790 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b  ment((v, "LIMIT+
127a0 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 7d  OFFSET"));.    }
127b0 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
127c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
127d0 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
127e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70  * Return the app
127f0 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
12800 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
12810 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
12820 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73  mn of.** the res
12830 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20  ult set for the 
12840 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
12850 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20  statement "p".  
12860 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a  Return NULL if.*
12870 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  * the column has
12880 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c   no default coll
12890 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
128a0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
128b0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
128c0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
128d0 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72  lect is taken fr
128e0 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  om the.** left-m
128f0 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ost term of the 
12900 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20  select that has 
12910 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
12920 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ence..*/.static 
12930 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65  CollSeq *multiSe
12940 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73  lectCollSeq(Pars
12950 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
12960 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  t *p, int iCol){
12970 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74  .  CollSeq *pRet
12980 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ;.  if( p->pPrio
12990 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
129a0 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
129b0 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50  eq(pParse, p->pP
129c0 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d  rior, iCol);.  }
129d0 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d  else{.    pRet =
129e0 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
129f0 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f  ( iCol>=0 );.  /
12a00 2a 20 69 43 6f 6c 20 6d 75 73 74 20 62 65 20 6c  * iCol must be l
12a10 65 73 73 20 74 68 61 6e 20 70 2d 3e 70 45 4c 69  ess than p->pELi
12a20 73 74 2d 3e 6e 45 78 70 72 2e 20 20 4f 74 68 65  st->nExpr.  Othe
12a30 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 77  rwise an error w
12a40 6f 75 6c 64 0a 20 20 2a 2a 20 68 61 76 65 20 62  ould.  ** have b
12a50 65 65 6e 20 74 68 72 6f 77 6e 20 64 75 72 69 6e  een thrown durin
12a60 67 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  g name resolutio
12a70 6e 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 6e  n and we would n
12a80 6f 74 20 68 61 76 65 20 67 6f 74 74 65 6e 0a 20  ot have gotten. 
12a90 20 2a 2a 20 74 68 69 73 20 66 61 72 20 2a 2f 0a   ** this far */.
12aa0 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26    if( pRet==0 &&
12ab0 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 2d 3e   ALWAYS(iCol<p->
12ac0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
12ad0 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  {.    pRet = sql
12ae0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
12af0 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
12b00 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
12b10 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
12b20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pRet;.}../*.** T
12b30 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
12b40 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
12b50 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
12b60 65 72 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  er is a compound
12b70 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20   SELECT.** with 
12b80 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
12b90 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  se. This functio
12ba0 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20  n allocates and 
12bb0 72 65 74 75 72 6e 73 20 61 20 4b 65 79 49 6e 66  returns a KeyInf
12bc0 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 73  o.** structure s
12bd0 75 69 74 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c  uitable for impl
12be0 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44  ementing the ORD
12bf0 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  ER BY..**.** Spa
12c00 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
12c10 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
12c20 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
12c30 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61  m malloc. The ca
12c40 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
12c50 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
12c60 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68   for ensuring th
12c70 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72  at this structur
12c80 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a  e is eventually.
12c90 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61  ** freed..*/.sta
12ca0 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c  tic KeyInfo *mul
12cb0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
12cc0 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  eyInfo(Parse *pP
12cd0 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
12ce0 20 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20 20   int nExtra){.  
12cf0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
12d00 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
12d10 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  ;.  int nOrderBy
12d20 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e   = p->pOrderBy->
12d30 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74 65 33  nExpr;.  sqlite3
12d40 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
12d50 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52  b;.  KeyInfo *pR
12d60 65 74 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  et = sqlite3KeyI
12d70 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72  nfoAlloc(db, nOr
12d80 64 65 72 42 79 2b 6e 45 78 74 72 61 2c 20 31 29  derBy+nExtra, 1)
12d90 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a  ;.  if( pRet ){.
12da0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
12db0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
12dc0 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
12dd0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
12de0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
12df0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20  OrderBy->a[i];. 
12e00 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d       Expr *pTerm
12e10 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
12e20 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
12e30 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66  pColl;..      if
12e40 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26  ( pTerm->flags &
12e50 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20   EP_Collate ){. 
12e60 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
12e70 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
12e80 71 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 29  q(pParse, pTerm)
12e90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12ea0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d         pColl = m
12eb0 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
12ec0 71 28 70 50 61 72 73 65 2c 20 70 2c 20 70 49 74  q(pParse, p, pIt
12ed0 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
12ee0 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Col-1);.        
12ef0 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70  if( pColl==0 ) p
12f00 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
12f10 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f  Coll;.        pO
12f20 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
12f30 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73  pr =.          s
12f40 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c  qlite3ExprAddCol
12f50 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72 73  lateString(pPars
12f60 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d  e, pTerm, pColl-
12f70 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
12f80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
12f90 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
12fa0 72 69 74 65 61 62 6c 65 28 70 52 65 74 29 20 29  riteable(pRet) )
12fb0 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 43  ;.      pRet->aC
12fc0 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  oll[i] = pColl;.
12fd0 20 20 20 20 20 20 70 52 65 74 2d 3e 61 53 6f 72        pRet->aSor
12fe0 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64  tOrder[i] = pOrd
12ff0 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
13000 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
13010 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
13020 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
13030 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
13040 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
13050 6e 65 72 61 74 65 73 20 56 44 42 45 20 63 6f 64  nerates VDBE cod
13060 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  e to compute the
13070 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 49   content of a WI
13080 54 48 20 52 45 43 55 52 53 49 56 45 0a 2a 2a 20  TH RECURSIVE.** 
13090 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72  query of the for
130a0 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75  m:.**.**   <recu
130b0 72 73 69 76 65 2d 74 61 62 6c 65 3e 20 41 53 20  rsive-table> AS 
130c0 28 3c 73 65 74 75 70 2d 71 75 65 72 79 3e 20 55  (<setup-query> U
130d0 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75  NION [ALL] <recu
130e0 72 73 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a  rsive-query>).**
130f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13100 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
13110 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
13120 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
13130 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___/.**         
13140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13150 20 20 70 2d 3e 70 50 72 69 6f 72 20 20 20 20 20    p->pPrior     
13160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13170 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72   p.**.**.** Ther
13180 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65  e is exactly one
13190 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
131a0 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  e recursive-tabl
131b0 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
131c0 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72  ause.** of recur
131d0 73 69 76 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b  sive-query, mark
131e0 65 64 20 77 69 74 68 20 74 68 65 20 53 72 63 4c  ed with the SrcL
131f0 69 73 74 2d 3e 61 5b 5d 2e 66 67 2e 69 73 52 65  ist->a[].fg.isRe
13200 63 75 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a  cursive flag..**
13210 0a 2a 2a 20 54 68 65 20 73 65 74 75 70 2d 71 75  .** The setup-qu
13220 65 72 79 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f  ery runs once to
13230 20 67 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 69   generate an ini
13240 74 69 61 6c 20 73 65 74 20 6f 66 20 72 6f 77 73  tial set of rows
13250 20 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f   that go.** into
13260 20 61 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20   a Queue table. 
13270 20 52 6f 77 73 20 61 72 65 20 65 78 74 72 61 63   Rows are extrac
13280 74 65 64 20 66 72 6f 6d 20 74 68 65 20 51 75 65  ted from the Que
13290 75 65 20 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a  ue table one by.
132a0 2a 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f  ** one.  Each ro
132b0 77 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  w extracted from
132c0 20 51 75 65 75 65 20 69 73 20 6f 75 74 70 75 74   Queue is output
132d0 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 6e   to pDest.  Then
132e0 20 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65   the single.** e
132f0 78 74 72 61 63 74 65 64 20 72 6f 77 20 28 6e 6f  xtracted row (no
13300 77 20 69 6e 20 74 68 65 20 69 43 75 72 72 65 6e  w in the iCurren
13310 74 20 74 61 62 6c 65 29 20 62 65 63 6f 6d 65 73  t table) becomes
13320 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
13330 74 68 65 0a 2a 2a 20 72 65 63 75 72 73 69 76 65  the.** recursive
13340 2d 74 61 62 6c 65 20 66 6f 72 20 61 20 72 65 63  -table for a rec
13350 75 72 73 69 76 65 2d 71 75 65 72 79 20 72 75 6e  ursive-query run
13360 2e 20 20 54 68 65 20 6f 75 74 70 75 74 20 6f 66  .  The output of
13370 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 71   the recursive-q
13380 75 65 72 79 0a 2a 2a 20 69 73 20 61 64 64 65 64  uery.** is added
13390 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 51   back into the Q
133a0 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ueue table.  The
133b0 6e 20 61 6e 6f 74 68 65 72 20 72 6f 77 20 69 73  n another row is
133c0 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
133d0 51 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65  Queue.** and the
133e0 20 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69   iteration conti
133f0 6e 75 65 73 20 75 6e 74 69 6c 20 74 68 65 20 51  nues until the Q
13400 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 65 6d  ueue table is em
13410 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pty..**.** If th
13420 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
13430 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49   operator is UNI
13440 4f 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69  ON then no dupli
13450 63 61 74 65 20 72 6f 77 73 20 61 72 65 20 65 76  cate rows are ev
13460 65 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69  er.** inserted i
13470 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61  nto the Queue ta
13480 62 6c 65 2e 20 20 54 68 65 20 69 44 69 73 74 69  ble.  The iDisti
13490 6e 63 74 20 74 61 62 6c 65 20 6b 65 65 70 73 20  nct table keeps 
134a0 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f  a copy of all ro
134b0 77 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20  ws.** that have 
134c0 65 76 65 72 20 62 65 65 6e 20 69 6e 73 65 72 74  ever been insert
134d0 65 64 20 69 6e 74 6f 20 51 75 65 75 65 20 61 6e  ed into Queue an
134e0 64 20 63 61 75 73 65 73 20 64 75 70 6c 69 63 61  d causes duplica
134f0 74 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73  tes to be.** dis
13500 63 61 72 64 65 64 2e 20 20 49 66 20 74 68 65 20  carded.  If the 
13510 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
13520 4e 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c  N ALL, then dupl
13530 69 63 61 74 65 73 20 61 72 65 20 61 6c 6c 6f 77  icates are allow
13540 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  ed..** .** If th
13550 65 20 71 75 65 72 79 20 68 61 73 20 61 6e 20 4f  e query has an O
13560 52 44 45 52 20 42 59 2c 20 74 68 65 6e 20 65 6e  RDER BY, then en
13570 74 72 69 65 73 20 69 6e 20 74 68 65 20 51 75 65  tries in the Que
13580 75 65 20 74 61 62 6c 65 20 61 72 65 20 6b 65 70  ue table are kep
13590 74 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59  t in.** ORDER BY
135a0 20 6f 72 64 65 72 20 61 6e 64 20 74 68 65 20 66   order and the f
135b0 69 72 73 74 20 65 6e 74 72 79 20 69 73 20 65 78  irst entry is ex
135c0 74 72 61 63 74 65 64 20 66 6f 72 20 65 61 63 68  tracted for each
135d0 20 63 79 63 6c 65 2e 20 20 57 69 74 68 6f 75 74   cycle.  Without
135e0 0a 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42 59 2c  .** an ORDER BY,
135f0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
13600 20 69 73 20 6a 75 73 74 20 61 20 46 49 46 4f 2e   is just a FIFO.
13610 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49  .**.** If a LIMI
13620 54 20 63 6c 61 75 73 65 20 69 73 20 70 72 6f 76  T clause is prov
13630 69 64 65 64 2c 20 74 68 65 6e 20 74 68 65 20 69  ided, then the i
13640 74 65 72 61 74 69 6f 6e 20 73 74 6f 70 73 20 61  teration stops a
13650 66 74 65 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a  fter LIMIT rows.
13660 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 6f 75 74  ** have been out
13670 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 41  put to pDest.  A
13680 20 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d   LIMIT of zero m
13690 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 6e  eans to output n
136a0 6f 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20  o rows and a.** 
136b0 6e 65 67 61 74 69 76 65 20 4c 49 4d 49 54 20 6d  negative LIMIT m
136c0 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 61  eans to output a
136d0 6c 6c 20 72 6f 77 73 2e 20 20 49 66 20 74 68 65  ll rows.  If the
136e0 72 65 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46  re is also an OF
136f0 46 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77  FSET clause.** w
13700 69 74 68 20 61 20 70 6f 73 69 74 69 76 65 20 76  ith a positive v
13710 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 66  alue, then the f
13720 69 72 73 74 20 4f 46 46 53 45 54 20 6f 75 74 70  irst OFFSET outp
13730 75 74 73 20 61 72 65 20 64 69 73 63 61 72 64 65  uts are discarde
13740 64 20 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e  d rather.** than
13750 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 70   being sent to p
13760 44 65 73 74 2e 20 20 54 68 65 20 4c 49 4d 49 54  Dest.  The LIMIT
13770 20 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20   count does not 
13780 62 65 67 69 6e 20 75 6e 74 69 6c 20 61 66 74 65  begin until afte
13790 72 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73  r OFFSET.** rows
137a0 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70   have been skipp
137b0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
137c0 69 64 20 67 65 6e 65 72 61 74 65 57 69 74 68 52  id generateWithR
137d0 65 63 75 72 73 69 76 65 51 75 65 72 79 28 0a 20  ecursiveQuery(. 
137e0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
137f0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
13800 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
13810 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
13820 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 75       /* The recu
13830 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 6f 20  rsive SELECT to 
13840 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
13850 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
13860 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
13870 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
13880 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63  ults */.){.  Src
13890 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e  List *pSrc = p->
138a0 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
138b0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
138c0 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 71   the recursive q
138d0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  uery */.  int nC
138e0 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
138f0 6e 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65  nExpr;  /* Numbe
13900 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
13910 74 68 65 20 72 65 63 75 72 73 69 76 65 20 74 61  the recursive ta
13920 62 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ble */.  Vdbe *v
13930 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
13940 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72  ;      /* The pr
13950 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
13960 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
13970 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
13980 2a 70 53 65 74 75 70 20 3d 20 70 2d 3e 70 50 72  *pSetup = p->pPr
13990 69 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 73 65  ior;   /* The se
139a0 74 75 70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  tup query */.  i
139b0 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
139d0 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  Top of the loop 
139e0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
139f0 74 2c 20 61 64 64 72 42 72 65 61 6b 3b 20 20 20  t, addrBreak;   
13a00 20 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61     /* CONTINUE a
13a10 6e 64 20 42 52 45 41 4b 20 61 64 64 72 65 73 73  nd BREAK address
13a20 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  es */.  int iCur
13a30 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  rent = 0;       
13a40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43 75 72        /* The Cur
13a50 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
13a60 69 6e 74 20 72 65 67 43 75 72 72 65 6e 74 3b 20  int regCurrent; 
13a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13a80 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
13a90 67 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  g Current table 
13aa0 2a 2f 0a 20 20 69 6e 74 20 69 51 75 65 75 65 3b  */.  int iQueue;
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ac0 20 20 20 2f 2a 20 54 68 65 20 51 75 65 75 65 20     /* The Queue 
13ad0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
13ae0 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 20 20 20  Distinct = 0;   
13af0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 65           /* To e
13b00 6e 73 75 72 65 20 75 6e 69 71 75 65 20 72 65 73  nsure unique res
13b10 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f  ults if UNION */
13b20 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 53  .  int eDest = S
13b30 52 54 5f 46 69 66 6f 3b 20 20 20 20 20 20 20 20  RT_Fifo;        
13b40 20 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69 74 65   /* How to write
13b50 20 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20 53   to Queue */.  S
13b60 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 51 75  electDest destQu
13b70 65 75 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eue;         /* 
13b80 53 65 6c 65 63 74 44 65 73 74 20 74 61 72 67 65  SelectDest targe
13b90 74 74 69 6e 67 20 74 68 65 20 51 75 65 75 65 20  tting the Queue 
13ba0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
13bb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
13bd0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
13be0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
13c00 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
13c10 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
13c20 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  By;           /*
13c30 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
13c40 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
13c50 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  pLimit;         
13c60 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64          /* Saved
13c70 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
13c80 54 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  T */.  int regLi
13c90 6d 69 74 2c 20 72 65 67 4f 66 66 73 65 74 3b 20  mit, regOffset; 
13ca0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
13cb0 73 20 75 73 65 64 20 62 79 20 4c 49 4d 49 54 20  s used by LIMIT 
13cc0 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 20  and OFFSET */.. 
13cd0 20 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74 68 6f   /* Obtain autho
13ce0 72 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61  rization to do a
13cf0 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79   recursive query
13d00 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
13d10 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
13d20 65 2c 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53  e, SQLITE_RECURS
13d30 49 56 45 2c 20 30 2c 20 30 2c 20 30 29 20 29 20  IVE, 0, 0, 0) ) 
13d40 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72  return;..  /* Pr
13d50 6f 63 65 73 73 20 74 68 65 20 4c 49 4d 49 54 20  ocess the LIMIT 
13d60 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73  and OFFSET claus
13d70 65 73 2c 20 69 66 20 74 68 65 79 20 65 78 69 73  es, if they exis
13d80 74 20 2a 2f 0a 20 20 61 64 64 72 42 72 65 61 6b  t */.  addrBreak
13d90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
13da0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d  keLabel(v);.  p-
13db0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 33 32  >nSelectRow = 32
13dc0 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e  0;  /* 4 billion
13dd0 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6d 70 75   rows */.  compu
13de0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
13df0 28 70 50 61 72 73 65 2c 20 70 2c 20 61 64 64 72  (pParse, p, addr
13e00 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74  Break);.  pLimit
13e10 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
13e20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  regLimit = p->iL
13e30 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66 66 73 65  imit;.  regOffse
13e40 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
13e50 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
13e60 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70  .  p->iLimit = p
13e70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
13e80 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
13e90 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c  OrderBy;..  /* L
13ea0 6f 63 61 74 65 20 74 68 65 20 63 75 72 73 6f 72  ocate the cursor
13eb0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43   number of the C
13ec0 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
13ed0 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59    for(i=0; ALWAY
13ee0 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b  S(i<pSrc->nSrc);
13ef0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
13f00 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73 52  Src->a[i].fg.isR
13f10 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
13f20 20 20 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72    iCurrent = pSr
13f30 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b  c->a[i].iCursor;
13f40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13f50 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
13f60 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e  locate cursors n
13f70 75 6d 62 65 72 73 20 66 6f 72 20 51 75 65 75 65  umbers for Queue
13f80 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20   and Distinct.  
13f90 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  The cursor numbe
13fa0 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44  r for.  ** the D
13fb0 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75  istinct table mu
13fc0 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e  st be exactly on
13fd0 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 51  e greater than Q
13fe0 75 65 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20  ueue in order.  
13ff0 2a 2a 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44  ** for the SRT_D
14000 69 73 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f  istFifo and SRT_
14010 44 69 73 74 51 75 65 75 65 20 64 65 73 74 69 6e  DistQueue destin
14020 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20  ations to work. 
14030 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50  */.  iQueue = pP
14040 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
14050 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  if( p->op==TK_UN
14060 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74  ION ){.    eDest
14070 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52   = pOrderBy ? SR
14080 54 5f 44 69 73 74 51 75 65 75 65 20 3a 20 53 52  T_DistQueue : SR
14090 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20  T_DistFifo;.    
140a0 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
140b0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65  se->nTab++;.  }e
140c0 6c 73 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d  lse{.    eDest =
140d0 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f   pOrderBy ? SRT_
140e0 51 75 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f  Queue : SRT_Fifo
140f0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
14100 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
14110 65 73 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c  estQueue, eDest,
14120 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20   iQueue);..  /* 
14130 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73  Allocate cursors
14140 20 66 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75   for Current, Qu
14150 65 75 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63  eue, and Distinc
14160 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65  t. */.  regCurre
14170 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nt = ++pParse->n
14180 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Mem;.  sqlite3Vd
14190 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
141a0 70 65 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72  penPseudo, iCurr
141b0 65 6e 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c  ent, regCurrent,
141c0 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f   nCol);.  if( pO
141d0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
141e0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
141f0 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  = multiSelectOrd
14200 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72  erByKeyInfo(pPar
14210 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73  se, p, 1);.    s
14220 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
14230 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
14240 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f  eral, iQueue, pO
14250 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c  rderBy->nExpr+2,
14260 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
14270 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
14280 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
14290 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74  YINFO);.    dest
142a0 51 75 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d  Queue.pOrderBy =
142b0 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c   pOrderBy;.  }el
142c0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
142d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
142e0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
142f0 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Queue, nCol);.  
14300 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  }.  VdbeComment(
14310 28 76 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65  (v, "Queue table
14320 22 29 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74  "));.  if( iDist
14330 69 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61  inct ){.    p->a
14340 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
14350 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14360 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
14370 65 6d 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63  emeral, iDistinc
14380 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65  t, 0);.    p->se
14390 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
143a0 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a  sEphemeral;.  }.
143b0 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65  .  /* Detach the
143c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
143d0 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75   from the compou
143e0 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70  nd SELECT */.  p
143f0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
14400 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20  .  /* Store the 
14410 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
14420 65 74 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75  etup-query in Qu
14430 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70  eue. */.  pSetup
14440 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 45  ->pNext = 0;.  E
14450 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
14460 28 70 50 61 72 73 65 2c 20 31 2c 20 22 53 45 54  (pParse, 1, "SET
14470 55 50 22 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  UP"));.  rc = sq
14480 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
14490 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73  se, pSetup, &des
144a0 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75  tQueue);.  pSetu
144b0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  p->pNext = p;.  
144c0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
144d0 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71  d_of_recursive_q
144e0 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  uery;..  /* Find
144f0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
14500 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f   the Queue and o
14510 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a  utput that row *
14520 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71  /.  addrTop = sq
14530 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14540 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51  v, OP_Rewind, iQ
14550 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29  ueue, addrBreak)
14560 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
14570 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65  );..  /* Transfe
14580 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  r the next row i
14590 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20  n Queue over to 
145a0 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  Current */.  sql
145b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
145c0 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43  , OP_NullRow, iC
145d0 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72  urrent); /* To r
145e0 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68  eset column cach
145f0 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65  e */.  if( pOrde
14600 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
14610 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
14620 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75  OP_Column, iQueu
14630 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  e, pOrderBy->nEx
14640 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74  pr+1, regCurrent
14650 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
14660 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14670 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
14680 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72 72   iQueue, regCurr
14690 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ent);.  }.  sqli
146a0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
146b0 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65   OP_Delete, iQue
146c0 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  ue);..  /* Outpu
146d0 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77  t the single row
146e0 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20   in Current */. 
146f0 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69   addrCont = sqli
14700 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14710 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65  (v);.  codeOffse
14720 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20  t(v, regOffset, 
14730 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c  addrCont);.  sel
14740 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
14750 72 73 65 2c 20 70 2c 20 69 43 75 72 72 65 6e 74  rse, p, iCurrent
14760 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44  ,.      0, 0, pD
14770 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61  est, addrCont, a
14780 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28  ddrBreak);.  if(
14790 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20   regLimit ){.   
147a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
147b0 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
147c0 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c  pZero, regLimit,
147d0 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
147e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
147f0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
14800 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
14810 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20  v, addrCont);.. 
14820 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20   /* Execute the 
14830 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54  recursive SELECT
14840 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67   taking the sing
14850 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
14860 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61  t as.  ** the va
14870 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75  lue for the recu
14880 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f  rsive-table. Sto
14890 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
148a0 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a  n the Queue..  *
148b0 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
148c0 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
148d0 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  te ){.    sqlite
148e0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
148f0 2c 20 22 72 65 63 75 72 73 69 76 65 20 61 67 67  , "recursive agg
14900 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 6e  regate queries n
14910 6f 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a  ot supported");.
14920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
14930 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
14940 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
14950 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 52 45  ((pParse, 1, "RE
14960 43 55 52 53 49 56 45 20 53 54 45 50 22 29 29 3b  CURSIVE STEP"));
14970 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
14980 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
14990 65 73 74 51 75 65 75 65 29 3b 0a 20 20 20 20 61  estQueue);.    a
149a0 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72  ssert( p->pPrior
149b0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50  ==0 );.    p->pP
149c0 72 69 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 20  rior = pSetup;. 
149d0 20 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75   }..  /* Keep ru
149e0 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75  nning the loop u
149f0 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 69  ntil the Queue i
14a00 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c  s empty */.  sql
14a10 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
14a20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
14a30 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
14a40 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
14a50 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72  );..end_of_recur
14a60 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71  sive_query:.  sq
14a70 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
14a80 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
14a90 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
14aa0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
14ab0 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69  rderBy;.  p->pLi
14ac0 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
14ad0 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66  return;.}.#endif
14ae0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
14af0 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61  CTE */../* Forwa
14b00 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  rd references */
14b10 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
14b20 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a  iSelectOrderBy(.
14b30 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
14b40 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
14b50 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
14b60 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
14b70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
14b80 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
14b90 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
14ba0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
14bb0 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
14bc0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
14bd0 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b  ry results */.);
14be0 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20 74  ../*.** Handle t
14bf0 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
14c00 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65  of a compound-se
14c10 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e  lect that origin
14c20 61 74 65 73 20 66 72 6f 6d 20 61 0a 2a 2a 20 56  ates from a.** V
14c30 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 20 20 42  ALUES clause.  B
14c40 79 20 68 61 6e 64 6c 69 6e 67 20 74 68 69 73 20  y handling this 
14c50 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  as a special cas
14c60 65 2c 20 77 65 20 61 76 6f 69 64 20 64 65 65 70  e, we avoid deep
14c70 0a 2a 2a 20 72 65 63 75 72 73 69 6f 6e 2c 20 61  .** recursion, a
14c80 6e 64 20 74 68 75 73 20 64 6f 20 6e 6f 74 20 6e  nd thus do not n
14c90 65 65 64 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  eed to enforce t
14ca0 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  he SQLITE_LIMIT_
14cb0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
14cc0 2a 2a 20 6f 6e 20 61 20 56 41 4c 55 45 53 20 63  ** on a VALUES c
14cd0 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63  lause..**.** Bec
14ce0 61 75 73 65 20 74 68 65 20 53 65 6c 65 63 74 20  ause the Select 
14cf0 6f 62 6a 65 63 74 20 6f 72 69 67 69 6e 61 74 65  object originate
14d00 73 20 66 72 6f 6d 20 61 20 56 41 4c 55 45 53 20  s from a VALUES 
14d10 63 6c 61 75 73 65 3a 0a 2a 2a 20 20 20 28 31 29  clause:.**   (1)
14d20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 4c 49 4d   There is no LIM
14d30 49 54 20 6f 72 20 4f 46 46 53 45 54 20 6f 72 20  IT or OFFSET or 
14d40 65 6c 73 65 20 74 68 65 72 65 20 69 73 20 61 20  else there is a 
14d50 4c 49 4d 49 54 20 6f 66 20 65 78 61 63 74 6c 79  LIMIT of exactly
14d60 20 31 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20   1.**   (2) All 
14d70 74 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20  terms are UNION 
14d80 41 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65  ALL.**   (3) The
14d90 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
14da0 59 20 63 6c 61 75 73 65 0a 2a 2a 0a 2a 2a 20 54  Y clause.**.** T
14db0 68 65 20 22 4c 49 4d 49 54 20 6f 66 20 65 78 61  he "LIMIT of exa
14dc0 63 74 6c 79 20 31 22 20 63 61 73 65 20 6f 66 20  ctly 1" case of 
14dd0 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 63 6f  condition (1) co
14de0 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 61  mes about when a
14df0 20 56 41 4c 55 45 53 0a 2a 2a 20 63 6c 61 75 73   VALUES.** claus
14e00 65 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  e occurs within 
14e10 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f  scalar expressio
14e20 6e 20 28 65 78 3a 20 22 53 45 4c 45 43 54 20 28  n (ex: "SELECT (
14e30 56 41 4c 55 45 53 28 31 29 2c 28 32 29 2c 28 33  VALUES(1),(2),(3
14e40 29 29 22 29 2e 0a 2a 2a 20 54 68 65 20 73 71 6c  ))")..** The sql
14e50 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
14e60 74 20 77 69 6c 6c 20 68 61 76 65 20 61 64 64 65  t will have adde
14e70 64 20 74 68 65 20 4c 49 4d 49 54 20 31 20 63 6c  d the LIMIT 1 cl
14e80 61 75 73 65 20 69 6e 20 74 68 74 20 63 61 73 65  ause in tht case
14e90 2e 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 6c  ..** Since the l
14ea0 69 6d 69 74 20 69 73 20 65 78 61 63 74 6c 79 20  imit is exactly 
14eb0 31 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  1, we only need 
14ec0 74 6f 20 65 76 61 6c 75 74 65 73 20 74 68 65 20  to evalutes the 
14ed0 6c 65 66 74 2d 6d 6f 73 74 20 56 41 4c 55 45 53  left-most VALUES
14ee0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14ef0 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65  multiSelectValue
14f00 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
14f10 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
14f20 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
14f30 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
14f40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
14f50 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
14f60 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
14f70 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
14f80 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
14f90 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
14fa0 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
14fb0 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 20 3d  .){.  int nRow =
14fc0 20 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   1;.  int rc = 0
14fd0 3b 0a 20 20 69 6e 74 20 62 53 68 6f 77 41 6c 6c  ;.  int bShowAll
14fe0 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 3b   = p->pLimit==0;
14ff0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65  .  assert( p->se
15000 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74  lFlags & SF_Mult
15010 69 56 61 6c 75 65 20 29 3b 0a 20 20 64 6f 7b 0a  iValue );.  do{.
15020 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73      assert( p->s
15030 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c  elFlags & SF_Val
15040 75 65 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ues );.    asser
15050 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  t( p->op==TK_ALL
15060 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53   || (p->op==TK_S
15070 45 4c 45 43 54 20 26 26 20 70 2d 3e 70 50 72 69  ELECT && p->pPri
15080 6f 72 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73  or==0) );.    as
15090 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d  sert( p->pNext==
150a0 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  0 || p->pEList->
150b0 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d  nExpr==p->pNext-
150c0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
150d0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72  ;.    if( p->pPr
150e0 69 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ior==0 ) break;.
150f0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
15100 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20  Prior->pNext==p 
15110 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50  );.    p = p->pP
15120 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 20 2b  rior;.    nRow +
15130 3d 20 62 53 68 6f 77 41 6c 6c 3b 0a 20 20 7d 77  = bShowAll;.  }w
15140 68 69 6c 65 28 31 29 3b 0a 20 20 45 78 70 6c 61  hile(1);.  Expla
15150 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
15160 72 73 65 2c 20 30 2c 20 22 53 43 41 4e 20 25 64  rse, 0, "SCAN %d
15170 20 43 4f 4e 53 54 41 4e 54 20 52 4f 57 25 73 22   CONSTANT ROW%s"
15180 2c 20 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  , nRow,.        
15190 20 20 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77              nRow
151a0 3d 3d 31 20 3f 20 22 22 20 3a 20 22 53 22 29 29  ==1 ? "" : "S"))
151b0 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
151c0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
151d0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d  oop(pParse, p, -
151e0 31 2c 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20  1, 0, 0, pDest, 
151f0 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21  1, 1);.    if( !
15200 62 53 68 6f 77 41 6c 6c 20 29 20 62 72 65 61 6b  bShowAll ) break
15210 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  ;.    p->nSelect
15220 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20  Row = nRow;.    
15230 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
15240 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
15250 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15260 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
15270 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70  o process a comp
15280 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20  ound query form 
15290 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d  from.** two or m
152a0 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65  ore separate que
152b0 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e  ries using UNION
152c0 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43  , UNION ALL, EXC
152d0 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52  EPT, or.** INTER
152e0 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70  SECT.**.** "p" p
152f0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67  oints to the rig
15300 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74  ht-most of the t
15310 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65  wo queries.  the
15320 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a   query on the.**
15330 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69   left is p->pPri
15340 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75  or.  The left qu
15350 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62  ery could also b
15360 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  e a compound que
15370 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63  ry.** in which c
15380 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
15390 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
153a0 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a  recursively. .**
153b0 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
153c0 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  of the total que
153d0 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69  ry are to be wri
153e0 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74  tten into a dest
153f0 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79  ination.** of ty
15400 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61  pe eDest with pa
15410 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a  rameter iParm..*
15420 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20  *.** Example 1: 
15430 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65   Consider a thre
15440 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53  e-way compound S
15450 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
15460 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
15470 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
15480 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20  ELECT b FROM t2 
15490 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46  UNION SELECT c F
154a0 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69  ROM t3.**.** Thi
154b0 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  s statement is p
154c0 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c  arsed up as foll
154d0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ows:.**.**     S
154e0 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
154f0 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20  **      |.**    
15500 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43    `----->  SELEC
15510 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20  T b FROM t2.**  
15520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
15530 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15540 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45    `------>  SELE
15550 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a  CT a FROM t1.**.
15560 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e  ** The arrows in
15570 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f   the diagram abo
15580 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  ve represent the
15590 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70   Select.pPrior p
155a0 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66  ointer..** So if
155b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
155c0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65   called with p e
155d0 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71  qual to the t3 q
155e0 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50  uery, then.** pP
155f0 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65  rior will be the
15600 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f   t2 query.  p->o
15610 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49  p will be TK_UNI
15620 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ON in this case.
15630 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68  .**.** Notice th
15640 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  at because of th
15650 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72  e way SQLite par
15660 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ses compound SEL
15670 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64  ECTs, the.** ind
15680 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20  ividual selects 
15690 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f  always group fro
156a0 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
156b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
156c0 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61  ultiSelect(.  Pa
156d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
156e0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
156f0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
15700 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
15710 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
15720 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
15730 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
15740 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
15750 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
15760 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
15770 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
15780 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15790 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20  K;   /* Success 
157a0 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72  code from a subr
157b0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65  outine */.  Sele
157c0 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
157d0 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
157e0 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
157f0 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
15800 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
15810 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
15820 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
15830 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  VDBE */.  Select
15840 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
15850 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64  /* Alternative d
15860 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ata destination 
15870 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65  */.  Select *pDe
15880 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68  lete = 0;  /* Ch
15890 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65  ain of simple se
158a0 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20  lects to delete 
158b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
158c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
158d0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
158e0 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  n */..  /* Make 
158f0 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
15900 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
15910 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69  IT clause on pri
15920 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c  or SELECTs.  Onl
15930 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20  y.  ** the last 
15940 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c  (right-most) SEL
15950 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65  ECT in the serie
15960 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52  s may have an OR
15970 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e  DER BY or LIMIT.
15980 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
15990 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29  p && p->pPrior )
159a0 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75  ;  /* Calling fu
159b0 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65  nction guarantee
159c0 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20  s this much */. 
159d0 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
159e0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
159f0 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f  sive)==0 || p->o
15a00 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e  p==TK_ALL || p->
15a10 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
15a20 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
15a30 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d  b;.  pPrior = p-
15a40 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20  >pPrior;.  dest 
15a50 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20  = *pDest;.  if( 
15a60 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
15a70 20 7c 7c 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d   || pPrior->pLim
15a80 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
15a90 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15aa0 2c 22 25 73 20 63 6c 61 75 73 65 20 73 68 6f 75  ,"%s clause shou
15ab0 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
15ac0 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
15ad0 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64      pPrior->pOrd
15ae0 65 72 42 79 21 3d 30 20 3f 20 22 4f 52 44 45 52  erBy!=0 ? "ORDER
15af0 20 42 59 22 20 3a 20 22 4c 49 4d 49 54 22 2c 20   BY" : "LIMIT", 
15b00 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
15b10 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
15b20 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
15b30 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
15b40 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
15b50 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
15b60 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
15b70 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61  ;  /* The VDBE a
15b80 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62  lready created b
15b90 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  y calling functi
15ba0 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61  on */..  /* Crea
15bb0 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
15bc0 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
15bd0 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
15be0 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e    */.  if( dest.
15bf0 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
15c00 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
15c10 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
15c20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15c30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
15c40 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e  Ephemeral, dest.
15c50 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69  iSDParm, p->pELi
15c60 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
15c70 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
15c80 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _Table;.  }..  /
15c90 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  * Special handli
15ca0 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  ng for a compoun
15cb0 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72  d-select that or
15cc0 69 67 69 6e 61 74 65 73 20 61 73 20 61 20 56 41  iginates as a VA
15cd0 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a  LUES clause..  *
15ce0 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
15cf0 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61  ags & SF_MultiVa
15d00 6c 75 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lue ){.    rc = 
15d10 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65  multiSelectValue
15d20 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  s(pParse, p, &de
15d30 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  st);.    goto mu
15d40 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
15d50 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
15d60 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
15d70 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
15d80 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
15d90 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
15da0 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
15db0 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
15dc0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
15dd0 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
15de0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 61 73 73  >pEList );.  ass
15df0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ert( p->pEList->
15e00 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70  nExpr==pPrior->p
15e10 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
15e20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15e30 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70  OMIT_CTE.  if( p
15e40 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
15e50 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
15e60 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63   generateWithRec
15e70 75 72 73 69 76 65 51 75 65 72 79 28 70 50 61 72  ursiveQuery(pPar
15e80 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20  se, p, &dest);. 
15e90 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
15ea0 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c   /* Compound SEL
15eb0 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20 61  ECTs that have a
15ec0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
15ed0 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  e are handled se
15ee0 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  parately..  */. 
15ef0 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
15f00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d   ){.    return m
15f10 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
15f20 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  y(pParse, p, pDe
15f30 73 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 23  st);.  }else{..#
15f40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15f50 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 69  IT_EXPLAIN.    i
15f60 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f  f( pPrior->pPrio
15f70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  r==0 ){.      Ex
15f80 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
15f90 70 50 61 72 73 65 2c 20 31 2c 20 22 43 4f 4d 50  pParse, 1, "COMP
15fa0 4f 55 4e 44 20 51 55 45 52 59 22 29 29 3b 0a 20  OUND QUERY"));. 
15fb0 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
15fc0 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
15fd0 2c 20 22 4c 45 46 54 2d 4d 4f 53 54 20 53 55 42  , "LEFT-MOST SUB
15fe0 51 55 45 52 59 22 29 29 3b 0a 20 20 20 20 7d 0a  QUERY"));.    }.
15ff0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 47  #endif..    /* G
16000 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
16010 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
16020 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
16030 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ments..    */.  
16040 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
16050 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b  ){.      case TK
16060 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  _ALL: {.        
16070 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20  int addr = 0;.  
16080 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74        int nLimit
16090 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
160a0 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  ( !pPrior->pLimi
160b0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72  t );.        pPr
160c0 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d  ior->iLimit = p-
160d0 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  >iLimit;.       
160e0 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
160f0 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
16100 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70         pPrior->p
16110 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
16120 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
16130 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
16140 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
16150 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  est);.        p-
16160 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
16170 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
16180 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
16190 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
161a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
161b0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
161c0 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  .        p->iLim
161d0 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69  it = pPrior->iLi
161e0 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  mit;.        p->
161f0 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72  iOffset = pPrior
16200 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
16210 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74     if( p->iLimit
16220 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64   ){.          ad
16230 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
16240 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
16250 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20  ot, p->iLimit); 
16260 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
16270 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
16280 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70  omment((v, "Jump
16290 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20   ahead if LIMIT 
162a0 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20  reached"));.    
162b0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66        if( p->iOf
162c0 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  fset ){.        
162d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
162e0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73  ddOp3(v, OP_Offs
162f0 65 74 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20  etLimit,.       
16300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16310 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74         p->iLimit
16320 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 2c 20  , p->iOffset+1, 
16330 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  p->iOffset);.   
16340 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16350 20 7d 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61   }.        Expla
16360 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
16370 72 73 65 2c 20 31 2c 20 22 55 4e 49 4f 4e 20 41  rse, 1, "UNION A
16380 4c 4c 22 29 29 3b 0a 20 20 20 20 20 20 20 20 72  LL"));.        r
16390 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
163a0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
163b0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  st);.        tes
163c0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
163d0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
163e0 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
163f0 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ior;.        p->
16400 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
16410 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  .        p->nSel
16420 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
16430 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
16440 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
16450 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
16460 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72        if( pPrior
16470 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20  ->pLimit.       
16480 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
16490 49 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72  IsInteger(pPrior
164a0 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c  ->pLimit->pLeft,
164b0 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20   &nLimit).      
164c0 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26     && nLimit>0 &
164d0 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  & p->nSelectRow 
164e0 3e 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  > sqlite3LogEst(
164f0 28 75 36 34 29 6e 4c 69 6d 69 74 29 20 0a 20 20  (u64)nLimit) .  
16500 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
16510 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
16520 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
16530 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 3b 0a 20  ((u64)nLimit);. 
16540 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16550 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20   if( addr ){.   
16560 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16570 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
16580 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  dr);.        }. 
16590 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
165a0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
165b0 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20   TK_EXCEPT:.    
165c0 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
165d0 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 75   {.        int u
165e0 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43  nionTab;    /* C
165f0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
16600 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 68  the temp table h
16610 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f  olding result */
16620 0a 20 20 20 20 20 20 20 20 75 38 20 6f 70 20 3d  .        u8 op =
16630 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65   0;       /* One
16640 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
16650 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
16660 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
16670 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b      int priorOp;
16680 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f       /* The SRT_
16690 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70   operation to ap
166a0 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c  ply to prior sel
166b0 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ects */.        
166c0 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20  Expr *pLimit;   
166d0 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
166e0 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 20 2a   of p->nLimit  *
166f0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
16700 64 72 3b 0a 20 20 20 20 20 20 20 20 53 65 6c 65  dr;.        Sele
16710 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74  ctDest uniondest
16720 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 74 65 73  ;.  .        tes
16730 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
16740 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20  _EXCEPT );.     
16750 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
16760 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
16770 20 20 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20          priorOp 
16780 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
16790 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
167a0 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est==priorOp ){.
167b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
167c0 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70  can reuse a temp
167d0 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65  orary table gene
167e0 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43  rated by a SELEC
167f0 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20  T to our.       
16800 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
16810 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
16820 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
16830 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20  Limit==0 );     
16840 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20   /* Not allowed 
16850 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d  on leftward elem
16860 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
16870 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73    unionTab = des
16880 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20  t.iSDParm;.     
16890 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
168a0 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e      /* We will n
168b0 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75  eed to create ou
168c0 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20  r own temporary 
168d0 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  table to hold th
168e0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  e.          ** i
168f0 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
16900 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  lts..          *
16910 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 6f  /.          unio
16920 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nTab = pParse->n
16930 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Tab++;.         
16940 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
16950 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
16960 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
16970 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16980 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
16990 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  l, unionTab, 0);
169a0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
169b0 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
169c0 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
169d0 20 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72           p->addr
169e0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
169f0 64 72 3b 0a 20 20 20 20 20 20 20 20 20 20 66 69  dr;.          fi
16a00 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
16a10 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
16a20 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
16a30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16a40 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
16a50 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
16a60 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
16a70 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
16a80 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20  to our left.    
16a90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
16aa0 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
16ab0 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20  pOrderBy );.    
16ac0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
16ad0 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e  tDestInit(&union
16ae0 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75  dest, priorOp, u
16af0 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20  nionTab);.      
16b00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
16b10 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
16b20 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  ior, &uniondest)
16b30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16b40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
16b50 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
16b60 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
16b70 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64   .        /* Cod
16b80 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
16b90 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
16ba0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
16bb0 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
16bc0 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20  EXCEPT ){.      
16bd0 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63      op = SRT_Exc
16be0 65 70 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ept;.        }el
16bf0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
16c00 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
16c10 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20  UNION );.       
16c20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f     op = SRT_Unio
16c30 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
16c40 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
16c50 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 6d   0;.        pLim
16c60 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
16c70 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69          p->pLimi
16c80 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75  t = 0;.        u
16c90 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d  niondest.eDest =
16ca0 20 6f 70 3b 0a 20 20 20 20 20 20 20 20 45 78 70   op;.        Exp
16cb0 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
16cc0 50 61 72 73 65 2c 20 31 2c 20 22 25 73 20 55 53  Parse, 1, "%s US
16cd0 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 22  ING TEMP B-TREE"
16ce0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16cf0 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 65              sele
16d00 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
16d10 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
16d20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
16d30 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64  arse, p, &uniond
16d40 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65  est);.        te
16d50 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
16d60 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
16d70 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65   /* Query flatte
16d80 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53  ning in sqlite3S
16d90 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65  elect() might re
16da0 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79  fill p->pOrderBy
16db0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65 20  ..        ** Be 
16dc0 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70  sure to delete p
16dd0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72  ->pOrderBy, ther
16de0 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20  efore, to avoid 
16df0 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a  a memory leak. *
16e00 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
16e10 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
16e20 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
16e30 3b 0a 20 20 20 20 20 20 20 20 70 44 65 6c 65 74  ;.        pDelet
16e40 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
16e50 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
16e60 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
16e70 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
16e80 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
16e90 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
16ea0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
16eb0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
16ec0 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d  ite3LogEstAdd(p-
16ed0 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72  >nSelectRow, pPr
16ee0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29  ior->nSelectRow)
16ef0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16f00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
16f10 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
16f20 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  mit);.        p-
16f30 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
16f40 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69  ;.        p->iLi
16f50 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
16f60 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
16f70 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  .  .        /* C
16f80 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20  onvert the data 
16f90 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
16fa0 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74   table into what
16fb0 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20  ever form.      
16fc0 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20    ** it is that 
16fd0 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65  we currently nee
16fe0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
16ff0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e        assert( un
17000 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44  ionTab==dest.iSD
17010 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65  Parm || dest.eDe
17020 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20  st!=priorOp );. 
17030 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e         if( dest.
17040 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29  eDest!=priorOp )
17050 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
17060 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
17070 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 20  Start;.         
17080 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
17090 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  st );.          
170a0 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
170b0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
170c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e  ;.          iCon
170d0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
170e0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
170f0 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69         computeLi
17100 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
17110 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
17120 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17130 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17140 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e  OP_Rewind, union
17150 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  Tab, iBreak); Vd
17160 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
17170 20 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20           iStart 
17180 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
17190 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
171a0 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e         selectInn
171b0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
171c0 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20  , unionTab,.    
171d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171e0 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73        0, 0, &des
171f0 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
17200 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
17210 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
17220 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
17230 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17240 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17250 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62  P_Next, unionTab
17260 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43  , iStart); VdbeC
17270 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
17280 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17290 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
172a0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
172b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
172c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
172d0 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
172e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
172f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
17300 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  }.      default:
17310 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
17320 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20  TK_INTERSECT ); 
17330 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61  {.        int ta
17340 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
17350 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
17360 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
17370 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
17380 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  t;.        int a
17390 64 64 72 3b 0a 20 20 20 20 20 20 20 20 53 65 6c  ddr;.        Sel
173a0 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63  ectDest intersec
173b0 74 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 69  tdest;.        i
173c0 6e 74 20 72 31 3b 0a 20 20 0a 20 20 20 20 20 20  nt r1;.  .      
173d0 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69    /* INTERSECT i
173e0 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
173f0 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63   the others sinc
17400 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20  e it requires.  
17410 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d        ** two tem
17420 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
17430 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73  Hence it has its
17440 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69   own case.  Begi
17450 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20  n.        ** by 
17460 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74  allocating the t
17470 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65  ables we will ne
17480 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
17490 20 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50         tab1 = pP
174a0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
174b0 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
174c0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
174d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
174e0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
174f0 20 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d   .        addr =
17500 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17510 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
17520 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29  emeral, tab1, 0)
17530 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
17540 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
17550 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
17560 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
17570 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
17580 0a 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67  .        findRig
17590 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
175a0 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
175b0 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20  hemeral;.       
175c0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
175d0 73 74 20 29 3b 0a 20 20 0a 20 20 20 20 20 20 20  st );.  .       
175e0 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
175f0 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ECTs to our left
17600 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
17610 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20  table "tab1"..  
17620 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
17630 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
17640 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63  stInit(&intersec
17650 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e  tdest, SRT_Union
17660 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 20  , tab1);.       
17670 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
17680 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
17690 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65  or, &intersectde
176a0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  st);.        if(
176b0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
176c0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
176d0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
176e0 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  }.  .        /* 
176f0 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
17700 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d   SELECT into tem
17710 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
17720 62 32 22 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  b2".        */. 
17730 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
17740 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17750 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
17760 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ral, tab2, 0);. 
17770 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17780 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
17790 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
177a0 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
177b0 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[1] = addr;.  
177c0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
177d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4c 69  = 0;.        pLi
177e0 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
177f0 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  .        p->pLim
17800 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
17810 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 53  intersectdest.iS
17820 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20  DParm = tab2;.  
17830 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
17840 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
17850 31 2c 20 22 25 73 20 55 53 49 4e 47 20 54 45 4d  1, "%s USING TEM
17860 50 20 42 2d 54 52 45 45 22 2c 0a 20 20 20 20 20  P B-TREE",.     
17870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17880 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
17890 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20 20 20 20  e(p->op)));.    
178a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
178b0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
178c0 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
178d0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
178e0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
178f0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44  OK );.        pD
17900 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
17910 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50  r;.        p->pP
17920 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
17930 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53         if( p->nS
17940 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d  electRow>pPrior-
17950 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20  >nSelectRow ){. 
17960 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c           p->nSel
17970 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
17980 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
17990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
179a0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
179b0 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
179c0 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  .        p->pLim
179d0 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 0a  it = pLimit;.  .
179e0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
179f0 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65  ate code to take
17a00 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f   the intersectio
17a10 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d  n of the two tem
17a20 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
17a30 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
17a40 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
17a50 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
17a60 3b 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b  ;.        iBreak
17a70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
17a80 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
17a90 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
17aa0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
17ab0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  (v);.        com
17ac0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
17ad0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
17ae0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
17af0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17b00 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74  (v, OP_Rewind, t
17b10 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  ab1, iBreak); Vd
17b20 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
17b30 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
17b40 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
17b50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
17b60 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
17b70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17b80 52 6f 77 44 61 74 61 2c 20 74 61 62 31 2c 20 72  RowData, tab1, r
17b90 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
17ba0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
17bb0 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
17bc0 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31   tab2, iCont, r1
17bd0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 0);.        Vd
17be0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
17bf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
17c00 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
17c10 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
17c20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
17c30 70 28 70 50 61 72 73 65 2c 20 70 2c 20 74 61 62  p(pParse, p, tab
17c40 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
17c50 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
17c60 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
17c70 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
17c80 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
17c90 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
17ca0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17cb0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17cc0 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69  OP_Next, tab1, i
17cd0 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65  Start); VdbeCove
17ce0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
17cf0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
17d00 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
17d10 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
17d20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17d30 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
17d40 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
17d50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17d60 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
17d70 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62  1, 0);.        b
17d80 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
17d90 20 20 7d 0a 20 20 0a 20 20 23 69 66 6e 64 65 66    }.  .  #ifndef
17da0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
17db0 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70 2d 3e  LAIN.    if( p->
17dc0 70 4e 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pNext==0 ){.    
17dd0 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
17de0 61 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  anPop(pParse);. 
17df0 20 20 20 7d 0a 20 20 23 65 6e 64 69 66 0a 20 20     }.  #endif.  
17e00 7d 0a 20 20 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  }.  .  /* Comput
17e10 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
17e20 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20  ences used by . 
17e30 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
17e40 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69  bles needed to i
17e50 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d  mplement the com
17e60 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
17e70 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65  ** Attach the Ke
17e80 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
17e90 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  to all temporary
17ea0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
17eb0 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
17ec0 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69  is run by the ri
17ed0 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  ght-most SELECT 
17ee0 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a  statement only..
17ef0 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
17f00 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65  ements to the le
17f10 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74  ft always skip t
17f20 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72  his part.  The r
17f30 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53  ight-most.  ** S
17f40 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f  ELECT might also
17f50 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20   skip this part 
17f60 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44  if it has no ORD
17f70 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
17f80 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61  .  ** no temp ta
17f90 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65  bles are require
17fa0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
17fb0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
17fc0 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a  sesEphemeral ){.
17fd0 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ff0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
18000 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f  r */.    KeyInfo
18010 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20   *pKeyInfo;     
18020 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
18030 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
18040 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
18050 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  */.    Select *p
18060 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
18070 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
18080 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45  ing through SELE
18090 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  CT statements */
180a0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61  .    CollSeq **a
180b0 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
180c0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
180d0 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e  g through pKeyIn
180e0 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20  fo->aColl[] */. 
180f0 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
18100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18110 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
18120 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
18130 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  set */..    asse
18140 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  rt( p->pNext==0 
18150 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d  );.    nCol = p-
18160 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
18170 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
18180 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
18190 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b  oc(db, nCol, 1);
181a0 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e  .    if( !pKeyIn
181b0 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fo ){.      rc =
181c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
181d0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  PT;.      goto m
181e0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
181f0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
18200 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49  =0, apColl=pKeyI
18210 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43  nfo->aColl; i<nC
18220 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  ol; i++, apColl+
18230 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c  +){.      *apCol
18240 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
18250 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
18260 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
18270 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20  0==*apColl ){.  
18280 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
18290 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
182a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
182b0 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
182c0 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
182d0 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
182e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
182f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
18300 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e  t addr = pLoop->
18310 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b  addrOpenEphm[i];
18320 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
18330 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r<0 ){.         
18340 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e   /* If [0] is un
18350 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73  used then [1] is
18360 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53   also unused.  S
18370 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20  o we can.       
18380 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66     ** always saf
18390 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f  ely abort as soo
183a0 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75  n as the first u
183b0 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f  nused slot is fo
183c0 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
183d0 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
183e0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c  addrOpenEphm[1]<
183f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  0 );.          b
18400 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
18410 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18420 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
18430 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ddr, nCol);.    
18440 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
18450 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
18460 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
18470 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
18480 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  fo),.           
18490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184a0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
184b0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64        pLoop->add
184c0 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d  rOpenEphm[i] = -
184d0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
184e0 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49  .    sqlite3KeyI
184f0 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
18500 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73  o);.  }..multi_s
18510 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65  elect_end:.  pDe
18520 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74  st->iSdst = dest
18530 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d  .iSdst;.  pDest-
18540 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53  >nSdst = dest.nS
18550 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  dst;.  sqlite3Se
18560 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
18570 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72  Delete);.  retur
18580 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
18590 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
185a0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
185b0 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65  ../*.** Error me
185c0 73 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20 74  ssage for when t
185d0 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73  wo or more terms
185e0 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
185f0 65 6c 65 63 74 20 68 61 76 65 20 64 69 66 66 65  elect have diffe
18600 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73  rent.** size res
18610 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69  ult sets..*/.voi
18620 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  d sqlite3SelectW
18630 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f  rongNumTermsErro
18640 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
18650 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
18660 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
18670 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20   SF_Values ){.  
18680 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
18690 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56  g(pParse, "all V
186a0 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65 20  ALUES must have 
186b0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
186c0 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65  of terms");.  }e
186d0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
186e0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
186f0 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
18700 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
18710 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
18720 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
18730 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
18740 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
18750 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
18760 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  p));.  }.}../*.*
18770 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74  * Code an output
18780 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   subroutine for 
18790 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c  a coroutine impl
187a0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a  ementation of a.
187b0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65  ** SELECT statme
187c0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61  nt..**.** The da
187d0 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20  ta to be output 
187e0 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
187f0 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  pIn->iSdst.  The
18800 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e  re are.** pIn->n
18810 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  Sdst columns to 
18820 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73  be output.  pDes
18830 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f  t is where the o
18840 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  utput should.** 
18850 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72  be sent..**.** r
18860 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20  egReturn is the 
18870 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65  number of the re
18880 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
18890 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a  he subroutine.**
188a0 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e   return address.
188b0 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65  .**.** If regPre
188c0 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74  v>0 then it is t
188d0 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
188e0 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68  r in a vector th
188f0 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68  at.** records th
18900 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  e previous outpu
18910 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d  t.  mem[regPrev]
18920 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20   is a flag that 
18930 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74  is false.** if t
18940 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f  here has been no
18950 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
18960 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  .  If regPrev>0 
18970 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20  then code is.** 
18980 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70  generated to sup
18990 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
189a0 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75  .  pKeyInfo is u
189b0 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  sed for comparin
189c0 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a  g.** keys..**.**
189d0 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f   If the LIMIT fo
189e0 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74  und in p->iLimit
189f0 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d   is reached, jum
18a00 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
18a10 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73  .** iBreak..*/.s
18a20 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61  tatic int genera
18a30 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
18a40 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ne(.  Parse *pPa
18a50 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
18a60 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
18a70 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
18a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18a90 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
18aa0 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ement */.  Selec
18ab0 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20  tDest *pIn,     
18ac0 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20     /* Coroutine 
18ad0 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a  supplying data *
18ae0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
18af0 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57  pDest,      /* W
18b00 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65  here to send the
18b10 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72   data */.  int r
18b20 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20  egReturn,       
18b30 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
18b40 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
18b50 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  r */.  int regPr
18b60 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev,            /
18b70 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c  * Previous resul
18b80 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20  t register.  No 
18b90 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20  uniqueness if 0 
18ba0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
18bb0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20  eyInfo,      /* 
18bc0 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69  For comparing wi
18bd0 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  th previous entr
18be0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  y */.  int iBrea
18bf0 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
18c00 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77  * Jump here if w
18c10 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20  e hit the LIMIT 
18c20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
18c30 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
18c40 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
18c50 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
18c60 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
18c70 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
18c80 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  );.  iContinue =
18c90 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
18ca0 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
18cb0 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  Suppress duplica
18cc0 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45  tes for UNION, E
18cd0 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
18ce0 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28  SECT .  */.  if(
18cf0 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20   regPrev ){.    
18d00 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
18d10 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  ;.    addr1 = sq
18d20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
18d30 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
18d40 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72  Prev); VdbeCover
18d50 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72  age(v);.    addr
18d60 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
18d70 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
18d80 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  are, pIn->iSdst,
18d90 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
18da0 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20  >nSdst,.        
18db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18dc0 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
18dd0 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
18de0 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59  KeyInfo), P4_KEY
18df0 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
18e00 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
18e10 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b 32  OP_Jump, addr2+2
18e20 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64 64  , iContinue, add
18e30 72 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72  r2+2); VdbeCover
18e40 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
18e50 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
18e60 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73  v, addr1);.    s
18e70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
18e80 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e  (v, OP_Copy, pIn
18e90 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
18ea0 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31  +1, pIn->nSdst-1
18eb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
18ec0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
18ed0 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72  nteger, 1, regPr
18ee0 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ev);.  }.  if( p
18ef0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
18f00 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
18f10 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65   0;..  /* Suppre
18f20 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  ss the first OFF
18f30 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74  SET entries if t
18f40 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45  here is an OFFSE
18f50 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  T clause.  */.  
18f60 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
18f70 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69  >iOffset, iConti
18f80 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  nue);..  assert(
18f90 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
18fa0 52 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20 61  RT_Exists );.  a
18fb0 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
18fc0 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29  est!=SRT_Table )
18fd0 3b 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73  ;.  switch( pDes
18fe0 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20  t->eDest ){.    
18ff0 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
19000 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
19010 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
19020 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
19030 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
19040 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
19050 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
19060 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
19070 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
19080 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
19090 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
190a0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
190b0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
190c0 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
190d0 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20  Sdst, r1);.     
190e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
190f0 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
19100 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
19110 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  m, r2);.      sq
19120 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
19130 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44  v, OP_Insert, pD
19140 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31  est->iSDParm, r1
19150 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
19160 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
19170 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
19180 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D);.      sqlite
19190 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
191a0 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
191b0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
191c0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
191d0 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
191e0 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
191f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
19200 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
19210 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
19220 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
19230 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
19240 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ..)"..    */.   
19250 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
19260 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
19270 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19280 49 6e 2d 3e 6e 53 64 73 74 3e 31 20 29 3b 0a 20  In->nSdst>1 );. 
19290 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
192a0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
192b0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
192c0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
192d0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
192e0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
192f0 6e 53 64 73 74 2c 20 0a 20 20 20 20 20 20 20 20  nSdst, .        
19300 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66    r1, pDest->zAf
19310 66 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  fSdst, pIn->nSds
19320 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
19330 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
19340 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
19350 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
19360 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
19370 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19380 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
19390 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  sert, pDest->iSD
193a0 50 61 72 6d 2c 20 72 31 2c 0a 20 20 20 20 20 20  Parm, r1,.      
193b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193c0 20 20 20 20 20 70 49 6e 2d 3e 69 53 64 73 74 2c       pIn->iSdst,
193d0 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
193e0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
193f0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
19400 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
19410 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
19420 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
19430 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
19440 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
19450 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
19460 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
19470 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
19480 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
19490 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
194a0 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
194b0 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
194c0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
194d0 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
194e0 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53   assert( pIn->nS
194f0 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72 73 65  dst==1 || pParse
19500 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20 74 65 73  ->nErr>0 );  tes
19510 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73  tcase( pIn->nSds
19520 74 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  t!=1 );.      sq
19530 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
19540 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
19550 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  Sdst, pDest->iSD
19560 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
19570 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
19580 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
19590 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
195a0 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
195b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
195c0 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
195d0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
195e0 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65  Y */..    /* The
195f0 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
19600 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
19610 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20  e of registers. 
19620 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
19630 74 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20  t pDest->iSdst. 
19640 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75   Then the co-rou
19650 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20  tine yields..   
19660 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
19670 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20  _Coroutine: {.  
19680 20 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69      if( pDest->i
19690 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Sdst==0 ){.     
196a0 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20     pDest->iSdst 
196b0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
196c0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  Range(pParse, pI
196d0 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
196e0 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20     pDest->nSdst 
196f0 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20  = pIn->nSdst;.  
19700 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
19710 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
19720 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
19730 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  st, pDest->iSdst
19740 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
19750 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19760 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
19770 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
19780 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rm);.      break
19790 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
197a0 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61  If none of the a
197b0 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72  bove, then the r
197c0 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f  esult destinatio
197d0 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a  n must be.    **
197e0 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68   SRT_Output.  Th
197f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
19800 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ver called with 
19810 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  any other.    **
19820 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68   destination oth
19830 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73  er than the ones
19840 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f   handled above o
19850 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20  r SRT_Output..  
19860 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20    **.    ** For 
19870 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75  SRT_Output, resu
19880 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  lts are stored i
19890 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  n a sequence of 
198a0 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20  registers.  .   
198b0 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f   ** Then the OP_
198c0 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65  ResultRow opcode
198d0 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 75 73   is used to caus
198e0 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
198f0 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72   to.    ** retur
19900 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f  n the next row o
19910 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f  f result..    */
19920 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
19930 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
19940 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
19950 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
19960 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19970 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
19980 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  w, pIn->iSdst, p
19990 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
199a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
199b0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
199c0 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
199d0 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
199e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
199f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a     }.  }..  /* J
19a00 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
19a10 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
19a20 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
19a30 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
19a40 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
19a50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19a60 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70  2(v, OP_DecrJump
19a70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
19a80 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
19a90 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
19aa0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
19ab0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
19ac0 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  urn.  */.  sqlit
19ad0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
19ae0 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29  el(v, iContinue)
19af0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
19b00 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
19b10 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a  rn, regReturn);.
19b20 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
19b30 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61  }../*.** Alterna
19b40 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65  tive compound se
19b50 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61  lect code genera
19b60 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77 68  tor for cases wh
19b70 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  en there.** is a
19b80 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
19b90 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75  e..**.** We assu
19ba0 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  me a query of th
19bb0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
19bc0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65  :.**.**      <se
19bd0 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f  lectA>  <operato
19be0 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f  r>  <selectB>  O
19bf0 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79  RDER BY <orderby
19c00 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65  list>.**.** <ope
19c10 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66  rator> is one of
19c20 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f   UNION ALL, UNIO
19c30 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
19c40 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69 64  TERSECT.  The id
19c50 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65  ea.** is to code
19c60 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20   both <selectA> 
19c70 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69  and <selectB> wi
19c80 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
19c90 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d  clause as.** co-
19ca0 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20  routines.  Then 
19cb0 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69  run the co-routi
19cc0 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20  nes in parallel 
19cd0 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72 65  and merge the re
19ce0 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68  sults.** into th
19cf0 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64  e output.  In ad
19d00 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77  dition to the tw
19d10 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61  o coroutines (ca
19d20 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64  lled selectA and
19d30 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65  .** selectB) the
19d40 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75 74  re are 7 subrout
19d50 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f  ines:.**.**    o
19d60 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65  utA:    Move the
19d70 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73   output of the s
19d80 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65  electA coroutine
19d90 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
19da0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19db0 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
19dc0 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  query..**.**    
19dd0 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68  outB:    Move th
19de0 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
19df0 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e  selectB coroutin
19e00 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
19e10 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
19e20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
19e30 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67   query.  (Only g
19e40 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49  enerated for UNI
19e50 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ON and.**       
19e60 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e        UNION ALL.
19e70 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53    EXCEPT and INS
19e80 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75  ERTSECT never ou
19e90 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a  tput a row that.
19ea0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 61  **             a
19eb0 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42  ppears only in B
19ec0 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42  .).**.**    AltB
19ed0 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
19ee0 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
19ef0 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
19f00 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a  nes and A<B..**.
19f10 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20 43  **    AeqB:    C
19f20 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
19f30 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
19f40 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
19f50 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  d A==B..**.**   
19f60 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64   AgtB:    Called
19f70 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
19f80 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
19f90 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42  routines and A>B
19fa0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a  ..**.**    EofA:
19fb0 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
19fc0 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
19fd0 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a  d from selectA..
19fe0 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20  **.**    EofB:  
19ff0 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61    Called when da
1a000 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
1a010 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a  from selectB..**
1a020 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
1a030 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61  tation of the la
1a040 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f 75  tter five subrou
1a050 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20  tines depend on 
1a060 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61  which .** <opera
1a070 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a  tor> is used:.**
1a080 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
1a090 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20     UNION ALL    
1a0a0 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20       UNION      
1a0b0 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20 20        EXCEPT    
1a0c0 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a        INTERSECT.
1a0d0 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d  **          ----
1a0e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
1a0f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
1a100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
1a110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1a120 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74  **   AltB:   out
1a130 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75  A, nextA      ou
1a140 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
1a150 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
1a160 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20      nextA.**.** 
1a170 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20    AeqB:   outA, 
1a180 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65  nextA         ne
1a190 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20 20  xtA             
1a1a0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f 75  nextA         ou
1a1b0 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20  tA, nextA.**.** 
1a1c0 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20    AgtB:   outB, 
1a1d0 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
1a1e0 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
1a1f0 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 20  nextB           
1a200 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45   nextB.**.**   E
1a210 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78  ofA:   outB, nex
1a220 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65  tB      outB, ne
1a230 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61 6c  xtB          hal
1a240 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61  t             ha
1a250 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a  lt.**.**   EofB:
1a260 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
1a270 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
1a280 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
1a290 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a  A         halt.*
1a2a0 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42  *.** In the AltB
1a2b0 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42  , AeqB, and AgtB
1a2c0 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e   subroutines, an
1a2d0 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77   EOF on A follow
1a2e0 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75  ing nextA.** cau
1a2f0 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  ses an immediate
1a300 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e   jump to EofA an
1a310 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f  d an EOF on B fo
1a320 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61  llowing nextB ca
1a330 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64  uses.** an immed
1a340 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
1a350 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20  B.  Within EofA 
1a360 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f  and EofB, and EO
1a370 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a  F on entry or.**
1a380 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58   following nextX
1a390 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74   causes a jump t
1a3a0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1a3b0 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69   select processi
1a3c0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63  ng..**.** Duplic
1a3d0 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74  ate removal in t
1a3e0 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  he UNION, EXCEPT
1a3f0 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20  , and INTERSECT 
1a400 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64  cases is handled
1a410 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f  .** within the o
1a420 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
1a430 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20 72  .  The regPrev r
1a440 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64  egister set hold
1a450 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  s the previously
1a460 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65  .** output value
1a470 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20  .  A comparison 
1a480 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20  is made against 
1a490 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74  this value and t
1a4a0 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20  he output.** is 
1a4b0 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6e  skipped if the n
1a4c0 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c  ext results woul
1a4d0 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  d be the same as
1a4e0 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a   the previous..*
1a4f0 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
1a500 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20  ntation plan is 
1a510 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
1a520 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
1a530 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62  and seven.** sub
1a540 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20  routines first, 
1a550 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e  then put the con
1a560 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68  trol logic at th
1a570 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20  e bottom.  Like 
1a580 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
1a590 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a       goto Init.*
1a5a0 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75  *     coA: corou
1a5b0 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75  tine for left qu
1a5c0 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63  ery (A).**     c
1a5d0 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oB: coroutine fo
1a5e0 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28 42  r right query (B
1a5f0 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75  ).**    outA: ou
1a600 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  tput one row of 
1a610 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75  A.**    outB: ou
1a620 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  tput one row of 
1a630 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49  B (UNION and UNI
1a640 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20  ON ALL only).** 
1a650 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20     EofA: ....** 
1a660 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20     EofB: ....** 
1a670 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20     AltB: ....** 
1a680 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20     AeqB: ....** 
1a690 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20     AgtB: ....** 
1a6a0 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c     Init: initial
1a6b0 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65  ize coroutine re
1a6c0 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20  gisters.**      
1a6d0 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a      yield coA.**
1a6e0 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66            if eof
1a6f0 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a  (A) goto EofA.**
1a700 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
1a710 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coB.**          
1a720 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45  if eof(B) goto E
1a730 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20  ofB.**    Cmpr: 
1a740 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20  Compare A, B.** 
1a750 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c           Jump Al
1a760 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a  tB, AeqB, AgtB.*
1a770 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a  *     End: ....*
1a780 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74  *.** We call Alt
1a790 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45  B, AeqB, AgtB, E
1a7a0 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73  ofA, and EofB "s
1a7b0 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20  ubroutines" but 
1a7c0 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20  they are not.** 
1a7d0 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20  actually called 
1a7e0 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20  using Gosub and 
1a7f0 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75  they do not Retu
1a800 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f  rn.  EofA and Eo
1a810 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c  fB loop.** until
1a820 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68   all data is exh
1a830 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70  austed then jump
1a840 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61   to the "end" la
1a850 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c  be.  AltB, AeqB,
1a860 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d  .** and AgtB jum
1a870 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f  p to either L2 o
1a880 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41  r to one of EofA
1a890 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66   or EofB..*/.#if
1a8a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a8b0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
1a8c0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
1a8d0 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a  iSelectOrderBy(.
1a8e0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1a8f0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1a900 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1a910 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
1a920 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
1a930 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
1a940 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
1a950 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
1a960 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
1a970 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
1a980 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
1a990 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
1a9a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1a9b0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53   counters */.  S
1a9c0 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20  elect *pPrior;  
1a9d0 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
1a9e0 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65  SELECT immediate
1a9f0 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a  ly to our left *
1aa00 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
1aa10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
1aa20 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
1aa30 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c  is VDBE */.  Sel
1aa40 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20 20  ectDest destA;  
1aa50 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
1aa60 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
1aa70 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  A */.  SelectDes
1aa80 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20  t destB;     /* 
1aa90 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  Destination for 
1aaa0 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20  coroutine B */. 
1aab0 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20   int regAddrA;  
1aac0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1aad0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  s register for s
1aae0 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e  elect-A coroutin
1aaf0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  e */.  int regAd
1ab00 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drB;         /* 
1ab10 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
1ab20 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f   for select-B co
1ab30 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1ab40 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20   addrSelectA;   
1ab50 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1ab60 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f   the select-A co
1ab70 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1ab80 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20   addrSelectB;   
1ab90 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1aba0 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f   the select-B co
1abb0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1abc0 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20   regOutA;       
1abd0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
1abe0 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
1abf0 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
1ac00 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ne */.  int regO
1ac10 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  utB;          /*
1ac20 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
1ac30 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  r for the output
1ac40 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -B subroutine */
1ac50 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b  .  int addrOutA;
1ac60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1ac70 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
1ac80 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
1ac90 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42  /.  int addrOutB
1aca0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64   = 0;     /* Add
1acb0 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
1acc0 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-B subroutine 
1acd0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
1ace0 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
1acf0 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
1ad00 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20  ect-A-exhausted 
1ad10 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1ad20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42  int addrEofA_noB
1ad30 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61  ;     /* Alterna
1ad40 74 65 20 61 64 64 72 45 6f 66 41 20 69 66 20 42  te addrEofA if B
1ad50 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   is uninitialize
1ad60 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  d */.  int addrE
1ad70 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ofB;         /* 
1ad80 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
1ad90 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65  elect-B-exhauste
1ada0 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  d subroutine */.
1adb0 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20    int addrAltB; 
1adc0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1add0 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75  ss of the A<B su
1ade0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
1adf0 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20 20  t addrAeqB;     
1ae00 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1ae10 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f  f the A==B subro
1ae20 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
1ae30 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20 20  ddrAgtB;        
1ae40 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1ae50 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e  he A>B subroutin
1ae60 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  e */.  int regLi
1ae70 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitA;        /* 
1ae80 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
1ae90 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
1aea0 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20   int regLimitB; 
1aeb0 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20         /* Limit 
1aec0 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
1aed0 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72  ect-A */.  int r
1aee0 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  egPrev;         
1aef0 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72   /* A range of r
1af00 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64  egisters to hold
1af10 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
1af20 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c   */.  int savedL
1af30 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  imit;       /* S
1af40 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
1af50 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74  >iLimit */.  int
1af60 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20   savedOffset;   
1af70 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
1af80 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20  e of p->iOffset 
1af90 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d  */.  int labelCm
1afa0 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  pr;        /* La
1afb0 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72  bel for the star
1afc0 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61  t of the merge a
1afd0 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e  lgorithm */.  in
1afe0 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20  t labelEnd;     
1aff0 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
1b000 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1b010 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73  overall SELECT s
1b020 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  tmt */.  int add
1b030 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  r1;            /
1b040 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  * Jump instructi
1b050 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65 74  ons that get ret
1b060 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e  argetted */.  in
1b070 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
1b080 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
1b090 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20  _ALL, TK_UNION, 
1b0a0 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e  TK_EXCEPT, TK_IN
1b0b0 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79  TERSECT */.  Key
1b0c0 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20  Info *pKeyDup = 
1b0d0 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e  0; /* Comparison
1b0e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
1b0f0 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76   duplicate remov
1b100 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  al */.  KeyInfo 
1b110 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a  *pKeyMerge;   /*
1b120 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f   Comparison info
1b130 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67  rmation for merg
1b140 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71  ing rows */.  sq
1b150 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
1b160 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1b170 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1b180 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
1b190 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
1b1a0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
1b1b0 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20    int nOrderBy; 
1b1c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1b1d0 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
1b1e0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1b1f0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72  e */.  int *aPer
1b200 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  mute;        /* 
1b210 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44  Mapping from ORD
1b220 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72  ER BY terms to r
1b230 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e  esult set column
1b240 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
1b250 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29  p->pOrderBy!=0 )
1b260 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1b270 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61  Dup==0 ); /* "Ma
1b280 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64  naged" code need
1b290 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20  s this.  Ticket 
1b2a0 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d  #3382. */.  db =
1b2b0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76   pParse->db;.  v
1b2c0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1b2d0 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
1b2e0 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72   );       /* Alr
1b2f0 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20  eady thrown the 
1b300 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c  error if VDBE al
1b310 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  loc failed */.  
1b320 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74  labelEnd = sqlit
1b330 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1b340 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20  v);.  labelCmpr 
1b350 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1b360 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f  eLabel(v);...  /
1b370 2a 20 50 61 74 63 68 20 75 70 20 74 68 65 20 4f  * Patch up the O
1b380 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
1b390 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70   */.  op = p->op
1b3a0 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  ;  .  pPrior = p
1b3b0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
1b3c0 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  rt( pPrior->pOrd
1b3d0 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72  erBy==0 );.  pOr
1b3e0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
1b3f0 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rBy;.  assert( p
1b400 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72  OrderBy );.  nOr
1b410 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1b420 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46  ->nExpr;..  /* F
1b430 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68  or operators oth
1b440 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c  er than UNION AL
1b450 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b  L we have to mak
1b460 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a  e sure that.  **
1b470 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1b480 61 75 73 65 20 63 6f 76 65 72 73 20 65 76 65 72  ause covers ever
1b490 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65  y term of the re
1b4a0 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20  sult set.  Add. 
1b4b0 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65   ** terms to the
1b4c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1b4d0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
1b4e0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b   */.  if( op!=TK
1b4f0 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28  _ALL ){.    for(
1b500 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  i=1; db->mallocF
1b510 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70  ailed==0 && i<=p
1b520 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
1b530 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
1b540 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1b550 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
1b560 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
1b570 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f  OrderBy->a; j<nO
1b580 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74  rderBy; j++, pIt
1b590 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  em++){.        a
1b5a0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
1b5b0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20  x.iOrderByCol>0 
1b5c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1b5d0 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
1b5e0 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b  ByCol==i ) break
1b5f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b600 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20  if( j==nOrderBy 
1b610 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
1b620 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
1b630 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  xpr(db, TK_INTEG
1b640 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ER, 0);.        
1b650 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
1b660 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1b670 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
1b680 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
1b690 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
1b6a0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
1b6b0 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  ue = i;.        
1b6c0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
1b6d0 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
1b6e0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
1b6f0 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
1b700 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   pNew);.        
1b710 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70  if( pOrderBy ) p
1b720 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65  OrderBy->a[nOrde
1b730 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65  rBy++].u.x.iOrde
1b740 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b  rByCol = (u16)i;
1b750 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b760 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
1b770 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1b780 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20  permutation and 
1b790 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20  keyinfo that is 
1b7a0 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74  used with.  ** t
1b7b0 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 75  he permutation u
1b7c0 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
1b7d0 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a   if the next.  *
1b7e0 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 73  * row of results
1b7f0 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65   comes from sele
1b800 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42 2e 20  ctA or selectB. 
1b810 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c 69 63   Also add explic
1b820 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  it.  ** collatio
1b830 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  ns to the ORDER 
1b840 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  BY clause terms 
1b850 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
1b860 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 2a 2a   subqueries.  **
1b870 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 61 6e   to the right an
1b880 64 20 74 68 65 20 6c 65 66 74 20 61 72 65 20 65  d the left are e
1b890 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79 20 75  valuated, they u
1b8a0 73 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20  se the correct. 
1b8b0 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20   ** collation.. 
1b8c0 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65 20 3d   */.  aPermute =
1b8d0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1b8e0 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
1b8f0 28 69 6e 74 29 2a 28 6e 4f 72 64 65 72 42 79 20  (int)*(nOrderBy 
1b900 2b 20 31 29 29 3b 0a 20 20 69 66 28 20 61 50 65  + 1));.  if( aPe
1b910 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72  rmute ){.    str
1b920 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1b930 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 50  m *pItem;.    aP
1b940 65 72 6d 75 74 65 5b 30 5d 20 3d 20 6e 4f 72 64  ermute[0] = nOrd
1b950 65 72 42 79 3b 0a 20 20 20 20 66 6f 72 28 69 3d  erBy;.    for(i=
1b960 31 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  1, pItem=pOrderB
1b970 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72 64 65 72 42  y->a; i<=nOrderB
1b980 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  y; i++, pItem++)
1b990 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1b9a0 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
1b9b0 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  rByCol>0 );.    
1b9c0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1b9d0 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
1b9e0 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <=p->pEList->nEx
1b9f0 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72  pr );.      aPer
1ba00 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d  mute[i] = pItem-
1ba10 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
1ba20 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 1;.    }.    
1ba30 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74  pKeyMerge = mult
1ba40 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
1ba50 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c  yInfo(pParse, p,
1ba60 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
1ba70 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b    pKeyMerge = 0;
1ba80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74  .  }..  /* Reatt
1ba90 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
1baa0 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71   clause to the q
1bab0 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  uery..  */.  p->
1bac0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
1bad0 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  rBy;.  pPrior->p
1bae0 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
1baf0 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61  3ExprListDup(pPa
1bb00 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42  rse->db, pOrderB
1bb10 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  y, 0);..  /* All
1bb20 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66  ocate a range of
1bb30 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
1bb40 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79  ters and the Key
1bb50 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a  Info needed.  **
1bb60 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74   for the logic t
1bb70 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c  hat removes dupl
1bb80 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77  icate result row
1bb90 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  s when the.  ** 
1bba0 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
1bbb0 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
1bbc0 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74  TERSECT (but not
1bbd0 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a   UNION ALL)..  *
1bbe0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
1bbf0 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65  LL ){.    regPre
1bc00 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v = 0;.  }else{.
1bc10 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
1bc20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
1bc30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f  ;.    assert( nO
1bc40 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c  rderBy>=nExpr ||
1bc50 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1bc60 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76  d );.    regPrev
1bc70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
1bc80 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
1bc90 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a  Mem += nExpr+1;.
1bca0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bcb0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1bcc0 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29  ger, 0, regPrev)
1bcd0 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20  ;.    pKeyDup = 
1bce0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
1bcf0 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c 20 31  loc(db, nExpr, 1
1bd00 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44  );.    if( pKeyD
1bd10 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  up ){.      asse
1bd20 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
1bd30 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
1bd40 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20 20 20  eyDup) );.      
1bd50 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
1bd60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1bd70 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69  pKeyDup->aColl[i
1bd80 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  ] = multiSelectC
1bd90 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1bda0 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  , i);.        pK
1bdb0 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65  eyDup->aSortOrde
1bdc0 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
1bdd0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20  }.    }.  }. .  
1bde0 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20  /* Separate the 
1bdf0 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67  left and the rig
1be00 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e  ht query from on
1be10 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20  e another.  */. 
1be20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
1be30 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20    pPrior->pNext 
1be40 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  = 0;.  sqlite3Re
1be50 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
1be60 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  y(pParse, p, p->
1be70 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52  pOrderBy, "ORDER
1be80 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  ");.  if( pPrior
1be90 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
1bea0 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
1beb0 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
1bec0 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50  arse, pPrior, pP
1bed0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20  rior->pOrderBy, 
1bee0 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20  "ORDER");.  }.. 
1bef0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
1bf00 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
1bf10 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  */.  computeLimi
1bf20 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
1bf30 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  e, p, labelEnd);
1bf40 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
1bf50 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29   && op==TK_ALL )
1bf60 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20  {.    regLimitA 
1bf70 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1bf80 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20  ;.    regLimitB 
1bf90 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1bfa0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1bfb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
1bfc0 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f  py, p->iOffset ?
1bfd0 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20   p->iOffset+1 : 
1bfe0 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20  p->iLimit,.     
1bff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c000 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
1c010 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c  LimitA);.    sql
1c020 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1c030 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69  , OP_Copy, regLi
1c040 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29  mitA, regLimitB)
1c050 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1c060 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69  egLimitA = regLi
1c070 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  mitB = 0;.  }.  
1c080 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1c090 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
1c0a0 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
1c0b0 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d  0;..  regAddrA =
1c0c0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1c0d0 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b  .  regAddrB = ++
1c0e0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1c0f0 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72  regOutA = ++pPar
1c100 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
1c110 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utB = ++pParse->
1c120 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53  nMem;.  sqlite3S
1c130 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
1c140 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estA, SRT_Corout
1c150 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  ine, regAddrA);.
1c160 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1c170 65 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20  estInit(&destB, 
1c180 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
1c190 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 45 78 70  egAddrB);..  Exp
1c1a0 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
1c1b0 50 61 72 73 65 2c 20 31 2c 20 22 4d 45 52 47 45  Parse, 1, "MERGE
1c1c0 20 28 25 73 29 22 2c 20 73 65 6c 65 63 74 4f 70   (%s)", selectOp
1c1d0 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 0a  Name(p->op)));..
1c1e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1c1f0 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
1c200 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
1c210 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68   statement to th
1c220 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74  e.  ** left of t
1c230 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72  he compound oper
1c240 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73  ator - the "A" s
1c250 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64  elect..  */.  ad
1c260 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69  drSelectA = sqli
1c270 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1c280 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61 64 64  dr(v) + 1;.  add
1c290 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
1c2a0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
1c2b0 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  tCoroutine, regA
1c2c0 64 64 72 41 2c 20 30 2c 20 61 64 64 72 53 65 6c  ddrA, 0, addrSel
1c2d0 65 63 74 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d  ectA);.  VdbeCom
1c2e0 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66 74 20 53  ment((v, "left S
1c2f0 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69  ELECT"));.  pPri
1c300 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67  or->iLimit = reg
1c310 4c 69 6d 69 74 41 3b 0a 20 20 45 78 70 6c 61 69  LimitA;.  Explai
1c320 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
1c330 73 65 2c 20 31 2c 20 22 4c 45 46 54 22 29 29 3b  se, 1, "LEFT"));
1c340 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1c350 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
1c360 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69   &destA);.  sqli
1c370 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
1c380 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72 41 29  ine(v, regAddrA)
1c390 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
1c3a0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
1c3b0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1c3c0 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
1c3d0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
1c3e0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
1c3f0 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68  n .  ** the righ
1c400 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65  t - the "B" sele
1c410 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65  ct.  */.  addrSe
1c420 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56  lectB = sqlite3V
1c430 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1c440 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d  ) + 1;.  addr1 =
1c450 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c460 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
1c470 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
1c480 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 42  , 0, addrSelectB
1c490 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
1c4a0 28 28 76 2c 20 22 72 69 67 68 74 20 53 45 4c 45  ((v, "right SELE
1c4b0 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69  CT"));.  savedLi
1c4c0 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
1c4d0 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d  .  savedOffset =
1c4e0 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70   p->iOffset;.  p
1c4f0 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69  ->iLimit = regLi
1c500 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  mitB;.  p->iOffs
1c510 65 74 20 3d 20 30 3b 20 20 0a 20 20 45 78 70 6c  et = 0;  .  Expl
1c520 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
1c530 61 72 73 65 2c 20 31 2c 20 22 52 49 47 48 54 22  arse, 1, "RIGHT"
1c540 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  ));.  sqlite3Sel
1c550 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
1c560 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69  destB);.  p->iLi
1c570 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74  mit = savedLimit
1c580 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
1c590 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20   savedOffset;.  
1c5a0 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f  sqlite3VdbeEndCo
1c5b0 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64  routine(v, regAd
1c5c0 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  drB);..  /* Gene
1c5d0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1c5e0 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74  e that outputs t
1c5f0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
1c600 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c  f the A.  ** sel
1c610 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20  ect as the next 
1c620 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68  output row of th
1c630 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
1c640 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  t..  */.  VdbeNo
1c650 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
1c660 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
1c670 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75  r A"));.  addrOu
1c680 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74  tA = generateOut
1c690 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
1c6a0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
1c6b0 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 41         p, &destA
1c6c0 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41  , pDest, regOutA
1c6d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c6e0 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79     regPrev, pKey
1c6f0 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  Dup, labelEnd);.
1c700 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65    .  /* Generate
1c710 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
1c720 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
1c730 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
1c740 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e B.  ** select 
1c750 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
1c760 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
1c770 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
1c780 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
1c790 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
1c7a0 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65  NION ){.    Vdbe
1c7b0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1c7c0 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
1c7d0 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64  for B"));.    ad
1c7e0 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74  drOutB = generat
1c7f0 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
1c800 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
1c810 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
1c820 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67  estB, pDest, reg
1c830 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20  OutB,.          
1c840 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
1c850 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e  pKeyDup, labelEn
1c860 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
1c870 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
1c880 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65  eyDup);..  /* Ge
1c890 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1c8a0 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
1c8b0 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
1c8c0 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61   select A.  ** a
1c8d0 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
1c8e0 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
1c8f0 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a  lect B remains..
1c900 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
1c910 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
1c920 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
1c930 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42      addrEofA_noB
1c940 20 3d 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61   = addrEofA = la
1c950 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  belEnd;.  }else{
1c960 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43    .    VdbeNoopC
1c970 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
1c980 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  A subroutine"));
1c990 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20  .    addrEofA = 
1c9a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c9b0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1c9c0 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
1c9d0 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f  );.    addrEofA_
1c9e0 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  noB = sqlite3Vdb
1c9f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1ca00 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c  eld, regAddrB, l
1ca10 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20  abelEnd);.      
1ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56                 V
1ca40 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1ca50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1ca60 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 41 29  oto(v, addrEofA)
1ca70 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  ;.    p->nSelect
1ca80 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
1ca90 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63  EstAdd(p->nSelec
1caa0 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53  tRow, pPrior->nS
1cab0 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 7d 0a 0a  electRow);.  }..
1cac0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1cad0 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75  subroutine to ru
1cae0 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  n when the resul
1caf0 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42  ts from select B
1cb00 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73  .  ** are exhaus
1cb10 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74  ted and only dat
1cb20 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65  a in select A re
1cb30 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  mains..  */.  if
1cb40 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ( op==TK_INTERSE
1cb50 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
1cb60 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20  fB = addrEofA;. 
1cb70 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
1cb80 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e  tRow > pPrior->n
1cb90 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e  SelectRow ) p->n
1cba0 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69  SelectRow = pPri
1cbb0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
1cbc0 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56    }else{  .    V
1cbd0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1cbe0 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75  v, "eof-B subrou
1cbf0 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
1cc00 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56  rEofB = sqlite3V
1cc10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1cc20 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20  Gosub, regOutA, 
1cc30 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73  addrOutA);.    s
1cc40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1cc50 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1cc60 67 41 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64  gAddrA, labelEnd
1cc70 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1cc80 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1cc90 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45  dbeGoto(v, addrE
1cca0 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ofB);.  }..  /* 
1ccb0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1ccc0 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
1ccd0 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56   of A<B.  */.  V
1cce0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1ccf0 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f  v, "A-lt-B subro
1cd00 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72  utine"));.  addr
1cd10 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  AltB = sqlite3Vd
1cd20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1cd30 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61  osub, regOutA, a
1cd40 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69  ddrOutA);.  sqli
1cd50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1cd60 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1cd70 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20  drA, addrEofA); 
1cd80 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1cd90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f  .  sqlite3VdbeGo
1cda0 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  to(v, labelCmpr)
1cdb0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1cdc0 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
1cdd0 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42  the case of A==B
1cde0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1cdf0 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64  TK_ALL ){.    ad
1ce00 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74  drAeqB = addrAlt
1ce10 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  B;.  }else if( o
1ce20 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
1ce30 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
1ce40 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20  = addrAltB;.    
1ce50 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65  addrAltB++;.  }e
1ce60 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  lse{.    VdbeNoo
1ce70 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
1ce80 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  eq-B subroutine"
1ce90 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42  ));.    addrAeqB
1cea0 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   =.    sqlite3Vd
1ceb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1cec0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1ced0 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43  addrEofA); VdbeC
1cee0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1cef0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1cf00 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  v, labelCmpr);. 
1cf10 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1cf20 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
1cf30 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42   the case of A>B
1cf40 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1cf50 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67  Comment((v, "A-g
1cf60 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
1cf70 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20  );.  addrAgtB = 
1cf80 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1cf90 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28  ntAddr(v);.  if(
1cfa0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
1cfb0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
1cfc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cfd0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1cfe0 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f  , regOutB, addrO
1cff0 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  utB);.  }.  sqli
1d000 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d010 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1d020 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20  drB, addrEofB); 
1d030 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1d040 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f  .  sqlite3VdbeGo
1d050 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  to(v, labelCmpr)
1d060 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64  ;..  /* This cod
1d070 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69  e runs once to i
1d080 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74  nitialize everyt
1d090 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  hing..  */.  sql
1d0a0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1d0b0 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71  (v, addr1);.  sq
1d0c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d0d0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1d0e0 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 5f  AddrA, addrEofA_
1d0f0 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  noB); VdbeCovera
1d100 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
1d110 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d120 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
1d130 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62  , addrEofB); Vdb
1d140 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
1d150 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68   /* Implement th
1d160 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f  e main merge loo
1d170 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
1d180 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1d190 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
1d1a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d1b0 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74  Op4(v, OP_Permut
1d1c0 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20  ation, 0, 0, 0, 
1d1d0 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c  (char*)aPermute,
1d1e0 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20   P4_INTARRAY);. 
1d1f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d200 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
1d210 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64  , destA.iSdst, d
1d220 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64  estB.iSdst, nOrd
1d230 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
1d240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1d250 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c  char*)pKeyMerge,
1d260 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
1d270 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1d280 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45  eP5(v, OPFLAG_PE
1d290 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65  RMUTE);.  sqlite
1d2a0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1d2b0 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42  P_Jump, addrAltB
1d2c0 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72  , addrAeqB, addr
1d2d0 41 67 74 42 29 3b 20 56 64 62 65 43 6f 76 65 72  AgtB); VdbeCover
1d2e0 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75  age(v);..  /* Ju
1d2f0 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73 20 70  mp to the this p
1d300 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  oint in order to
1d310 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71   terminate the q
1d320 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  uery..  */.  sql
1d330 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1d340 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64  abel(v, labelEnd
1d350 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d  );..  /* Reassem
1d360 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  bly the compound
1d370 20 71 75 65 72 79 20 73 6f 20 74 68 61 74 20 69   query so that i
1d380 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
1d390 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62  correctly.  ** b
1d3a0 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
1d3b0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20  nction */.  if( 
1d3c0 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
1d3d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1d3e0 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69  lete(db, p->pPri
1d3f0 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50  or);.  }.  p->pP
1d400 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
1d410 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d   pPrior->pNext =
1d420 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a   p;..  /*** TBD:
1d430 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74    Insert subrout
1d440 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f  ine calls to clo
1d450 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e  se cursors on in
1d460 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20  complete.  **** 
1d470 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f  subqueries ****/
1d480 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50  .  ExplainQueryP
1d490 6c 61 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  lanPop(pParse);.
1d4a0 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
1d4b0 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64  >nErr!=0;.}.#end
1d4c0 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
1d4d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1d4e0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1d4f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1d500 49 45 57 29 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74  IEW)../* An inst
1d510 61 6e 63 65 20 6f 66 20 74 68 65 20 53 75 62 73  ance of the Subs
1d520 74 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20  tContext object 
1d530 64 65 73 63 72 69 62 65 73 20 61 6e 20 73 75 62  describes an sub
1d540 73 74 69 74 75 74 69 6f 6e 20 65 64 69 74 0a 2a  stitution edit.*
1d550 2a 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65  * to be performe
1d560 64 20 6f 6e 20 61 20 70 61 72 73 65 20 74 72 65  d on a parse tre
1d570 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66  e..**.** All ref
1d580 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
1d590 6e 73 20 69 6e 20 74 61 62 6c 65 20 69 54 61 62  ns in table iTab
1d5a0 6c 65 20 61 72 65 20 74 6f 20 62 65 20 72 65 70  le are to be rep
1d5b0 6c 61 63 65 64 20 62 79 20 63 6f 72 72 65 73 70  laced by corresp
1d5c0 6f 6e 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73  onding.** expres
1d5d0 73 69 6f 6e 73 20 69 6e 20 70 45 4c 69 73 74 2e  sions in pEList.
1d5e0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1d5f0 63 74 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20  ct SubstContext 
1d600 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
1d610 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1d620 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
1d630 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54  text */.  int iT
1d640 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
1d650 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 72      /* Replace r
1d660 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69  eferences to thi
1d670 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  s table */.  int
1d680 20 69 4e 65 77 54 61 62 6c 65 3b 20 20 20 20 20   iNewTable;     
1d690 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 61         /* New ta
1d6a0 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
1d6b0 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 20  int isLeftJoin; 
1d6c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1d6d0 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20   TK_IF_NULL_ROW 
1d6e0 6f 70 63 6f 64 65 73 20 6f 6e 20 65 61 63 68 20  opcodes on each 
1d6f0 72 65 70 6c 61 63 65 6d 65 6e 74 20 2a 2f 0a 20  replacement */. 
1d700 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1d710 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  t;         /* Re
1d720 70 6c 61 63 65 6d 65 6e 74 20 65 78 70 72 65 73  placement expres
1d730 73 69 6f 6e 73 20 2a 2f 0a 7d 20 53 75 62 73 74  sions */.} Subst
1d740 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72  Context;../* For
1d750 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e  ward Declaration
1d760 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s */.static void
1d770 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 53   substExprList(S
1d780 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 45 78  ubstContext*, Ex
1d790 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63  prList*);.static
1d7a0 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
1d7b0 74 28 53 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c  t(SubstContext*,
1d7c0 20 53 65 6c 65 63 74 2a 2c 20 69 6e 74 29 3b 0a   Select*, int);.
1d7d0 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f  ./*.** Scan thro
1d7e0 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69  ugh the expressi
1d7f0 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61  on pExpr.  Repla
1d800 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ce every referen
1d810 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d  ce to.** a colum
1d820 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
1d830 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20  r iTable with a 
1d840 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c  copy of the iCol
1d850 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20  umn-th.** entry 
1d860 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74  in pEList.  (But
1d870 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65   leave reference
1d880 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63  s to the ROWID c
1d890 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  olumn .** unchan
1d8a0 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ged.).**.** This
1d8b0 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74   routine is part
1d8c0 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69   of the flatteni
1d8d0 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41  ng procedure.  A
1d8e0 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f   subquery.** who
1d8f0 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  se result set is
1d900 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69   defined by pELi
1d910 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e  st appears as en
1d920 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52  try in the.** FR
1d930 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
1d940 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20  ELECT such that 
1d950 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
1d960 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74  assigned to that
1d970 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20  .** FORM clause 
1d980 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e  entry is iTable.
1d990 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
1d9a0 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
1d9b0 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ry .** changes t
1d9c0 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20  o pExpr so that 
1d9d0 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74  it refers direct
1d9e0 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65  ly to the source
1d9f0 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65   table.** of the
1da00 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72   subquery rather
1da10 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
1da20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
1da30 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
1da40 2a 73 75 62 73 74 45 78 70 72 28 0a 20 20 53 75  *substExpr(.  Su
1da50 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62  bstContext *pSub
1da60 73 74 2c 20 20 2f 2a 20 44 65 73 63 72 69 70 74  st,  /* Descript
1da70 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
1da80 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  itution */.  Exp
1da90 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
1daa0 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77      /* Expr in w
1dab0 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f  hich substitutio
1dac0 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20  n occurs */.){. 
1dad0 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
1dae0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1daf0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1db00 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
1db10 69 6e 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d  in).   && pExpr-
1db20 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
1db30 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65  ==pSubst->iTable
1db40 0a 20 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d  .  ){.    pExpr-
1db50 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
1db60 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54   = pSubst->iNewT
1db70 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
1db80 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
1db90 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
1dba0 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69  Table==pSubst->i
1dbb0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28  Table ){.    if(
1dbc0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
1dbd0 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
1dbe0 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
1dbf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1dc00 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20   Expr *pNew;.   
1dc10 20 20 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d     Expr *pCopy =
1dc20 20 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d   pSubst->pEList-
1dc30 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
1dc40 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  n].pExpr;.      
1dc50 45 78 70 72 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a  Expr ifNullRow;.
1dc60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1dc70 75 62 73 74 2d 3e 70 45 4c 69 73 74 21 3d 30 20  ubst->pEList!=0 
1dc80 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
1dc90 6e 3c 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74  n<pSubst->pEList
1dca0 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
1dcb0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1dcc0 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70  pLeft==0 && pExp
1dcd0 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
1dce0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1dcf0 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 43  3ExprIsVector(pC
1dd00 6f 70 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  opy) ){.        
1dd10 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72  sqlite3VectorErr
1dd20 6f 72 4d 73 67 28 70 53 75 62 73 74 2d 3e 70 50  orMsg(pSubst->pP
1dd30 61 72 73 65 2c 20 70 43 6f 70 79 29 3b 0a 20 20  arse, pCopy);.  
1dd40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1dd50 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1dd60 20 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2d   pSubst->pParse-
1dd70 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  >db;.        if(
1dd80 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a   pSubst->isLeftJ
1dd90 6f 69 6e 20 26 26 20 70 43 6f 70 79 2d 3e 6f 70  oin && pCopy->op
1dda0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  !=TK_COLUMN ){. 
1ddb0 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
1ddc0 26 69 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20 73  &ifNullRow, 0, s
1ddd0 69 7a 65 6f 66 28 69 66 4e 75 6c 6c 52 6f 77 29  izeof(ifNullRow)
1dde0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e  );.          ifN
1ddf0 75 6c 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49  ullRow.op = TK_I
1de00 46 5f 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20  F_NULL_ROW;.    
1de10 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e        ifNullRow.
1de20 70 4c 65 66 74 20 3d 20 70 43 6f 70 79 3b 0a 20  pLeft = pCopy;. 
1de30 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52           ifNullR
1de40 6f 77 2e 69 54 61 62 6c 65 20 3d 20 70 53 75 62  ow.iTable = pSub
1de50 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20  st->iNewTable;. 
1de60 20 20 20 20 20 20 20 20 20 70 43 6f 70 79 20 3d           pCopy =
1de70 20 26 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20   &ifNullRow;.   
1de80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1de90 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
1dea0 72 44 75 70 28 64 62 2c 20 70 43 6f 70 79 2c 20  rDup(db, pCopy, 
1deb0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
1dec0 70 4e 65 77 20 26 26 20 70 53 75 62 73 74 2d 3e  pNew && pSubst->
1ded0 69 73 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  isLeftJoin ){.  
1dee0 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50          ExprSetP
1def0 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
1df00 5f 43 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20 20 20  _CanBeNull);.   
1df10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1df20 66 28 20 70 4e 65 77 20 26 26 20 45 78 70 72 48  f( pNew && ExprH
1df30 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1df40 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b  ,EP_FromJoin) ){
1df50 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
1df60 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
1df70 20 3d 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74   = pExpr->iRight
1df80 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20  JoinTable;.     
1df90 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70       ExprSetProp
1dfa0 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 46 72  erty(pNew, EP_Fr
1dfb0 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 20  omJoin);.       
1dfc0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
1dfd0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1dfe0 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
1dff0 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
1e000 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1e010 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 45  else{.    if( pE
1e020 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e  xpr->op==TK_IF_N
1e030 55 4c 4c 5f 52 4f 57 20 26 26 20 70 45 78 70 72  ULL_ROW && pExpr
1e040 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74  ->iTable==pSubst
1e050 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ->iTable ){.    
1e060 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
1e070 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61  = pSubst->iNewTa
1e080 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ble;.    }.    p
1e090 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75  Expr->pLeft = su
1e0a0 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20  bstExpr(pSubst, 
1e0b0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1e0c0 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
1e0d0 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75   = substExpr(pSu
1e0e0 62 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  bst, pExpr->pRig
1e0f0 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  ht);.    if( Exp
1e100 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1e110 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1e120 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ) ){.      subst
1e130 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70  Select(pSubst, p
1e140 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  Expr->x.pSelect,
1e150 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1);.    }else{.
1e160 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1e170 69 73 74 28 70 53 75 62 73 74 2c 20 70 45 78 70  ist(pSubst, pExp
1e180 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
1e190 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1e1a0 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20  pExpr;.}.static 
1e1b0 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
1e1c0 73 74 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65  st(.  SubstConte
1e1d0 78 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44  xt *pSubst, /* D
1e1e0 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1e1f0 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a  e substitution *
1e200 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
1e210 69 73 74 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist       /* Lis
1e220 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e  t to scan and in
1e230 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73   which to make s
1e240 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 29 7b  ubstitutes */.){
1e250 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1e260 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1e270 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
1e280 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1e290 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  +){.    pList->a
1e2a0 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73  [i].pExpr = subs
1e2b0 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 4c  tExpr(pSubst, pL
1e2c0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
1e2d0 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
1e2e0 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
1e2f0 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20  .  SubstContext 
1e300 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63  *pSubst, /* Desc
1e310 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ription of the s
1e320 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20  ubstitution */. 
1e330 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
1e340 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
1e350 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68   statement in wh
1e360 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
1e370 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  titutions */.  i
1e380 6e 74 20 64 6f 50 72 69 6f 72 20 20 20 20 20 20  nt doPrior      
1e390 20 20 20 20 20 2f 2a 20 44 6f 20 73 75 62 73 74       /* Do subst
1e3a0 69 74 75 74 65 73 20 6f 6e 20 70 2d 3e 70 50 72  itutes on p->pPr
1e3b0 69 6f 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20  ior too */.){.  
1e3c0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
1e3d0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1e3e0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
1e3f0 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29  nt i;.  if( !p )
1e400 20 72 65 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20   return;.  do{. 
1e410 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1e420 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 45 4c 69  (pSubst, p->pELi
1e430 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
1e440 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70  prList(pSubst, p
1e450 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
1e460 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
1e470 53 75 62 73 74 2c 20 70 2d 3e 70 4f 72 64 65 72  Subst, p->pOrder
1e480 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76  By);.    p->pHav
1e490 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28  ing = substExpr(
1e4a0 70 53 75 62 73 74 2c 20 70 2d 3e 70 48 61 76 69  pSubst, p->pHavi
1e4b0 6e 67 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  ng);.    p->pWhe
1e4c0 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  re = substExpr(p
1e4d0 53 75 62 73 74 2c 20 70 2d 3e 70 57 68 65 72 65  Subst, p->pWhere
1e4e0 29 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 2d  );.    pSrc = p-
1e4f0 3e 70 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72  >pSrc;.    asser
1e500 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
1e510 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
1e520 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e  rc, pItem=pSrc->
1e530 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
1e540 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62  em++){.      sub
1e550 73 74 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c  stSelect(pSubst,
1e560 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c   pItem->pSelect,
1e570 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   1);.      if( p
1e580 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
1e590 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 75  nc ){.        su
1e5a0 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62  bstExprList(pSub
1e5b0 73 74 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46  st, pItem->u1.pF
1e5c0 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 20 20 7d  uncArg);.      }
1e5d0 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
1e5e0 20 64 6f 50 72 69 6f 72 20 26 26 20 28 70 20 3d   doPrior && (p =
1e5f0 20 70 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20 29   p->pPrior)!=0 )
1e600 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
1e610 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1e620 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1e630 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1e640 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23  OMIT_VIEW) */..#
1e650 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1e660 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1e670 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1e680 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
1e690 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1e6a0 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
1e6b0 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
1e6c0 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  s as a performan
1e6d0 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ce optimization.
1e6e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1e6f0 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74   returns 1 if it
1e700 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61   makes changes a
1e710 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74  nd 0 if no flatt
1e720 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a  ening occurs..**
1e730 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e  .** To understan
1e740 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66  d the concept of
1e750 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e   flattening, con
1e760 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
1e770 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a  ing.** query:.**
1e780 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
1e790 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b   FROM (SELECT x+
1e7a0 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
1e7b0 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52  HERE z<100) WHER
1e7c0 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E a>5.**.** The 
1e7d0 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69  default way of i
1e7e0 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73  mplementing this
1e7f0 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65   query is to exe
1e800 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71  cute the.** subq
1e810 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73  uery first and s
1e820 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1e830 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
1e840 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72  table, then.** r
1e850 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  un the outer que
1e860 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f  ry on that tempo
1e870 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69  rary table.  Thi
1e880 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a  s requires two.*
1e890 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68  * passes over th
1e8a0 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72  e data.  Further
1e8b0 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68  more, because th
1e8c0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
1e8d0 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69  e.** has no indi
1e8e0 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63  ces, the WHERE c
1e8f0 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74  lause on the out
1e900 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  er query cannot 
1e910 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e  be.** optimized.
1e920 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1e930 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
1e940 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20  rewrite queries 
1e950 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76  such as the abov
1e960 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  e into.** a sing
1e970 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20  le flat select, 
1e980 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1e990 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20       SELECT x+y 
1e9a0 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
1e9b0 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35  RE z<100 AND a>5
1e9c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
1e9d0 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
1e9e0 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f  is simplificatio
1e9f0 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
1ea00 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
1ea10 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
1ea20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
1ea30 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
1ea40 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
1ea50 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
1ea60 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
1ea70 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
1ea80 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
1ea90 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
1eaa0 74 65 6e 69 6e 67 20 69 73 20 73 75 62 6a 65 63  tening is subjec
1eab0 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t to the followi
1eac0 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 0a  ng constraints:.
1ead0 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20  **.**  (**)  We 
1eae0 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70  no longer attemp
1eaf0 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67  t to flatten agg
1eb00 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65  regate subquerie
1eb10 73 2e 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20  s. Was:.**      
1eb20 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1eb30 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
1eb40 72 79 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  ry cannot both b
1eb50 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  e aggregates..**
1eb60 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f  .**  (**)  We no
1eb70 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20   longer attempt 
1eb80 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65  to flatten aggre
1eb90 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e  gate subqueries.
1eba0 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20   Was:.**        
1ebb0 28 32 29 20 49 66 20 74 68 65 20 73 75 62 71 75  (2) If the subqu
1ebc0 65 72 79 20 69 73 20 61 6e 20 61 67 67 72 65 67  ery is an aggreg
1ebd0 61 74 65 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20  ate then.**     
1ebe0 20 20 20 28 32 61 29 20 74 68 65 20 6f 75 74 65     (2a) the oute
1ebf0 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74  r query must not
1ec00 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a   be a join and.*
1ec10 2a 20 20 20 20 20 20 20 20 28 32 62 29 20 74 68  *        (2b) th
1ec20 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 75  e outer query mu
1ec30 73 74 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75  st not use subqu
1ec40 65 72 69 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  eries.**        
1ec50 20 20 20 20 20 6f 74 68 65 72 20 74 68 61 6e 20       other than 
1ec60 74 68 65 20 6f 6e 65 20 46 52 4f 4d 2d 63 6c 61  the one FROM-cla
1ec70 75 73 65 20 73 75 62 71 75 65 72 79 20 74 68 61  use subquery tha
1ec80 74 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  t is a candidate
1ec90 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1eca0 66 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20  for flattening. 
1ecb0 20 28 54 68 69 73 20 69 73 20 64 75 65 20 74 6f   (This is due to
1ecc0 20 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30 64   ticket [2f7170d
1ecd0 37 33 62 66 39 61 62 66 38 30 5d 0a 2a 2a 20 20  73bf9abf80].**  
1ece0 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20             from 
1ecf0 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a  2015-02-09.).**.
1ed00 2a 2a 20 20 20 28 33 29 20 20 49 66 20 74 68 65  **   (3)  If the
1ed10 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
1ed20 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
1ed30 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68  f a LEFT JOIN th
1ed40 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 61  en.**        (3a
1ed50 29 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6d  ) the subquery m
1ed60 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e  ay not be a join
1ed70 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28   and.**        (
1ed80 33 62 29 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  3b) the FROM cla
1ed90 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
1eda0 65 72 79 20 6d 61 79 20 6e 6f 74 20 63 6f 6e 74  ery may not cont
1edb0 61 69 6e 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a  ain a virtual.**
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62               tab
1edd0 6c 65 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  le and.**       
1ede0 20 28 33 63 29 20 74 68 65 20 6f 75 74 65 72 20   (3c) the outer 
1edf0 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1ee00 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a   an aggregate..*
1ee10 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
1ee20 73 75 62 71 75 65 72 79 20 63 61 6e 20 6e 6f 74  subquery can not
1ee30 20 62 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a   be DISTINCT..**
1ee40 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e  .**  (**)  At on
1ee50 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74  e point restrict
1ee60 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29  ions (4) and (5)
1ee70 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73 65   defined a subse
1ee80 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a  t of DISTINCT.**
1ee90 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72          sub-quer
1eea0 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65 78  ies that were ex
1eeb0 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73  cluded from this
1eec0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52   optimization. R
1eed0 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20  estriction .**  
1eee0 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73 69        (4) has si
1eef0 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65  nce been expande
1ef00 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c  d to exclude all
1ef10 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75 65   DISTINCT subque
1ef20 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  ries..**.**  (**
1ef30 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  )  We no longer 
1ef40 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74  attempt to flatt
1ef50 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  en aggregate sub
1ef60 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a  queries.  Was:.*
1ef70 2a 20 20 20 20 20 20 20 20 49 66 20 74 68 65 20  *        If the 
1ef80 73 75 62 71 75 65 72 79 20 69 73 20 61 67 67 72  subquery is aggr
1ef90 65 67 61 74 65 2c 20 74 68 65 20 6f 75 74 65 72  egate, the outer
1efa0 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
1efb0 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a  e DISTINCT..**.*
1efc0 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62  *   (7)  The sub
1efd0 71 75 65 72 79 20 6d 75 73 74 20 68 61 76 65 20  query must have 
1efe0 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  a FROM clause.  
1eff0 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75  TODO:  For subqu
1f000 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a  eries without.**
1f010 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63          A FROM c
1f020 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20  lause, consider 
1f030 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c  adding a FROM cl
1f040 61 75 73 65 20 77 69 74 68 20 74 68 65 20 73 70  ause with the sp
1f050 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ecial.**        
1f060 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63  table sqlite_onc
1f070 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  e that consists 
1f080 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  of a single row 
1f090 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20  containing a.** 
1f0a0 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55         single NU
1f0b0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20  LL..**.**   (8) 
1f0c0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1f0d0 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e   uses LIMIT then
1f0e0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f0f0 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f   may not be a jo
1f100 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20  in..**.**   (9) 
1f110 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1f120 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e   uses LIMIT then
1f130 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f140 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 67 67 72   may not be aggr
1f150 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  egate..**.**  (*
1f160 2a 29 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20  *)  Restriction 
1f170 28 31 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64  (10) was removed
1f180 20 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f   from the code o
1f190 6e 20 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74  n 2005-02-05 but
1f1a0 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63   we.**        ac
1f1b0 63 69 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64  cidently carried
1f1c0 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72   the comment for
1f1d0 77 61 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d  ward until 2014-
1f1e0 30 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c  09-15.  Original
1f1f0 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .**        const
1f200 72 61 69 6e 74 3a 20 22 49 66 20 74 68 65 20 73  raint: "If the s
1f210 75 62 71 75 65 72 79 20 69 73 20 61 67 67 72 65  ubquery is aggre
1f220 67 61 74 65 20 74 68 65 6e 20 74 68 65 20 6f 75  gate then the ou
1f230 74 65 72 20 71 75 65 72 79 20 0a 2a 2a 20 20 20  ter query .**   
1f240 20 20 20 20 20 6d 61 79 20 6e 6f 74 20 75 73 65       may not use
1f250 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20   LIMIT.".**.**  
1f260 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (11)  The subque
1f270 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
1f280 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
1f290 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42  oth have ORDER B
1f2a0 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  Y clauses..**.**
1f2b0 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c    (**)  Not impl
1f2c0 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d  emented.  Subsum
1f2d0 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74  ed into restrict
1f2e0 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72  ion (3).  Was pr
1f2f0 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20  eviously.**     
1f300 20 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65     a separate re
1f310 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69  striction derivi
1f320 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23  ng from ticket #
1f330 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29  350..**.**  (13)
1f340 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1f350 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  nd outer query m
1f360 61 79 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  ay not both use 
1f370 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  LIMIT..**.**  (1
1f380 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
1f390 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4f 46 46   may not use OFF
1f3a0 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29  SET..**.**  (15)
1f3b0 20 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71    If the outer q
1f3c0 75 65 72 79 20 69 73 20 70 61 72 74 20 6f 66 20  uery is part of 
1f3d0 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1f3e0 74 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20  t, then the.**  
1f3f0 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 6d        subquery m
1f400 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  ay not use LIMIT
1f410 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65  ..**        (See
1f420 20 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e   ticket #2339 an
1f430 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38  d ticket [02a8e8
1f440 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  1d44])..**.**  (
1f450 31 36 29 20 20 49 66 20 74 68 65 20 6f 75 74 65  16)  If the oute
1f460 72 20 71 75 65 72 79 20 69 73 20 61 67 67 72 65  r query is aggre
1f470 67 61 74 65 2c 20 74 68 65 6e 20 74 68 65 20 73  gate, then the s
1f480 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a  ubquery may not.
1f490 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4f 52  **        use OR
1f4a0 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74  DER BY.  (Ticket
1f4b0 20 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73   #2942)  This us
1f4c0 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72  ed to not matter
1f4d0 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c  .**        until
1f4e0 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74   we introduced t
1f4f0 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  he group_concat(
1f500 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a  ) function.  .**
1f510 0a 2a 2a 20 20 28 31 37 29 20 20 49 66 20 74 68  .**  (17)  If th
1f520 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20  e subquery is a 
1f530 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1f540 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20   then.**        
1f550 28 31 37 61 29 20 61 6c 6c 20 63 6f 6d 70 6f 75  (17a) all compou
1f560 6e 64 20 6f 70 65 72 61 74 6f 72 73 20 6d 75 73  nd operators mus
1f570 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t be a UNION ALL
1f580 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  , and.**        
1f590 28 31 37 62 29 20 6e 6f 20 74 65 72 6d 73 20 77  (17b) no terms w
1f5a0 69 74 68 69 6e 20 74 68 65 20 73 75 62 71 75 65  ithin the subque
1f5b0 72 79 20 63 6f 6d 70 6f 75 6e 64 20 6d 61 79 20  ry compound may 
1f5c0 62 65 20 61 67 67 72 65 67 61 74 65 0a 2a 2a 20  be aggregate.** 
1f5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 20               or 
1f5e0 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 0a 2a 2a  DISTINCT, and.**
1f5f0 20 20 20 20 20 20 20 20 28 31 37 63 29 20 65 76          (17c) ev
1f600 65 72 79 20 74 65 72 6d 20 77 69 74 68 69 6e 20  ery term within 
1f610 74 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d  the subquery com
1f620 70 6f 75 6e 64 20 6d 75 73 74 20 68 61 76 65 20  pound must have 
1f630 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a  a FROM clause.**
1f640 20 20 20 20 20 20 20 20 28 31 37 64 29 20 74 68          (17d) th
1f650 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61  e outer query ma
1f660 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20  y not be.**     
1f670 20 20 20 20 20 20 20 20 20 28 31 37 64 31 29 20           (17d1) 
1f680 61 67 67 72 65 67 61 74 65 2c 20 6f 72 0a 2a 2a  aggregate, or.**
1f690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31                (1
1f6a0 37 64 32 29 20 44 49 53 54 49 4e 43 54 2c 20 6f  7d2) DISTINCT, o
1f6b0 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
1f6c0 20 20 28 31 37 64 33 29 20 61 20 6a 6f 69 6e 2e    (17d3) a join.
1f6d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  .**.**        Th
1f6e0 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62  e parent and sub
1f6f0 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61  -query may conta
1f700 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  in WHERE clauses
1f710 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  . Subject to.** 
1f720 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31         rules (11
1f730 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29  ), (13) and (14)
1f740 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20  , they may also 
1f750 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
1f760 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49  ,.**        LIMI
1f770 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
1f780 75 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75  uses.  The subqu
1f790 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61  ery cannot use a
1f7a0 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
1f7b0 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f        operator o
1f7c0 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
1f7d0 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20  ALL because all 
1f7e0 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75  the other compou
1f7f0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65  nd.**        ope
1f800 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69  rators have an i
1f810 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20  mplied DISTINCT 
1f820 77 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f  which is disallo
1f830 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20  wed by.**       
1f840 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   restriction (4)
1f850 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41  ..**.**        A
1f860 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e  lso, each compon
1f870 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71  ent of the sub-q
1f880 75 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e  uery must return
1f890 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
1f8a0 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65  .**        of re
1f8b0 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68  sult columns. Th
1f8c0 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  is is actually a
1f8d0 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72   requirement for
1f8e0 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
1f8f0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73          SELECT s
1f900 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c  tatement, but al
1f910 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20  l the code here 
1f920 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72  does is make sur
1f930 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20  e that no.**    
1f940 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61      such (illega
1f950 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  l) sub-query is 
1f960 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63  flattened. The c
1f970 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63  aller will detec
1f980 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  t the.**        
1f990 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64  syntax error and
1f9a0 20 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c   return a detail
1f9b0 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  ed message..**.*
1f9c0 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20  *  (18)  If the 
1f9d0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1f9e0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1f9f0 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  then all terms o
1fa00 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  f the.**        
1fa10 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1fa20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75  of the parent mu
1fa30 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66  st be simple ref
1fa40 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20  erences to .**  
1fa50 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66        columns of
1fa60 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a   the sub-query..
1fa70 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 49 66 20  **.**  (19)  If 
1fa80 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1fa90 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
1faa0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1fab0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68   not.**        h
1fac0 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ave a WHERE clau
1fad0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20  se..**.**  (20) 
1fae0 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1faf0 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1fb00 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20  select, then it 
1fb10 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  must not use.** 
1fb20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20         an ORDER 
1fb30 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b  BY clause.  Tick
1fb40 65 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f  et #3773.  We co
1fb50 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63  uld relax this c
1fb60 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20  onstraint.**    
1fb70 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20      somewhat by 
1fb80 73 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20  saying that the 
1fb90 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
1fba0 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73  ER BY clause mus
1fbb0 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65  t.**        appe
1fbc0 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64  ar as unmodified
1fbd0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
1fbe0 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
1fbf0 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20  ry.  But we.**  
1fc00 20 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72        have other
1fc10 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69   optimizations i
1fc20 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77  n mind to deal w
1fc30 69 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a  ith that case..*
1fc40 2a 0a 2a 2a 20 20 28 32 31 29 20 20 49 66 20 74  *.**  (21)  If t
1fc50 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1fc60 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20   LIMIT then the 
1fc70 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20  outer query may 
1fc80 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  not be.**       
1fc90 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65   DISTINCT.  (See
1fca0 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34   ticket [752e164
1fcb0 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  6fc])..**.**  (2
1fcc0 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
1fcd0 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 72 65   may not be a re
1fce0 63 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a  cursive CTE..**.
1fcf0 2a 2a 20 20 28 2a 2a 29 20 20 53 75 62 73 75 6d  **  (**)  Subsum
1fd00 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74  ed into restrict
1fd10 69 6f 6e 20 28 31 37 64 33 29 2e 20 20 57 61 73  ion (17d3).  Was
1fd20 3a 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71  : If the outer q
1fd30 75 65 72 79 20 69 73 0a 2a 2a 20 20 20 20 20 20  uery is.**      
1fd40 20 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54    a recursive CT
1fd50 45 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 2d  E, then the sub-
1fd60 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1fd70 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
1fd80 79 2e 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 69  y..**        Thi
1fd90 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73  s restriction is
1fda0 20 62 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f   because transfo
1fdb0 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20  rming the.**    
1fdc0 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20      parent to a 
1fdd0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63  compound query c
1fde0 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64 65  onfuses the code
1fdf0 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a   that handles.**
1fe00 20 20 20 20 20 20 20 20 72 65 63 75 72 73 69 76          recursiv
1fe10 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c  e queries in mul
1fe20 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a  tiSelect()..**.*
1fe30 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c  *  (**)  We no l
1fe40 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f  onger attempt to
1fe50 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61   flatten aggrega
1fe60 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 20  te subqueries.  
1fe70 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54  Was:.**        T
1fe80 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20  he subquery may 
1fe90 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67  not be an aggreg
1fea0 61 74 65 20 74 68 61 74 20 75 73 65 73 20 74 68  ate that uses th
1feb0 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29  e built-in min()
1fec0 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f   or .**        o
1fed0 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e  r max() function
1fee0 73 2e 20 20 28 57 69 74 68 6f 75 74 20 74 68 69  s.  (Without thi
1fef0 73 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 61  s restriction, a
1ff00 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20   query like:.** 
1ff10 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 78         "SELECT x
1ff20 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61   FROM (SELECT ma
1ff30 78 28 79 29 2c 20 78 20 46 52 4f 4d 20 74 31 29  x(y), x FROM t1)
1ff40 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65  " would not nece
1ff50 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20  ssarily.**      
1ff60 20 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c    return the val
1ff70 75 65 20 58 20 66 6f 72 20 77 68 69 63 68 20 59  ue X for which Y
1ff80 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a   was maximal.).*
1ff90 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  *.**.** In this 
1ffa0 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22  routine, the "p"
1ffb0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
1ffc0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
1ffd0 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54  uter query..** T
1ffe0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
1fff0 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  ->pSrc->a[iFrom]
20000 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65  .  isAgg is true
20010 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
20020 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72  ery.** uses aggr
20030 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
20040 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
20050 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
20060 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
20070 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
20080 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  s 0..** If flatt
20090 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
200a0 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
200b0 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
200c0 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
200d0 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
200e0 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
200f0 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
20100 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
20110 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
20120 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
20130 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
20140 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a  lattenSubquery(.
20150 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
20160 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
20170 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
20180 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
20190 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
201a0 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43  t or outer SELEC
201b0 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
201c0 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
201d0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
201e0 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f  n p->pSrc->a[] o
201f0 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71  f the inner subq
20200 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
20210 41 67 67 20 20 20 20 20 20 20 20 20 20 20 20 2f  Agg            /
20220 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20  * True if outer 
20230 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72  SELECT uses aggr
20240 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
20250 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
20260 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
20270 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
20280 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
20290 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b  Select *pParent;
202a0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 55      /* Current U
202b0 4e 49 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66  NION ALL term of
202c0 20 74 68 65 20 6f 74 68 65 72 20 71 75 65 72 79   the other query
202d0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
202e0 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ub;       /* The
202f0 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20   inner query or 
20300 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20  "subquery" */.  
20310 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20  Select *pSub1;  
20320 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
20330 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  o the rightmost 
20340 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75  select in sub-qu
20350 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
20360 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20   *pSrc;      /* 
20370 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
20380 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
20390 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
203a0 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54  *pSubSrc;   /* T
203b0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
203c0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  f the subquery *
203d0 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
203e0 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
203f0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
20400 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74   the pSub result
20410 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20   set temp table 
20420 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 50 61 72  */.  int iNewPar
20430 65 6e 74 20 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c  ent = -1;/* Repl
20440 61 63 65 6d 65 6e 74 20 74 61 62 6c 65 20 66 6f  acement table fo
20450 72 20 69 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69  r iParent */.  i
20460 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20  nt isLeftJoin = 
20470 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 70 53  0; /* True if pS
20480 75 62 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ub is the right 
20490 73 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  side of a LEFT J
204a0 4f 49 4e 20 2a 2f 20 20 20 20 0a 20 20 69 6e 74  OIN */    .  int
204b0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
204c0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
204d0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
204e0 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
204f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
20500 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
20510 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
20520 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20  tem *pSubitem;  
20530 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
20540 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
20550 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
20560 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
20570 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
20580 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
20590 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
205a0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
205b0 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
205c0 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
205d0 3b 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  ;.  if( Optimiza
205e0 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
205f0 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61   SQLITE_QueryFla
20600 74 74 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e  ttener) ) return
20610 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
20620 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
20630 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
20640 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
20650 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74  nSrc );.  pSubit
20660 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46  em = &pSrc->a[iF
20670 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20  rom];.  iParent 
20680 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72  = pSubitem->iCur
20690 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53  sor;.  pSub = pS
206a0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
206b0 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21  .  assert( pSub!
206c0 3d 30 20 29 3b 0a 0a 20 20 70 53 75 62 53 72 63  =0 );..  pSubSrc
206d0 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20   = pSub->pSrc;. 
206e0 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63   assert( pSubSrc
206f0 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74   );.  /* Prior t
20700 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c  o version 3.1.2,
20710 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
20720 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65  OFFSET had to be
20730 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74   simple constant
20740 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69  s,.  ** not arbi
20750 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  trary expression
20760 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f  s, we allowed so
20770 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20  me combining of 
20780 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
20790 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68  .  ** because th
207a0 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70  ey could be comp
207b0 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  uted at compile-
207c0 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20  time.  But when 
207d0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
207e0 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62  .  ** became arb
207f0 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
20800 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63  ns, we were forc
20810 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69  ed to add restri
20820 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a  ctions (13).  **
20830 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20   and (14). */.  
20840 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
20850 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20   && p->pLimit ) 
20860 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
20870 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
20880 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20  ction (13) */.  
20890 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
208a0 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   && pSub->pLimit
208b0 2d 3e 70 52 69 67 68 74 20 29 20 72 65 74 75 72  ->pRight ) retur
208c0 6e 20 30 3b 20 20 20 2f 2a 20 52 65 73 74 72 69  n 0;   /* Restri
208d0 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20  ction (14) */.  
208e0 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
208f0 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21   & SF_Compound)!
20900 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d  =0 && pSub->pLim
20910 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  it ){.    return
20920 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
20930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20950 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
20960 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  5) */.  }.  if( 
20970 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  pSubSrc->nSrc==0
20980 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
20990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209a0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
209b0 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (7)  */.  if( 
209c0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
209d0 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72   SF_Distinct ) r
209e0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
209f0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
20a00 6e 20 28 34 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (4)  */.  if( 
20a10 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
20a20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c  (pSrc->nSrc>1 ||
20a30 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20   isAgg) ){.     
20a40 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
20a50 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
20a60 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a  s (8)(9) */.  }.
20a70 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
20a80 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  y && pSub->pOrde
20a90 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75  rBy ){.     retu
20aa0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
20ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ad0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
20ae0 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  11) */.  }.  if(
20af0 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e   isAgg && pSub->
20b00 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72  pOrderBy ) retur
20b10 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
20b20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
20b30 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28  on (16) */.  if(
20b40 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
20b50 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
20b60 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
20b70 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
20b80 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28  on (19) */.  if(
20b90 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
20ba0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
20bb0 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
20bc0 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
20bd0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
20be0 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f  triction (21) */
20bf0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d  .  }.  if( pSub-
20c00 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
20c10 52 65 63 75 72 73 69 76 65 29 20 29 7b 0a 20 20  Recursive) ){.  
20c20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52    return 0; /* R
20c30 65 73 74 72 69 63 74 69 6f 6e 73 20 28 32 32 29  estrictions (22)
20c40 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20   */.  }..  /*.  
20c50 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65  ** If the subque
20c60 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
20c70 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46  operand of a LEF
20c80 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68 65  T JOIN, then the
20c90 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 6d  .  ** subquery m
20ca0 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e  ay not be a join
20cb0 20 69 74 73 65 6c 66 20 28 33 61 29 2e 20 45 78   itself (3a). Ex
20cc0 61 6d 70 6c 65 20 6f 66 20 77 68 79 20 74 68 69  ample of why thi
20cd0 73 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 6c  s is not.  ** al
20ce0 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
20cf0 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
20d00 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20   OUTER JOIN (t2 
20d10 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20  JOIN t3).  **.  
20d20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
20d30 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
20d40 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
20d50 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
20d60 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
20d70 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a  2) JOIN t3.  **.
20d80 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f    ** which is no
20d90 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d  t at all the sam
20da0 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20  e thing..  **.  
20db0 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65  ** If the subque
20dc0 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
20dd0 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46  operand of a LEF
20de0 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68 65  T JOIN, then the
20df0 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71 75 65 72   outer.  ** quer
20e00 79 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 61  y cannot be an a
20e10 67 67 72 65 67 61 74 65 2e 20 28 33 63 29 20 20  ggregate. (3c)  
20e20 54 68 69 73 20 69 73 20 61 6e 20 61 72 74 69 66  This is an artif
20e30 61 63 74 20 6f 66 20 74 68 65 20 77 61 79 0a 20  act of the way. 
20e40 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73 20 61   ** aggregates a
20e50 72 65 20 70 72 6f 63 65 73 73 65 64 20 2d 20 74  re processed - t
20e60 68 65 72 65 20 69 73 20 6e 6f 20 6d 65 63 68 61  here is no mecha
20e70 6e 69 73 6d 20 74 6f 20 64 65 74 65 72 6d 69 6e  nism to determin
20e80 65 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 4c 45  e if.  ** the LE
20e90 46 54 20 4a 4f 49 4e 20 74 61 62 6c 65 20 73 68  FT JOIN table sh
20ea0 6f 75 6c 64 20 62 65 20 61 6c 6c 2d 4e 55 4c 4c  ould be all-NULL
20eb0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20  ..  **.  ** See 
20ec0 61 6c 73 6f 20 74 69 63 6b 65 74 73 20 23 33 30  also tickets #30
20ed0 36 2c 20 23 33 35 30 2c 20 61 6e 64 20 23 33 33  6, #350, and #33
20ee0 30 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  00..  */.  if( (
20ef0 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69  pSubitem->fg.joi
20f00 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
20f10 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 73 4c 65  )!=0 ){.    isLe
20f20 66 74 4a 6f 69 6e 20 3d 20 31 3b 0a 20 20 20 20  ftJoin = 1;.    
20f30 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
20f40 63 3e 31 20 7c 7c 20 69 73 41 67 67 20 7c 7c 20  c>1 || isAgg || 
20f50 49 73 56 69 72 74 75 61 6c 28 70 53 75 62 53 72  IsVirtual(pSubSr
20f60 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29 7b  c->a[0].pTab) ){
20f70 0a 20 20 20 20 20 20 2f 2a 20 20 28 33 61 29 20  .      /*  (3a) 
20f80 20 20 20 20 20 20 20 20 20 20 20 20 28 33 63 29              (3c)
20f90 20 20 20 20 20 28 33 62 29 20 2a 2f 0a 20 20 20       (3b) */.   
20fa0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
20fb0 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
20fc0 4c 49 54 45 5f 45 58 54 52 41 5f 49 46 4e 55 4c  LITE_EXTRA_IFNUL
20fd0 4c 52 4f 57 0a 20 20 65 6c 73 65 20 69 66 28 20  LROW.  else if( 
20fe0 69 46 72 6f 6d 3e 30 20 26 26 20 21 69 73 41 67  iFrom>0 && !isAg
20ff0 67 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74 74  g ){.    /* Sett
21000 69 6e 67 20 69 73 4c 65 66 74 4a 6f 69 6e 20 74  ing isLeftJoin t
21010 6f 20 2d 31 20 63 61 75 73 65 73 20 4f 50 5f 49  o -1 causes OP_I
21020 66 4e 75 6c 6c 52 6f 77 20 6f 70 63 6f 64 65 73  fNullRow opcodes
21030 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64   to be generated
21040 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72   for.    ** ever
21050 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  y reference to a
21060 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ny result column
21070 20 66 72 6f 6d 20 73 75 62 71 75 65 72 79 20 69   from subquery i
21080 6e 20 61 20 6a 6f 69 6e 2c 20 65 76 65 6e 0a 20  n a join, even. 
21090 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 74 68 65     ** though the
210a0 79 20 61 72 65 20 6e 6f 74 20 6e 65 63 65 73 73  y are not necess
210b0 61 72 79 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ary.  This will 
210c0 73 74 72 65 73 73 2d 74 65 73 74 20 74 68 65 20  stress-test the 
210d0 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 0a 20 20  OP_IfNullRow .  
210e0 20 20 2a 2a 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a    ** opcode. */.
210f0 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d      isLeftJoin =
21100 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   -1;.  }.#endif.
21110 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
21120 6e 20 28 31 37 29 3a 20 49 66 20 74 68 65 20 73  n (17): If the s
21130 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
21140 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74  mpound SELECT, t
21150 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a  hen it must.  **
21160 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e   use only the UN
21170 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
21180 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68  . And none of th
21190 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20  e simple select 
211a0 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61  queries.  ** tha
211b0 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f  t make up the co
211c0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72  mpound SELECT ar
211d0 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  e allowed to be 
211e0 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69 73  aggregate or dis
211f0 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69  tinct.  ** queri
21200 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  es..  */.  if( p
21210 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  Sub->pPrior ){. 
21220 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
21230 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72  derBy ){.      r
21240 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73  eturn 0;  /* Res
21250 74 72 69 63 74 69 6f 6e 20 28 32 30 29 20 2a 2f  triction (20) */
21260 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
21270 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46  sAgg || (p->selF
21280 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
21290 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e  ct)!=0 || pSrc->
212a0 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  nSrc!=1 ){.     
212b0 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 28 31   return 0; /* (1
212c0 37 64 31 29 2c 20 28 31 37 64 32 29 2c 20 6f 72  7d1), (17d2), or
212d0 20 28 31 37 64 33 29 20 2a 2f 0a 20 20 20 20 7d   (17d3) */.    }
212e0 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70  .    for(pSub1=p
212f0 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62  Sub; pSub1; pSub
21300 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29  1=pSub1->pPrior)
21310 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
21320 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
21330 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
21340 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
21350 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  ==SF_Distinct );
21360 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21370 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
21380 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
21390 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
213a0 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b  =SF_Aggregate );
213b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
213c0 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a  Sub->pSrc!=0 );.
213d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
213e0 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ub->pEList->nExp
213f0 72 3d 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74  r==pSub1->pEList
21400 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
21410 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c   if( (pSub1->sel
21420 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
21430 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
21440 65 29 29 21 3d 30 20 20 20 20 2f 2a 20 28 31 37  e))!=0    /* (17
21450 62 29 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20  b) */.       || 
21460 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26  (pSub1->pPrior &
21470 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f  & pSub1->op!=TK_
21480 41 4c 4c 29 20 20 20 20 20 20 20 20 20 20 20 20  ALL)            
21490 20 20 20 20 20 2f 2a 20 28 31 37 61 29 20 2a 2f       /* (17a) */
214a0 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31  .       || pSub1
214b0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 20 20  ->pSrc->nSrc<1  
214c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214e0 2f 2a 20 28 31 37 63 29 20 2a 2f 0a 20 20 20 20  /* (17c) */.    
214f0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74    ){.        ret
21500 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
21510 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21520 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  Sub1->pSrc->nSrc
21530 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  >1 );.    }..   
21540 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
21550 28 31 38 29 2e 20 2a 2f 0a 20 20 20 20 69 66 28  (18). */.    if(
21560 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
21570 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
21580 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
21590 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  <p->pOrderBy->nE
215a0 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  xpr; ii++){.    
215b0 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
215c0 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69  rBy->a[ii].u.x.i
215d0 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20  OrderByCol==0 ) 
215e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
215f0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
21600 2a 20 45 78 2d 72 65 73 74 72 69 63 74 69 6f 6e  * Ex-restriction
21610 20 28 32 33 29 3a 0a 20 20 2a 2a 20 54 68 65 20   (23):.  ** The 
21620 6f 6e 6c 79 20 77 61 79 20 74 68 61 74 20 74 68  only way that th
21630 65 20 72 65 63 75 72 73 69 76 65 20 70 61 72 74  e recursive part
21640 20 6f 66 20 61 20 43 54 45 20 63 61 6e 20 63 6f   of a CTE can co
21650 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  ntain a compound
21660 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69  .  ** subquery i
21670 73 20 66 6f 72 20 74 68 65 20 73 75 62 71 75 65  s for the subque
21680 72 79 20 74 6f 20 62 65 20 6f 6e 65 20 74 65 72  ry to be one ter
21690 6d 20 6f 66 20 61 20 6a 6f 69 6e 2e 20 20 42 75  m of a join.  Bu
216a0 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 73 75  t if the.  ** su
216b0 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e  bquery is a join
216c0 2c 20 74 68 65 6e 20 74 68 65 20 66 6c 61 74 74  , then the flatt
216d0 65 6e 69 6e 67 20 68 61 73 20 61 6c 72 65 61 64  ening has alread
216e0 79 20 62 65 65 6e 20 73 74 6f 70 70 65 64 20 62  y been stopped b
216f0 79 0a 20 20 2a 2a 20 72 65 73 74 72 69 63 74 69  y.  ** restricti
21700 6f 6e 20 28 31 37 64 33 29 0a 20 20 2a 2f 0a 20  on (17d3).  */. 
21710 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
21720 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
21730 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 53 75 62  sive)==0 || pSub
21740 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 0a  ->pPrior==0 );..
21750 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72    /***** If we r
21760 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
21770 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
21780 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f  ermitted. *****/
21790 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31  .  SELECTTRACE(1
217a0 2c 70 50 61 72 73 65 2c 70 2c 28 22 66 6c 61 74  ,pParse,p,("flat
217b0 74 65 6e 20 25 73 2e 25 70 20 66 72 6f 6d 20 74  ten %s.%p from t
217c0 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  erm %d\n",.     
217d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
217e0 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 53  ub->zSelName, pS
217f0 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20  ub, iFrom));..  
21800 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65  /* Authorize the
21810 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70   subquery */.  p
21820 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
21830 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ext = pSubitem->
21840 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c  zName;.  TESTONL
21850 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75  Y(i =) sqlite3Au
21860 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
21870 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
21880 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63  , 0, 0);.  testc
21890 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44  ase( i==SQLITE_D
218a0 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  ENY );.  pParse-
218b0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
218c0 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
218d0 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  t;..  /* If the 
218e0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
218f0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
21900 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28  tatement, then (
21910 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a  by restrictions.
21920 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61    ** 17 and 18 a
21930 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62 65  bove) it must be
21940 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64   a UNION ALL and
21950 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
21960 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20  y must .  ** be 
21970 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a  of the form:.  *
21980 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
21990 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52  T <expr-list> FR
219a0 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29  OM (<sub-query>)
219b0 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20   <where-clause> 
219c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  .  **.  ** follo
219d0 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52  wed by any ORDER
219e0 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f   BY, LIMIT and/o
219f0 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  r OFFSET clauses
21a00 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a  . This block.  *
21a10 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f  * creates N-1 co
21a20 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65  pies of the pare
21a30 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74  nt query without
21a40 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c   any ORDER BY, L
21a50 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46  IMIT or .  ** OF
21a60 46 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64  FSET clauses and
21a70 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74   joins them to t
21a80 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64  he left-hand-sid
21a90 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
21aa0 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49  l.  ** using UNI
21ab0 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73  ON ALL operators
21ac0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e  . In this case N
21ad0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
21ae0 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65  f simple.  ** se
21af0 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20  lect statements 
21b00 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  in the compound 
21b10 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a  sub-query..  **.
21b20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
21b30 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
21b40 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20  CT a+1 FROM (.  
21b50 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
21b60 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   x FROM tab.  **
21b70 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
21b80 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
21b90 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a  LECT y FROM tab.
21ba0 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
21bb0 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
21bc0 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32    SELECT abs(z*2
21bd0 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a  ) FROM tab2.  **
21be0 20 20 20 20 20 29 20 57 48 45 52 45 20 61 21 3d       ) WHERE a!=
21bf0 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a  5 ORDER BY 1.  *
21c00 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d  *.  ** Transform
21c10 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20  ed into:.  **.  
21c20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
21c30 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45  1 FROM tab WHERE
21c40 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20   x+1!=5.  **    
21c50 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
21c60 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46      SELECT y+1 F
21c70 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b  ROM tab WHERE y+
21c80 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e  1!=5.  **     UN
21c90 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
21ca0 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29   SELECT abs(z*2)
21cb0 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45  +1 FROM tab2 WHE
21cc0 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35  RE abs(z*2)+1!=5
21cd0 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20  .  **     ORDER 
21ce0 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  BY 1.  **.  ** W
21cf0 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20  e call this the 
21d00 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65  "compound-subque
21d10 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a  ry flattening"..
21d20 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d    */.  for(pSub=
21d30 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53  pSub->pPrior; pS
21d40 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70  ub; pSub=pSub->p
21d50 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65  Prior){.    Sele
21d60 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78  ct *pNew;.    Ex
21d70 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
21d80 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
21d90 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
21da0 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
21db0 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
21dc0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
21dd0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
21de0 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  0;.    p->pSrc =
21df0 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f   0;.    p->pPrio
21e00 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c  r = 0;.    p->pL
21e10 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  imit = 0;.    pN
21e20 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ew = sqlite3Sele
21e30 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b  ctDup(db, p, 0);
21e40 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
21e50 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20  ctSetName(pNew, 
21e60 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b  pSub->zSelName);
21e70 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
21e80 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e   pLimit;.    p->
21e90 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
21ea0 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  rBy;.    p->pSrc
21eb0 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e   = pSrc;.    p->
21ec0 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20  op = TK_ALL;.   
21ed0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
21ee0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
21ef0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65  = pPrior;.    }e
21f00 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
21f10 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
21f20 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
21f30 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65  or ) pPrior->pNe
21f40 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  xt = pNew;.     
21f50 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
21f60 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
21f70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  r = pNew;.      
21f80 53 45 4c 45 43 54 54 52 41 43 45 28 32 2c 70 50  SELECTTRACE(2,pP
21f90 61 72 73 65 2c 70 2c 28 22 63 6f 6d 70 6f 75 6e  arse,p,("compoun
21fa0 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
21fb0 65 6e 65 72 22 0a 20 20 20 20 20 20 20 20 20 20  ener".          
21fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fd0 20 20 20 20 22 20 63 72 65 61 74 65 73 20 25 73      " creates %s
21fe0 2e 25 70 20 61 73 20 70 65 65 72 5c 6e 22 2c 70  .%p as peer\n",p
21ff0 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70  New->zSelName, p
22000 4e 65 77 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  New));.    }.   
22010 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
22020 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
22030 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
22040 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  n flattening the
22050 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20   iFrom-th entry 
22060 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
22070 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  se .  ** in the 
22080 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
22090 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31  /.  pSub = pSub1
220a0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
220b0 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  lect;..  /* Dele
220c0 74 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  te the transient
220d0 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
220e0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
220f0 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
22100 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
22110 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
22120 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  item->zDatabase)
22130 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
22140 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
22150 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
22160 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
22170 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  item->zAlias);. 
22180 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
22190 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62  base = 0;.  pSub
221a0 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  item->zName = 0;
221b0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  .  pSubitem->zAl
221c0 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ias = 0;.  pSubi
221d0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30  tem->pSelect = 0
221e0 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65  ;..  /* Defer de
221f0 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65  leting the Table
22200 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
22210 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
22220 20 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20   subquery until 
22230 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  code generation 
22240 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65  is.  ** complete
22250 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61  , since there ma
22260 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78  y still exist Ex
22270 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20  pr.pTab entries 
22280 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20  that.  ** refer 
22290 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
222a0 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74  even after flatt
222b0 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23  ening.  Ticket #
222c0 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  3346..  **.  ** 
222d0 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69  pSubitem->pTab i
222e0 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c  s always non-NUL
222f0 4c 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69  L by test restri
22300 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73  ctions and tests
22310 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69   above..  */.  i
22320 66 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74  f( ALWAYS(pSubit
22330 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a  em->pTab!=0) ){.
22340 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54      Table *pTabT
22350 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d  oDel = pSubitem-
22360 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
22370 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65  TabToDel->nTabRe
22380 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61  f==1 ){.      Pa
22390 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
223a0 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
223b0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
223c0 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
223d0 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54  pNextZombie = pT
223e0 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
223f0 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c  Tab;.      pTopl
22400 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
22410 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20   = pTabToDel;.  
22420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
22430 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65  TabToDel->nTabRe
22440 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  f--;.    }.    p
22450 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20  Subitem->pTab = 
22460 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  0;.  }..  /* The
22470 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20   following loop 
22480 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
22490 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d  ch term in a com
224a0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20  pound-subquery. 
224b0 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28   ** flattening (
224c0 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
224d0 76 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20  ve).  If we are 
224e0 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  doing a differen
224f0 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66  t kind.  ** of f
22500 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c  lattening - a fl
22510 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74  attening other t
22520 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73  han a compound-s
22530 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
22540 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ng -.  ** then t
22550 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75  his loop only ru
22560 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20  ns once..  **.  
22570 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76  ** This loop mov
22580 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52  es all of the FR
22590 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  OM elements of t
225a0 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
225b0 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52   the.  ** the FR
225c0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
225d0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
225e0 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73  efore doing this
225f0 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  , remember.  ** 
22600 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
22610 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  r for the origin
22620 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46  al outer query F
22630 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20  ROM element in. 
22640 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68   ** iParent.  Th
22650 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72  e iParent cursor
22660 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
22670 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74  sed.  Subsequent
22680 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   code.  ** will 
22690 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  scan expressions
226a0 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61   looking for iPa
226b0 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  rent references 
226c0 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  and replace.  **
226d0 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65   those reference
226e0 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f  s with expressio
226f0 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20  ns that resolve 
22700 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
22710 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e  FROM.  ** elemen
22720 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f  ts we are now co
22730 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20  pying in..  */. 
22740 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20   for(pParent=p; 
22750 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74  pParent; pParent
22760 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72  =pParent->pPrior
22770 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  , pSub=pSub->pPr
22780 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  ior){.    int nS
22790 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f  ubSrc;.    u8 jo
227a0 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  intype = 0;.    
227b0 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
227c0 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f  pSrc;     /* FRO
227d0 4d 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71  M clause of subq
227e0 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62  uery */.    nSub
227f0 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e  Src = pSubSrc->n
22800 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  Src;  /* Number 
22810 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71  of terms in subq
22820 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65  uery FROM clause
22830 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70   */.    pSrc = p
22840 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20  Parent->pSrc;   
22850 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
22860 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
22870 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  ery */..    if( 
22880 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73  pSrc ){.      as
22890 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70  sert( pParent==p
228a0 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69   );  /* First ti
228b0 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  me through the l
228c0 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69  oop */.      joi
228d0 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d  ntype = pSubitem
228e0 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20  ->fg.jointype;. 
228f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22900 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21  assert( pParent!
22910 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e  =p );  /* 2nd an
22920 64 20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d  d subsequent tim
22930 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  es through the l
22940 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72  oop */.      pSr
22950 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  c = pParent->pSr
22960 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
22970 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20  stAppend(db, 0, 
22980 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
22990 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   pSrc==0 ){.    
229a0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
229b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
229c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
229d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
229e0 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
229f0 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20  y uses a single 
22a00 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  slot of the FROM
22a10 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
22a20 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72  uter.    ** quer
22a30 79 2e 20 20 49 66 20 74 68 65 20 73 75 62 71 75  y.  If the subqu
22a40 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61  ery has more tha
22a50 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e  n one element in
22a60 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65   its FROM clause
22a70 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78  ,.    ** then ex
22a80 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71  pand the outer q
22a90 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61  uery to make spa
22aa0 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c  ce for it to hol
22ab0 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20  d all elements. 
22ac0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62     ** of the sub
22ad0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20  query..    **.  
22ae0 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
22af0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53    **.    **    S
22b00 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62  ELECT * FROM tab
22b10 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  A, (SELECT * FRO
22b20 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74  M sub1, sub2), t
22b30 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  abB;.    **.    
22b40 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  ** The outer que
22b50 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69  ry has 3 slots i
22b60 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73  n its FROM claus
22b70 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20  e.  One slot of 
22b80 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
22b90 20 71 75 65 72 79 20 28 74 68 65 20 6d 69 64 64   query (the midd
22ba0 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64  le slot) is used
22bb0 20 62 79 20 74 68 65 20 73 75 62 71 75 65 72 79   by the subquery
22bc0 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20  .  The next.    
22bd0 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ** block of code
22be0 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65   will expand the
22bf0 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f   outer query FRO
22c00 4d 20 63 6c 61 75 73 65 20 74 6f 20 34 20 73 6c  M clause to 4 sl
22c10 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ots..    ** The 
22c20 6d 69 64 64 6c 65 20 73 6c 6f 74 20 69 73 20 65  middle slot is e
22c30 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73  xpanded to two s
22c40 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  lots in order to
22c50 20 6d 61 6b 65 20 73 70 61 63 65 0a 20 20 20 20   make space.    
22c60 2a 2a 20 66 6f 72 20 74 68 65 20 74 77 6f 20 65  ** for the two e
22c70 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46  lements in the F
22c80 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
22c90 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  e subquery..    
22ca0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53  */.    if( nSubS
22cb0 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50  rc>1 ){.      pP
22cc0 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53  arent->pSrc = pS
22cd0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
22ce0 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
22cf0 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69  Src, nSubSrc-1,i
22d00 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69  From+1);.      i
22d10 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
22d20 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62  led ){.        b
22d30 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
22d40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e    }..    /* Tran
22d50 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c  sfer the FROM cl
22d60 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20  ause terms from 
22d70 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
22d80 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  o the.    ** out
22d90 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f  er query..    */
22da0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
22db0 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
22dc0 20 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69       sqlite3IdLi
22dd0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72  stDelete(db, pSr
22de0 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55  c->a[i+iFrom].pU
22df0 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 61 73 73  sing);.      ass
22e00 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69  ert( pSrc->a[i+i
22e10 46 72 6f 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75  From].fg.isTabFu
22e20 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  nc==0 );.      p
22e30 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20  Src->a[i+iFrom] 
22e40 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b  = pSubSrc->a[i];
22e50 0a 20 20 20 20 20 20 69 4e 65 77 50 61 72 65 6e  .      iNewParen
22e60 74 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69  t = pSubSrc->a[i
22e70 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ].iCursor;.     
22e80 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
22e90 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
22ea0 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
22eb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
22ec0 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a  c->a[iFrom].fg.j
22ed0 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
22ee0 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
22ef0 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
22f00 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
22f10 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
22f20 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
22f30 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
22f40 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
22f50 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
22f60 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
22f70 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
22f80 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
22f90 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
22fa0 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
22fb0 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
22fc0 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
22fd0 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
22fe0 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
22ff0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
23000 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
23010 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
23020 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
23030 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
23040 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
23050 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23060 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
23070 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
23080 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
23090 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
230a0 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
230b0 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
230c0 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
230d0 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
230e0 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
230f0 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
23100 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
23110 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
23120 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
23130 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
23140 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72  int, any non-zer
23150 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61  o iOrderByCol va
23160 6c 75 65 73 20 69 6e 64 69 63 61 74 65 20 74 68  lues indicate th
23170 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
23180 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20  ORDER BY column 
23190 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 64  expression is id
231a0 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 65 20 69  entical to the i
231b0 4f 72 64 65 72 42 79 43 6f 6c 27 74 68 0a 20 20  OrderByCol'th.  
231c0 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
231d0 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45  n returned by SE
231e0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
231f0 53 75 62 2e 20 53 69 6e 63 65 20 74 68 65 73 65  Sub. Since these
23200 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a   values.      **
23210 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   do not necessar
23220 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  ily correspond t
23230 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c  o columns in SEL
23240 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 50  ECT statement pP
23250 61 72 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20  arent,.      ** 
23260 7a 65 72 6f 20 74 68 65 6d 20 62 65 66 6f 72 65  zero them before
23270 20 74 72 61 6e 73 66 65 72 69 6e 67 20 74 68 65   transfering the
23280 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
23290 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
232a0 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68   ** Not doing th
232b0 69 73 20 6d 61 79 20 63 61 75 73 65 20 61 6e 20  is may cause an 
232c0 65 72 72 6f 72 20 69 66 20 61 20 73 75 62 73 65  error if a subse
232d0 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68  quent call to th
232e0 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  is.      ** func
232f0 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
23300 20 66 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f   flatten a compo
23310 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 6e  und sub-query in
23320 74 6f 20 70 50 61 72 65 6e 74 0a 20 20 20 20 20  to pParent.     
23330 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77 61   ** (the only wa
23340 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  y this can happe
23350 6e 20 69 73 20 69 66 20 74 68 65 20 63 6f 6d 70  n is if the comp
23360 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69  ound sub-query i
23370 73 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65  s.      ** curre
23380 6e 74 6c 79 20 70 61 72 74 20 6f 66 20 70 53 75  ntly part of pSu
23390 62 2d 3e 70 53 72 63 29 2e 20 53 65 65 20 74 69  b->pSrc). See ti
233a0 63 6b 65 74 20 5b 64 31 31 61 36 65 39 30 38 66  cket [d11a6e908f
233b0 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ].  */.      Exp
233c0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
233d0 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  = pSub->pOrderBy
233e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
233f0 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
23400 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
23410 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
23420 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
23430 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
23440 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
23450 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ent->pOrderBy==0
23460 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
23470 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  t->pOrderBy = pO
23480 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53  rderBy;.      pS
23490 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
234a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 68 65  ;.    }.    pWhe
234b0 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
234c0 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57  Dup(db, pSub->pW
234d0 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  here, 0);.    if
234e0 28 20 69 73 4c 65 66 74 4a 6f 69 6e 3e 30 20 29  ( isLeftJoin>0 )
234f0 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45  {.      setJoinE
23500 78 70 72 28 70 57 68 65 72 65 2c 20 69 4e 65 77  xpr(pWhere, iNew
23510 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  Parent);.    }. 
23520 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
23530 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
23540 41 6e 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20  And(db, pWhere, 
23550 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 29  pParent->pWhere)
23560 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
23570 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
23580 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e 74  .      SubstCont
23590 65 78 74 20 78 3b 0a 20 20 20 20 20 20 78 2e 70  ext x;.      x.p
235a0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
235b0 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d        x.iTable =
235c0 20 69 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20   iParent;.      
235d0 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 4e  x.iNewTable = iN
235e0 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20  ewParent;.      
235f0 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 69  x.isLeftJoin = i
23600 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20 20 20 20  sLeftJoin;.     
23610 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75 62   x.pEList = pSub
23620 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  ->pEList;.      
23630 73 75 62 73 74 53 65 6c 65 63 74 28 26 78 2c 20  substSelect(&x, 
23640 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20  pParent, 0);.   
23650 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65   }.  .    /* The
23660 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79   flattened query
23670 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20   is distinct if 
23680 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72  either the inner
23690 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   or the.    ** o
236a0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69  uter query is di
236b0 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a  stinct. .    */.
236c0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c      pParent->sel
236d0 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73  Flags |= pSub->s
236e0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
236f0 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a  tinct;.  .    /*
23700 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e  .    ** SELECT .
23710 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  .. FROM (SELECT 
23720 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53  ... LIMIT a OFFS
23730 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46  ET b) LIMIT x OF
23740 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20  FSET y;.    **. 
23750 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d     ** One is tem
23760 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61  pted to try to a
23770 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f  dd a and b to co
23780 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73  mbine the limits
23790 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20  .  But this.    
237a0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ** does not work
237b0 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74   if either limit
237c0 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20   is negative..  
237d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
237e0 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
237f0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d     pParent->pLim
23800 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69  it = pSub->pLimi
23810 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  t;.      pSub->p
23820 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d  Limit = 0;.    }
23830 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61  .  }..  /* Finia
23840 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74  lly, delete what
23850 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20   is left of the 
23860 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74  subquery and ret
23870 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  urn.  ** success
23880 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
23890 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
238a0 20 70 53 75 62 31 29 3b 0a 0a 23 69 66 20 53 45   pSub1);..#if SE
238b0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
238c0 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  D.  if( sqlite3S
238d0 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
238e0 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54  00 ){.    SELECT
238f0 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
23900 73 65 2c 70 2c 28 22 41 66 74 65 72 20 66 6c 61  se,p,("After fla
23910 74 74 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20  ttening:\n"));. 
23920 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
23930 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
23940 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
23950 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
23960 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
23970 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
23980 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
23990 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
239a0 45 57 29 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64  EW) */....#if !d
239b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
239c0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
239d0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
239e0 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a  OMIT_VIEW)./*.**
239f0 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
23a00 72 65 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63  relevant WHERE c
23a10 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74  lause terms of t
23a20 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
23a30 6e 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45  nto.** the WHERE
23a40 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
23a50 65 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  ery.  Example:.*
23a60 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
23a70 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20   FROM (SELECT a 
23a80 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46  AS x, c-d AS y F
23a90 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d  ROM t1) WHERE x=
23aa0 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a  5 AND y=10;.**.*
23ab0 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  * Transformed in
23ac0 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  to:.**.**    SEL
23ad0 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
23ae0 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41  CT a AS x, c-d A
23af0 53 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S y FROM t1 WHER
23b00 45 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30  E a=5 AND c-d=10
23b10 29 0a 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78  ).**     WHERE x
23b20 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a  =5 AND y=10;.**.
23b30 2a 2a 20 54 68 65 20 68 6f 70 65 20 69 73 20 74  ** The hope is t
23b40 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 61 64  hat the terms ad
23b50 64 65 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72  ded to the inner
23b60 20 71 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65   query will make
23b70 20 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69   it more.** effi
23b80 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20  cient..**.** Do 
23b90 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68 69 73  not attempt this
23ba0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66   optimization if
23bb0 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 28 2a  :.**.**   (1) (*
23bc0 2a 20 54 68 69 73 20 72 65 73 74 72 69 63 74 69  * This restricti
23bd0 6f 6e 20 77 61 73 20 72 65 6d 6f 76 65 64 20 6f  on was removed o
23be0 6e 20 32 30 31 37 2d 30 39 2d 32 39 2e 20 20 57  n 2017-09-29.  W
23bf0 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20 20 20 20  e used to.**    
23c00 20 20 20 20 20 20 20 64 69 73 61 6c 6c 6f 77 20         disallow 
23c10 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
23c20 6e 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  n for aggregate 
23c30 73 75 62 71 75 65 72 69 65 73 2c 20 62 75 74 20  subqueries, but 
23c40 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  now.**          
23c50 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 20 62   it is allowed b
23c60 79 20 70 75 74 74 69 6e 67 20 74 68 65 20 65 78  y putting the ex
23c70 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65  tra terms on the
23c80 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 0a   HAVING clause..
23c90 2a 2a 20 20 20 20 20 20 20 20 20 20 20 54 68 65  **           The
23ca0 20 61 64 64 65 64 20 48 41 56 49 4e 47 20 63 6c   added HAVING cl
23cb0 61 75 73 65 20 69 73 20 70 6f 69 6e 74 6c 65 73  ause is pointles
23cc0 73 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  s if the subquer
23cd0 79 20 6c 61 63 6b 73 0a 2a 2a 20 20 20 20 20 20  y lacks.**      
23ce0 20 20 20 20 20 61 20 47 52 4f 55 50 20 42 59 20       a GROUP BY 
23cf0 63 6c 61 75 73 65 2e 20 20 42 75 74 20 73 75 63  clause.  But suc
23d00 68 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73  h a HAVING claus
23d10 65 20 69 73 20 61 6c 73 6f 20 68 61 72 6d 6c 65  e is also harmle
23d20 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ss.**           
23d30 73 6f 20 74 68 65 72 65 20 64 6f 65 73 20 6e 6f  so there does no
23d40 74 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 61  t appear to be a
23d50 6e 79 20 72 65 61 73 6f 6e 20 74 6f 20 61 64 64  ny reason to add
23d60 20 65 78 74 72 61 20 6c 6f 67 69 63 0a 2a 2a 20   extra logic.** 
23d70 20 20 20 20 20 20 20 20 20 20 74 6f 20 73 75 70            to sup
23d80 70 72 65 73 73 20 69 74 2e 20 2a 2a 29 0a 2a 2a  press it. **).**
23d90 0a 2a 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e  .**   (2) The in
23da0 6e 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65  ner query is the
23db0 20 72 65 63 75 72 73 69 76 65 20 70 61 72 74 20   recursive part 
23dc0 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c  of a common tabl
23dd0 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  e expression..**
23de0 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e  .**   (3) The in
23df0 6e 65 72 20 71 75 65 72 79 20 68 61 73 20 61 20  ner query has a 
23e00 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69  LIMIT clause (si
23e10 6e 63 65 20 74 68 65 20 63 68 61 6e 67 65 73 20  nce the changes 
23e20 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20  to the WHERE.** 
23e30 20 20 20 20 20 20 63 6c 6f 73 65 20 77 6f 75 6c        close woul
23e40 64 20 63 68 61 6e 67 65 20 74 68 65 20 6d 65 61  d change the mea
23e50 6e 69 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d 49  ning of the LIMI
23e60 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  T)..**.**   (4) 
23e70 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
23e80 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
23e90 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a  rand of a LEFT J
23ea0 4f 49 4e 20 61 6e 64 20 74 68 65 0a 2a 2a 20 20  OIN and the.**  
23eb0 20 20 20 20 20 65 78 70 72 65 73 73 69 6f 6e 20       expression 
23ec0 74 6f 20 62 65 20 70 75 73 68 65 64 20 64 6f 77  to be pushed dow
23ed0 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20  n does not come 
23ee0 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75  from the ON clau
23ef0 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 6e 20 74  se.**       on t
23f00 68 61 74 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a  hat LEFT JOIN..*
23f10 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68 65 20 57  *.**   (5) The W
23f20 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
23f30 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65  ession originate
23f40 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  s in the ON or U
23f50 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20  SING clause.**  
23f60 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a       of a LEFT J
23f70 4f 49 4e 20 77 68 65 72 65 20 69 43 75 72 73 6f  OIN where iCurso
23f80 72 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67  r is not the rig
23f90 68 74 2d 68 61 6e 64 20 74 61 62 6c 65 20 6f 66  ht-hand table of
23fa0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 6c   that.**       l
23fb0 65 66 74 20 6a 6f 69 6e 2e 20 20 41 6e 20 65 78  eft join.  An ex
23fc0 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
23fd0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 0a         SELECT *.
23fe0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 46 52 4f  **           FRO
23ff0 4d 20 28 53 45 4c 45 43 54 20 31 20 41 53 20 61  M (SELECT 1 AS a
24000 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  1 UNION ALL SELE
24010 43 54 20 32 29 20 41 53 20 61 61 0a 2a 2a 20 20  CT 2) AS aa.**  
24020 20 20 20 20 20 20 20 20 20 4a 4f 49 4e 20 28 53           JOIN (S
24030 45 4c 45 43 54 20 31 20 41 53 20 62 32 20 55 4e  ELECT 1 AS b2 UN
24040 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 32  ION ALL SELECT 2
24050 29 20 41 53 20 62 62 20 4f 4e 20 28 61 31 3d 62  ) AS bb ON (a1=b
24060 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
24070 4c 45 46 54 20 4a 4f 49 4e 20 28 53 45 4c 45 43  LEFT JOIN (SELEC
24080 54 20 38 20 41 53 20 63 33 20 55 4e 49 4f 4e 20  T 8 AS c3 UNION 
24090 41 4c 4c 20 53 45 4c 45 43 54 20 39 29 20 41 53  ALL SELECT 9) AS
240a0 20 63 63 20 4f 4e 20 28 62 32 3d 32 29 3b 0a 2a   cc ON (b2=2);.*
240b0 2a 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 63  *.**       The c
240c0 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 69 73  orrect answer is
240d0 20 74 68 72 65 65 20 72 6f 77 73 3a 20 20 28 31   three rows:  (1
240e0 2c 31 2c 4e 55 4c 4c 29 2c 28 32 2c 32 2c 38 29  ,1,NULL),(2,2,8)
240f0 2c 28 32 2c 32 2c 39 29 2e 0a 2a 2a 20 20 20 20  ,(2,2,9)..**    
24100 20 20 20 42 75 74 20 69 66 20 74 68 65 20 28 62     But if the (b
24110 32 3d 32 29 20 74 65 72 6d 20 77 65 72 65 20 74  2=2) term were t
24120 6f 20 62 65 20 70 75 73 68 65 64 20 64 6f 77 6e  o be pushed down
24130 20 69 6e 74 6f 20 74 68 65 20 62 62 20 73 75 62   into the bb sub
24140 71 75 65 72 79 2c 0a 2a 2a 20 20 20 20 20 20 20  query,.**       
24150 74 68 65 6e 20 74 68 65 20 28 31 2c 31 2c 4e 55  then the (1,1,NU
24160 4c 4c 29 20 72 6f 77 20 77 6f 75 6c 64 20 62 65  LL) row would be
24170 20 73 75 70 70 72 65 73 73 65 64 2e 0a 2a 2a 0a   suppressed..**.
24180 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  ** Return 0 if n
24190 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
241a0 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20  de and non-zero 
241b0 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57  if one or more W
241c0 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74  HERE clause.** t
241d0 65 72 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61  erms are duplica
241e0 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73 75 62  ted into the sub
241f0 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
24200 20 69 6e 74 20 70 75 73 68 44 6f 77 6e 57 68 65   int pushDownWhe
24210 72 65 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65  reTerms(.  Parse
24220 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
24230 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
24240 74 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  t (for malloc() 
24250 61 6e 64 20 65 72 72 6f 72 20 72 65 70 6f 72 74  and error report
24260 69 6e 67 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ing) */.  Select
24270 20 2a 70 53 75 62 71 2c 20 20 20 20 20 20 20 20   *pSubq,        
24280 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
24290 77 68 6f 73 65 20 57 48 45 52 45 20 63 6c 61 75  whose WHERE clau
242a0 73 65 20 69 73 20 74 6f 20 62 65 20 61 75 67 6d  se is to be augm
242b0 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  ented */.  Expr 
242c0 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
242d0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
242e0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
242f0 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  r query */.  int
24300 20 69 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20   iCursor,       
24310 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
24320 62 65 72 20 6f 66 20 74 68 65 20 73 75 62 71 75  ber of the subqu
24330 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c  ery */.  int isL
24340 65 66 74 4a 6f 69 6e 20 20 20 20 20 20 20 20 2f  eftJoin        /
24350 2a 20 54 72 75 65 20 69 66 20 70 53 75 62 71 20  * True if pSubq 
24360 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72  is the right ter
24370 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  m of a LEFT JOIN
24380 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
24390 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67  New;.  int nChng
243a0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57 68 65   = 0;.  if( pWhe
243b0 72 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  re==0 ) return 0
243c0 3b 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e 73  ;.  if( pSubq->s
243d0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
243e0 75 72 73 69 76 65 20 29 20 72 65 74 75 72 6e 20  ursive ) return 
243f0 30 3b 20 20 2f 2a 20 72 65 73 74 72 69 63 74 69  0;  /* restricti
24400 6f 6e 20 28 32 29 20 2a 2f 0a 0a 23 69 66 64 65  on (2) */..#ifde
24410 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
24420 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 66 69 72   /* Only the fir
24430 73 74 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d  st term of a com
24440 70 6f 75 6e 64 20 63 61 6e 20 68 61 76 65 20 61  pound can have a
24450 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 20 42   WITH clause.  B
24460 75 74 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  ut make.  ** sur
24470 65 20 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 73  e no other terms
24480 20 61 72 65 20 6d 61 72 6b 65 64 20 53 46 5f 52   are marked SF_R
24490 65 63 75 72 73 69 76 65 20 69 6e 20 63 61 73 65  ecursive in case
244a0 20 73 6f 6d 65 74 68 69 6e 67 20 63 68 61 6e 67   something chang
244b0 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66  es.  ** in the f
244c0 75 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a  uture..  */.  {.
244d0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 20      Select *pX; 
244e0 20 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 75   .    for(pX=pSu
244f0 62 71 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  bq; pX; pX=pX->p
24500 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 61 73  Prior){.      as
24510 73 65 72 74 28 20 28 70 58 2d 3e 73 65 6c 46 6c  sert( (pX->selFl
24520 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73  ags & (SF_Recurs
24530 69 76 65 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ive))==0 );.    
24540 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
24550 69 66 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69  if( pSubq->pLimi
24560 74 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t!=0 ){.    retu
24570 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63  rn 0; /* restric
24580 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a  tion (3) */.  }.
24590 20 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d    while( pWhere-
245a0 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20  >op==TK_AND ){. 
245b0 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68     nChng += push
245c0 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70  DownWhereTerms(p
245d0 50 61 72 73 65 2c 20 70 53 75 62 71 2c 20 70 57  Parse, pSubq, pW
245e0 68 65 72 65 2d 3e 70 52 69 67 68 74 2c 0a 20 20  here->pRight,.  
245f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
24610 75 72 73 6f 72 2c 20 69 73 4c 65 66 74 4a 6f 69  ursor, isLeftJoi
24620 6e 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  n);.    pWhere =
24630 20 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a   pWhere->pLeft;.
24640 20 20 7d 0a 20 20 69 66 28 20 69 73 4c 65 66 74    }.  if( isLeft
24650 4a 6f 69 6e 0a 20 20 20 26 26 20 28 45 78 70 72  Join.   && (Expr
24660 48 61 73 50 72 6f 70 65 72 74 79 28 70 57 68 65  HasProperty(pWhe
24670 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3d  re,EP_FromJoin)=
24680 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
24690 57 68 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f 69  Where->iRightJoi
246a0 6e 54 61 62 6c 65 21 3d 69 43 75 72 73 6f 72 29  nTable!=iCursor)
246b0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
246c0 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69   0; /* restricti
246d0 6f 6e 20 28 34 29 20 2a 2f 0a 20 20 7d 0a 20 20  on (4) */.  }.  
246e0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
246f0 72 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72  rty(pWhere,EP_Fr
24700 6f 6d 4a 6f 69 6e 29 20 26 26 20 70 57 68 65 72  omJoin) && pWher
24710 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  e->iRightJoinTab
24720 6c 65 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  le!=iCursor ){. 
24730 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
24740 72 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20  restriction (5) 
24750 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  */.  }.  if( sql
24760 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43  ite3ExprIsTableC
24770 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20  onstant(pWhere, 
24780 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  iCursor) ){.    
24790 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69  nChng++;.    whi
247a0 6c 65 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20  le( pSubq ){.   
247b0 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20     SubstContext 
247c0 78 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  x;.      pNew = 
247d0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
247e0 50 61 72 73 65 2d 3e 64 62 2c 20 70 57 68 65 72  Parse->db, pWher
247f0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 75 6e 73  e, 0);.      uns
24800 65 74 4a 6f 69 6e 45 78 70 72 28 70 4e 65 77 2c  etJoinExpr(pNew,
24810 20 2d 31 29 3b 0a 20 20 20 20 20 20 78 2e 70 50   -1);.      x.pP
24820 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
24830 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20       x.iTable = 
24840 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78  iCursor;.      x
24850 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 43 75  .iNewTable = iCu
24860 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 73  rsor;.      x.is
24870 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20  LeftJoin = 0;.  
24880 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70      x.pEList = p
24890 53 75 62 71 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  Subq->pEList;.  
248a0 20 20 20 20 70 4e 65 77 20 3d 20 73 75 62 73 74      pNew = subst
248b0 45 78 70 72 28 26 78 2c 20 70 4e 65 77 29 3b 0a  Expr(&x, pNew);.
248c0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 71 2d        if( pSubq-
248d0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
248e0 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20  ggregate ){.    
248f0 20 20 20 20 70 53 75 62 71 2d 3e 70 48 61 76 69      pSubq->pHavi
24900 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ng = sqlite3Expr
24910 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  And(pParse->db, 
24920 70 53 75 62 71 2d 3e 70 48 61 76 69 6e 67 2c 20  pSubq->pHaving, 
24930 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pNew);.      }el
24940 73 65 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62  se{.        pSub
24950 71 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  q->pWhere = sqli
24960 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
24970 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 57  e->db, pSubq->pW
24980 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20  here, pNew);.   
24990 20 20 20 7d 0a 20 20 20 20 20 20 70 53 75 62 71     }.      pSubq
249a0 20 3d 20 70 53 75 62 71 2d 3e 70 50 72 69 6f 72   = pSubq->pPrior
249b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
249c0 74 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65  turn nChng;.}.#e
249d0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
249e0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
249f0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
24a00 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
24a10 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  IEW) */../*.** T
24a20 68 65 20 70 46 75 6e 63 20 69 73 20 74 68 65 20  he pFunc is the 
24a30 6f 6e 6c 79 20 61 67 67 72 65 67 61 74 65 20 66  only aggregate f
24a40 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 71  unction in the q
24a50 75 65 72 79 2e 20 20 43 68 65 63 6b 20 74 6f 20  uery.  Check to 
24a60 73 65 65 0a 2a 2a 20 69 66 20 74 68 65 20 71 75  see.** if the qu
24a70 65 72 79 20 69 73 20 61 20 63 61 6e 64 69 64 61  ery is a candida
24a80 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d  te for the min/m
24a90 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ax optimization.
24aa0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71   .**.** If the q
24ab0 75 65 72 79 20 69 73 20 61 20 63 61 6e 64 69 64  uery is a candid
24ac0 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f  ate for the min/
24ad0 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  max optimization
24ae0 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 2a 70  , then set.** *p
24af0 70 4d 69 6e 4d 61 78 20 74 6f 20 62 65 20 61 6e  pMinMax to be an
24b00 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
24b10 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
24b20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
24b30 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 65  .** and return e
24b40 69 74 68 65 72 20 57 48 45 52 45 5f 4f 52 44 45  ither WHERE_ORDE
24b50 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45  RBY_MIN or WHERE
24b60 5f 4f 52 44 45 52 42 59 5f 4d 41 58 20 64 65 70  _ORDERBY_MAX dep
24b70 65 6e 64 69 6e 67 20 6f 6e 0a 2a 2a 20 77 68 65  ending on.** whe
24b80 74 68 65 72 20 70 46 75 6e 63 20 69 73 20 61 20  ther pFunc is a 
24b90 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66  min() or max() f
24ba0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
24bb0 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6e  f the query is n
24bc0 6f 74 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  ot a candidate f
24bd0 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f  or the min/max o
24be0 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 72 65 74  ptimization, ret
24bf0 75 72 6e 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44  urn.** WHERE_ORD
24c00 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 28 77 68 69  ERBY_NORMAL (whi
24c10 63 68 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 29  ch must be zero)
24c20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
24c30 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
24c40 6c 65 64 20 61 66 74 65 72 20 61 67 67 72 65 67  led after aggreg
24c50 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 68 61  ate functions ha
24c60 76 65 20 62 65 65 6e 0a 2a 2a 20 6c 6f 63 61 74  ve been.** locat
24c70 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68  ed but before th
24c80 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 68 61  eir arguments ha
24c90 76 65 20 62 65 65 6e 20 73 75 62 6a 65 63 74 65  ve been subjecte
24ca0 64 20 74 6f 20 61 67 67 72 65 67 61 74 65 0a 2a  d to aggregate.*
24cb0 2a 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2f 0a 73  * analysis..*/.s
24cc0 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51  tatic u8 minMaxQ
24cd0 75 65 72 79 28 73 71 6c 69 74 65 33 20 2a 64 62  uery(sqlite3 *db
24ce0 2c 20 45 78 70 72 20 2a 70 46 75 6e 63 2c 20 45  , Expr *pFunc, E
24cf0 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d  xprList **ppMinM
24d00 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20  ax){.  int eRet 
24d10 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
24d20 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 2f 2a 20  NORMAL;      /* 
24d30 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
24d40 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
24d50 73 74 20 3d 20 70 46 75 6e 63 2d 3e 78 2e 70 4c  st = pFunc->x.pL
24d60 69 73 74 3b 20 20 20 20 2f 2a 20 41 72 67 75 6d  ist;    /* Argum
24d70 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63  ents to agg func
24d80 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tion */.  const 
24d90 63 68 61 72 20 2a 7a 46 75 6e 63 3b 20 20 20 20  char *zFunc;    
24da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24db0 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 67 67 72 65  /* Name of aggre
24dc0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 70 46  gate function pF
24dd0 75 6e 63 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  unc */.  ExprLis
24de0 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 75  t *pOrderBy;.  u
24df0 38 20 73 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20  8 sortOrder;..  
24e00 61 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61  assert( *ppMinMa
24e10 78 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  x==0 );.  assert
24e20 28 20 70 46 75 6e 63 2d 3e 6f 70 3d 3d 54 4b 5f  ( pFunc->op==TK_
24e30 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
24e40 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
24e50 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  || pEList->nExpr
24e60 21 3d 31 20 29 20 72 65 74 75 72 6e 20 65 52 65  !=1 ) return eRe
24e70 74 3b 0a 20 20 7a 46 75 6e 63 20 3d 20 70 46 75  t;.  zFunc = pFu
24e80 6e 63 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  nc->u.zToken;.  
24e90 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
24ea0 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29  mp(zFunc, "min")
24eb0 3d 3d 30 20 29 7b 0a 20 20 20 20 65 52 65 74 20  ==0 ){.    eRet 
24ec0 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
24ed0 4d 49 4e 3b 0a 20 20 20 20 73 6f 72 74 4f 72 64  MIN;.    sortOrd
24ee0 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 41  er = SQLITE_SO_A
24ef0 53 43 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  SC;.  }else if( 
24f00 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
24f10 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20  Func, "max")==0 
24f20 29 7b 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48  ){.    eRet = WH
24f30 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b  ERE_ORDERBY_MAX;
24f40 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d  .    sortOrder =
24f50 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3b   SQLITE_SO_DESC;
24f60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
24f70 74 75 72 6e 20 65 52 65 74 3b 0a 20 20 7d 0a 20  turn eRet;.  }. 
24f80 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 4f 72   *ppMinMax = pOr
24f90 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
24fa0 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
24fb0 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 61 73 73  EList, 0);.  ass
24fc0 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30  ert( pOrderBy!=0
24fd0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
24fe0 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4f  iled );.  if( pO
24ff0 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42  rderBy ) pOrderB
25000 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  y->a[0].sortOrde
25010 72 20 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20  r = sortOrder;. 
25020 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a   return eRet;.}.
25030 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63  ./*.** The selec
25040 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
25050 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
25060 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61  argument is an a
25070 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a  ggregate query..
25080 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
25090 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73  gument is the as
250a0 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61  sociated aggrega
250b0 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20  te-info object. 
250c0 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
250d0 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53  n tests if the S
250e0 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20  ELECT is of the 
250f0 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  form:.**.**   SE
25100 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
25110 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77  OM <tbl>.**.** w
25120 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20  here table is a 
25130 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20  database table, 
25140 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74  not a sub-select
25150 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65   or view. If the
25160 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d   query.** does m
25170 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72  atch this patter
25180 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  n, then a pointe
25190 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f  r to the Table o
251a0 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69  bject representi
251b0 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72  ng.** <tbl> is r
251c0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
251d0 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
251e0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62  d..*/.static Tab
251f0 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e  le *isSimpleCoun
25200 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67  t(Select *p, Agg
25210 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
25220 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
25230 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a    Expr *pExpr;..
25240 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47    assert( !p->pG
25250 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28  roupBy );..  if(
25260 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d   p->pWhere || p-
25270 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
25280 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63  1 .   || p->pSrc
25290 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e  ->nSrc!=1 || p->
252a0 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
252b0 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  ct.  ){.    retu
252c0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
252d0 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
252e0 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d  .pTab;.  pExpr =
252f0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
25300 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  .pExpr;.  assert
25310 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d  ( pTab && !pTab-
25320 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70  >pSelect && pExp
25330 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69  r );..  if( IsVi
25340 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
25350 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
25360 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
25370 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
25380 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  n 0;.  if( NEVER
25390 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  (pAggInfo->nFunc
253a0 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
253b0 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f  .  if( (pAggInfo
253c0 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63  ->aFunc[0].pFunc
253d0 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49  ->funcFlags&SQLI
253e0 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d  TE_FUNC_COUNT)==
253f0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
25400 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
25410 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72  &EP_Distinct ) r
25420 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75  eturn 0;..  retu
25430 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
25440 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d  * If the source-
25450 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64  list item passed
25460 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
25470 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69  was augmented wi
25480 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44  th an.** INDEXED
25490 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
254a0 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74   try to locate t
254b0 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64  he specified ind
254c0 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  ex. If there.** 
254d0 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73  was such a claus
254e0 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20  e and the named 
254f0 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20  index cannot be 
25500 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a  found, return .*
25510 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61  * SQLITE_ERROR a
25520 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  nd leave an erro
25530 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68  r in pParse. Oth
25540 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65  erwise, populate
25550 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64   .** pFrom->pInd
25560 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ex and return SQ
25570 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
25580 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
25590 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50  Lookup(Parse *pP
255a0 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63  arse, struct Src
255b0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
255c0 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  ){.  if( pFrom->
255d0 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 66  pTab && pFrom->f
255e0 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b  g.isIndexedBy ){
255f0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
25600 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
25610 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78      char *zIndex
25620 65 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75 31  edBy = pFrom->u1
25630 2e 7a 49 6e 64 65 78 65 64 42 79 3b 0a 20 20 20  .zIndexedBy;.   
25640 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
25650 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
25660 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20  >pIndex; .      
25670 20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74 65    pIdx && sqlite
25680 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a  3StrICmp(pIdx->z
25690 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42 79  Name, zIndexedBy
256a0 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  ); .        pIdx
256b0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20  =pIdx->pNext.   
256c0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64   );.    if( !pId
256d0 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  x ){.      sqlit
256e0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
256f0 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
25700 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 65 64  x: %s", zIndexed
25710 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  By, 0);.      pP
25720 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
25730 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  a = 1;.      ret
25740 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
25750 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f  ;.    }.    pFro
25760 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 49  m->pIBIndex = pI
25770 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
25780 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a   SQLITE_OK;.}./*
25790 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f  .** Detect compo
257a0 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
257b0 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65 20 61  ments that use a
257c0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
257d0 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c  e with .** an al
257e0 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74  ternative collat
257f0 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
25800 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e  .**    SELECT ..
25810 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  . FROM t1 EXCEPT
25820 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
25830 20 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20   t2 ORDER BY .. 
25840 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a  COLLATE ....**.*
25850 2a 20 54 68 65 73 65 20 61 72 65 20 72 65 77 72  * These are rewr
25860 69 74 74 65 6e 20 61 73 20 61 20 73 75 62 71 75  itten as a subqu
25870 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  ery:.**.**    SE
25880 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
25890 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
258a0 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e  EXCEPT SELECT ..
258b0 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20  . FROM t2).**   
258c0 20 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43    ORDER BY ... C
258d0 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  OLLATE ....**.**
258e0 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   This transforma
258f0 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72  tion is necessar
25900 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 75  y because the mu
25910 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
25920 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62  () routine.** ab
25930 6f 76 65 20 74 68 61 74 20 67 65 6e 65 72 61 74  ove that generat
25940 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
25950 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
25960 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  T with an ORDER 
25970 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65  BY clause.** use
25980 73 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69  s a merge algori
25990 74 68 6d 20 74 68 61 74 20 72 65 71 75 69 72 65  thm that require
259a0 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61  s the same colla
259b0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e  ting sequence on
259c0 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63   the.** result c
259d0 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65  olumns as on the
259e0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
259f0 2e 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a  .  See ticket.**
25a00 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69   http://www.sqli
25a10 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f  te.org/src/info/
25a20 36 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a  6709574d2a.**.**
25a30 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   This transforma
25a40 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65  tion is only nee
25a50 64 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20  ded for EXCEPT, 
25a60 49 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55  INTERSECT, and U
25a70 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49  NION..** The UNI
25a80 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  ON ALL operator 
25a90 77 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20  works fine with 
25aa0 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
25ab0 42 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a  By() even when.*
25ac0 2a 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c  * there are COLL
25ad0 41 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ATE terms in the
25ae0 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74   ORDER BY..*/.st
25af0 61 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74  atic int convert
25b00 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f  CompoundSelectTo
25b10 53 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20  Subquery(Walker 
25b20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
25b30 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
25b40 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
25b50 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73   Select *pX;.  s
25b60 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74  qlite3 *db;.  st
25b70 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
25b80 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74  em *a;.  SrcList
25b90 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72   *pNewSrc;.  Par
25ba0 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f  se *pParse;.  To
25bb0 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66  ken dummy;..  if
25bc0 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
25bd0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
25be0 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70  inue;.  if( p->p
25bf0 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
25c00 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
25c10 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58  ;.  for(pX=p; pX
25c20 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   && (pX->op==TK_
25c30 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  ALL || pX->op==T
25c40 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58  K_SELECT); pX=pX
25c50 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66  ->pPrior){}.  if
25c60 28 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( pX==0 ) return
25c70 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
25c80 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79   a = p->pOrderBy
25c90 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  ->a;.  for(i=p->
25ca0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d  pOrderBy->nExpr-
25cb0 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
25cc0 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70     if( a[i].pExp
25cd0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  r->flags & EP_Co
25ce0 6c 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20  llate ) break;. 
25cf0 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72   }.  if( i<0 ) r
25d00 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
25d10 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ue;..  /* If we 
25d20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
25d30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
25d40 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
25d50 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  is required. */.
25d60 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c  .  pParse = pWal
25d70 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  ker->pParse;.  d
25d80 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
25d90 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
25da0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
25db0 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
25dc0 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
25dd0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
25de0 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75  rt;.  memset(&du
25df0 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  mmy, 0, sizeof(d
25e00 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72  ummy));.  pNewSr
25e10 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
25e20 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
25e30 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64  (pParse,0,0,0,&d
25e40 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a  ummy,pNew,0,0);.
25e50 20 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30    if( pNewSrc==0
25e60 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
25e70 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a  ort;.  *pNew = *
25e80 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  p;.  p->pSrc = p
25e90 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c  NewSrc;.  p->pEL
25ea0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
25eb0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
25ec0 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78  se, 0, sqlite3Ex
25ed0 70 72 28 64 62 2c 20 54 4b 5f 41 53 54 45 52 49  pr(db, TK_ASTERI
25ee0 53 4b 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70  SK, 0));.  p->op
25ef0 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20   = TK_SELECT;.  
25f00 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20  p->pWhere = 0;. 
25f10 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
25f20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  = 0;.  pNew->pHa
25f30 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77  ving = 0;.  pNew
25f40 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
25f50 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
25f60 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  .  p->pNext = 0;
25f70 0a 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b  .  p->pWith = 0;
25f80 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  .  p->selFlags &
25f90 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a  = ~SF_Compound;.
25fa0 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
25fb0 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76  lFlags & SF_Conv
25fc0 65 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70  erted)==0 );.  p
25fd0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
25fe0 5f 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73  _Converted;.  as
25ff0 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69  sert( pNew->pPri
26000 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d  or!=0 );.  pNew-
26010 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d  >pPrior->pNext =
26020 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70   pNew;.  pNew->p
26030 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 72 65 74  Limit = 0;.  ret
26040 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
26050 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
26060 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 46   to see if the F
26070 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
26080 70 46 72 6f 6d 20 68 61 73 20 74 61 62 6c 65 2d  pFrom has table-
26090 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a  valued function.
260a0 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 49  ** arguments.  I
260b0 66 20 69 74 20 64 6f 65 73 2c 20 6c 65 61 76 65  f it does, leave
260c0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
260d0 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
260e0 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
260f0 72 6f 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d 20  ro, since pFrom 
26100 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74  is not allowed t
26110 6f 20 62 65 20 61 20 74 61 62 6c 65 2d 76 61 6c  o be a table-val
26120 75 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ued function..*/
26130 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 6e 6e  .static int cann
26140 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 50 61 72  otBeFunction(Par
26150 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
26160 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
26170 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70  *pFrom){.  if( p
26180 46 72 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  From->fg.isTabFu
26190 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nc ){.    sqlite
261a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
261b0 2c 20 22 27 25 73 27 20 69 73 20 6e 6f 74 20 61  , "'%s' is not a
261c0 20 66 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72 6f   function", pFro
261d0 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  m->zName);.    r
261e0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
261f0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e  eturn 0;.}..#ifn
26200 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26210 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  CTE./*.** Argume
26220 6e 74 20 70 57 69 74 68 20 28 77 68 69 63 68 20  nt pWith (which 
26230 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69  may be NULL) poi
26240 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20  nts to a linked 
26250 6c 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a  list of nested .
26260 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73  ** WITH contexts
26270 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20  , from inner to 
26280 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68  outermost. If th
26290 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
262a0 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63  ed by .** FROM c
262b0 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49  lause element pI
262c0 74 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20  tem is really a 
262d0 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70  common-table-exp
262e0 72 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a  ression (CTE) .*
262f0 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20  * then return a 
26300 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43  pointer to the C
26310 54 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f  TE definition fo
26320 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74  r that table. Ot
26330 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72  herwise.** retur
26340 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  n NULL..**.** If
26350 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
26360 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73  e is returned, s
26370 65 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f  et *ppContext to
26380 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69   point to the Wi
26390 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  th.** object tha
263a0 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 43  t the returned C
263b0 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a  TE belongs to..*
263c0 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
263d0 43 74 65 20 2a 73 65 61 72 63 68 57 69 74 68 28  Cte *searchWith(
263e0 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  .  With *pWith, 
263f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26400 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e     /* Current in
26410 6e 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61  nermost WITH cla
26420 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
26430 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
26440 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d  tem,     /* FROM
26450 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20   clause element 
26460 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20  to resolve */.  
26470 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74  With **ppContext
26480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26490 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61  /* OUT: WITH cla
264a0 75 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  use return value
264b0 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29   belongs to */.)
264c0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
264d0 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74  zName;.  if( pIt
264e0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
264f0 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74   && (zName = pIt
26500 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  em->zName)!=0 ){
26510 0a 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20  .    With *p;.  
26520 20 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70    for(p=pWith; p
26530 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a  ; p=p->pOuter){.
26540 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
26550 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
26560 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
26570 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
26580 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70  StrICmp(zName, p
26590 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
265a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
265b0 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20  pContext = p;.  
265c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 26          return &
265d0 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  p->a[i];.       
265e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
265f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
26600 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20  .}../* The code 
26610 67 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61  generator mainta
26620 69 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61  ins a stack of a
26630 63 74 69 76 65 20 57 49 54 48 20 63 6c 61 75 73  ctive WITH claus
26640 65 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69  es.** with the i
26650 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63  nner-most WITH c
26660 6c 61 75 73 65 20 62 65 69 6e 67 20 61 74 20 74  lause being at t
26670 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
26680 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
26690 72 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20 74  routine pushes t
266a0 68 65 20 57 49 54 48 20 63 6c 61 75 73 65 20 70  he WITH clause p
266b0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
266c0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
266d0 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20  onto the top of 
266e0 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72  the stack. If ar
266f0 67 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20  gument bFree is 
26700 74 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a  true, then this.
26710 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 77  ** WITH clause w
26720 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70  ill never be pop
26730 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ped from the sta
26740 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
26750 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65   it.** should be
26760 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74   freed along wit
26770 68 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  h the Parse obje
26780 63 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73  ct. In other cas
26790 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65  es, when.** bFre
267a0 65 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f  e==0, the With o
267b0 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72  bject will be fr
267c0 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  eed along with t
267d0 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74  he SELECT .** st
267e0 61 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69  atement with whi
267f0 63 68 20 69 74 20 69 73 20 61 73 73 6f 63 69 61  ch it is associa
26800 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
26810 69 74 65 33 57 69 74 68 50 75 73 68 28 50 61 72  ite3WithPush(Par
26820 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68  se *pParse, With
26830 20 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72 65   *pWith, u8 bFre
26840 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46  e){.  assert( bF
26850 72 65 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73  ree==0 || (pPars
26860 65 2d 3e 70 57 69 74 68 3d 3d 30 20 26 26 20 70  e->pWith==0 && p
26870 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72  Parse->pWithToFr
26880 65 65 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20  ee==0) );.  if( 
26890 70 57 69 74 68 20 29 7b 0a 20 20 20 20 61 73 73  pWith ){.    ass
268a0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69  ert( pParse->pWi
268b0 74 68 21 3d 70 57 69 74 68 20 29 3b 0a 20 20 20  th!=pWith );.   
268c0 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d   pWith->pOuter =
268d0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a   pParse->pWith;.
268e0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
268f0 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69  h = pWith;.    i
26900 66 28 20 62 46 72 65 65 20 29 20 70 50 61 72 73  f( bFree ) pPars
26910 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 20 3d  e->pWithToFree =
26920 20 70 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pWith;.  }.}../
26930 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
26940 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67  on checks if arg
26950 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65  ument pFrom refe
26960 72 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c  rs to a CTE decl
26970 61 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49  ared by .** a WI
26980 54 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  TH clause on the
26990 20 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79   stack currently
269a0 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74   maintained by t
269b0 68 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a  he parser. And,.
269c0 2a 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20  ** if currently 
269d0 70 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45  processing a CTE
269e0 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20   expression, if 
269f0 69 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76  it is a recursiv
26a00 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74  e.** reference t
26a10 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54  o the current CT
26a20 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f  E..**.** If pFro
26a30 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74  m falls into eit
26a40 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63  her of the two c
26a50 61 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c  ategories above,
26a60 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20   pFrom->pTab.** 
26a70 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73  and other fields
26a80 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61   are populated a
26a90 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20  ccordingly. The 
26aa0 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68  caller should ch
26ab0 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70  eck.** (pFrom->p
26ac0 54 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72  Tab!=0) to deter
26ad0 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
26ae0 6e 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c  not a successful
26af0 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f   match.** was fo
26b00 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  und..**.** Wheth
26b10 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63  er or not a matc
26b20 68 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49  h is found, SQLI
26b30 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
26b40 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a  d if no error.**
26b50 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65   occurs. If an e
26b60 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c  rror does occur,
26b70 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
26b80 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  e is stored in t
26b90 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64  he.** parser and
26ba0 20 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65   some error code
26bb0 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
26bc0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
26bd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
26be0 74 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b  thExpand(.  Walk
26bf0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20  er *pWalker, .  
26c00 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
26c10 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20  tem *pFrom.){.  
26c20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
26c30 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
26c40 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
26c50 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73   pParse->db;.  s
26c60 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b  truct Cte *pCte;
26c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26c80 2a 20 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f  * Matched CTE (o
26c90 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74  r NULL if no mat
26ca0 63 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70  ch) */.  With *p
26cb0 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  With;           
26cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48           /* WITH
26cd0 20 63 6c 61 75 73 65 20 74 68 61 74 20 70 43 74   clause that pCt
26ce0 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  e belongs to */.
26cf0 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d  .  assert( pFrom
26d00 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20  ->pTab==0 );..  
26d10 70 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74  pCte = searchWit
26d20 68 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c  h(pParse->pWith,
26d30 20 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b   pFrom, &pWith);
26d40 0a 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20  .  if( pCte ){. 
26d50 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
26d60 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
26d70 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  List;.    Select
26d80 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65   *pSel;.    Sele
26d90 63 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  ct *pLeft;      
26da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
26db0 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
26dc0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
26dd0 6e 74 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  nt bMayRecursive
26de0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
26df0 54 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64  True if compound
26e00 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e   joined by UNION
26e10 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69   [ALL] */.    Wi
26e20 74 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20  th *pSavedWith; 
26e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
26e40 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
26e50 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f  pParse->pWith */
26e60 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65  ..    /* If pCte
26e70 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 6e 6f 6e  ->zCteErr is non
26e80 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f  -NULL at this po
26e90 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69  int, then this i
26ea0 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20  s an illegal.   
26eb0 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72 65   ** recursive re
26ec0 66 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70  ference to CTE p
26ed0 43 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72  Cte. Leave an er
26ee0 72 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ror in pParse an
26ef0 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
26f00 65 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e  early. If pCte->
26f10 7a 43 74 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c  zCteErr is NULL,
26f20 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f   then this is no
26f30 74 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65  t a recursive re
26f40 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20  ference..    ** 
26f50 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72  In this case, pr
26f60 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  oceed.  */.    i
26f70 66 28 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72  f( pCte->zCteErr
26f80 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
26f90 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
26fa0 2c 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c  , pCte->zCteErr,
26fb0 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
26fc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
26fd0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
26fe0 20 20 20 20 69 66 28 20 63 61 6e 6e 6f 74 42 65      if( cannotBe
26ff0 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c  Function(pParse,
27000 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e   pFrom) ) return
27010 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a   SQLITE_ERROR;..
27020 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
27030 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
27040 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
27050 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
27060 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
27070 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
27080 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
27090 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
270a0 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 54 61  t;.    pTab->nTa
270b0 62 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54  bRef = 1;.    pT
270c0 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ab->zName = sqli
270d0 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
270e0 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
270f0 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
27100 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52  -1;.    pTab->nR
27110 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
27120 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
27130 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
27140 37 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d  76) );.    pTab-
27150 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
27160 45 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f 4e  Ephemeral | TF_N
27170 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20  oVisibleRowid;. 
27180 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
27190 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
271a0 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70  tDup(db, pCte->p
271b0 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
271c0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
271d0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
271e0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
271f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
27200 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a  om->pSelect );..
27210 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
27220 74 68 69 73 20 69 73 20 61 20 72 65 63 75 72 73  this is a recurs
27230 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20  ive CTE. */.    
27240 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
27250 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52  elect;.    bMayR
27260 65 63 75 72 73 69 76 65 20 3d 20 28 20 70 53 65  ecursive = ( pSe
27270 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  l->op==TK_ALL ||
27280 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e   pSel->op==TK_UN
27290 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62  ION );.    if( b
272a0 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a  MayRecursive ){.
272b0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
272c0 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
272d0 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
272e0 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66  t->pSrc;.      f
272f0 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
27300 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
27310 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
27320 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
27330 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20   &pSrc->a[i];.  
27340 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
27350 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20  >zDatabase==0 . 
27360 20 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d          && pItem
27370 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20  ->zName!=0 .    
27380 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
27390 65 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d  e3StrICmp(pItem-
273a0 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e  >zName, pCte->zN
273b0 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20 29  ame).          )
273c0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
273d0 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a  m->pTab = pTab;.
273e0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
273f0 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  >fg.isRecursive 
27400 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
27410 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a  Tab->nTabRef++;.
27420 20 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e            pSel->
27430 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52  selFlags |= SF_R
27440 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20  ecursive;.      
27450 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27460 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f  }..    /* Only o
27470 6e 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ne recursive ref
27480 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74  erence is permit
27490 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28  ted. */ .    if(
274a0 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 32   pTab->nTabRef>2
274b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
274c0 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20  3ErrorMsg(.     
274d0 20 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75       pParse, "mu
274e0 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65  ltiple reference
274f0 73 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74  s to recursive t
27500 61 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d  able: %s", pCte-
27510 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
27520 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27530 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
27540 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
27550 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 7c 7c  b->nTabRef==1 ||
27560 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28   .            ((
27570 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53  pSel->selFlags&S
27580 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20  F_Recursive) && 
27590 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 32  pTab->nTabRef==2
275a0 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e   ));..    pCte->
275b0 7a 43 74 65 45 72 72 20 3d 20 22 63 69 72 63 75  zCteErr = "circu
275c0 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25  lar reference: %
275d0 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69  s";.    pSavedWi
275e0 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69  th = pParse->pWi
275f0 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  th;.    pParse->
27600 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20  pWith = pWith;. 
27610 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
27620 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 53 65  sive ){.      Se
27630 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
27640 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  Sel->pPrior;.   
27650 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
27660 72 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20  r->pWith==0 );. 
27670 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69       pPrior->pWi
27680 74 68 20 3d 20 70 53 65 6c 2d 3e 70 57 69 74 68  th = pSel->pWith
27690 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  ;.      sqlite3W
276a0 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
276b0 72 2c 20 70 50 72 69 6f 72 29 3b 0a 20 20 20 20  r, pPrior);.    
276c0 20 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20    pPrior->pWith 
276d0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
276e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
276f0 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
27700 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pSel);.    }.  
27710 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
27720 3d 20 70 57 69 74 68 3b 0a 0a 20 20 20 20 66 6f  = pWith;..    fo
27730 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c  r(pLeft=pSel; pL
27740 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65  eft->pPrior; pLe
27750 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72  ft=pLeft->pPrior
27760 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  );.    pEList = 
27770 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  pLeft->pEList;. 
27780 20 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f     if( pCte->pCo
27790 6c 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ls ){.      if( 
277a0 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
277b0 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70  ->nExpr!=pCte->p
277c0 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  Cols->nExpr ){. 
277d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
277e0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
277f0 74 61 62 6c 65 20 25 73 20 68 61 73 20 25 64 20  table %s has %d 
27800 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f  values for %d co
27810 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20  lumns",.        
27820 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c      pCte->zName,
27830 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
27840 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78  pCte->pCols->nEx
27850 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  pr.        );.  
27860 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57        pParse->pW
27870 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68  ith = pSavedWith
27880 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
27890 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
278a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c       }.      pEL
278b0 69 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c  ist = pCte->pCol
278c0 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  s;.    }..    sq
278d0 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d  lite3ColumnsFrom
278e0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
278f0 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e   pEList, &pTab->
27900 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
27910 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79  l);.    if( bMay
27920 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
27930 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c     if( pSel->sel
27940 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
27950 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20  sive ){.        
27960 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20  pCte->zCteErr = 
27970 22 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73  "multiple recurs
27980 69 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20  ive references: 
27990 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  %s";.      }else
279a0 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e  {.        pCte->
279b0 7a 43 74 65 45 72 72 20 3d 20 22 72 65 63 75 72  zCteErr = "recur
279c0 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69  sive reference i
279d0 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20 25 73  n a subquery: %s
279e0 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
279f0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
27a00 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
27a10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74  );.    }.    pCt
27a20 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a  e->zCteErr = 0;.
27a30 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
27a40 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
27a50 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
27a60 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
27a70 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
27a80 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
27a90 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 70   If the SELECT p
27aa0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
27ab0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73  ond argument has
27ac0 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57   an associated W
27ad0 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20  ITH .** clause, 
27ae0 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20  pop it from the 
27af0 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20  stack stored as 
27b00 70 61 72 74 20 6f 66 20 74 68 65 20 50 61 72 73  part of the Pars
27b10 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  e object..**.** 
27b20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
27b30 20 75 73 65 64 20 61 73 20 74 68 65 20 78 53 65   used as the xSe
27b40 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20  lectCallback2() 
27b50 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73  callback by.** s
27b60 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
27b70 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e  nd() when walkin
27b80 67 20 61 20 53 45 4c 45 43 54 20 74 72 65 65 20  g a SELECT tree 
27b90 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65  to resolve table
27ba0 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74  .** names and ot
27bb0 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  her FROM clause 
27bc0 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74  elements. .*/.st
27bd0 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
27be0 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a  PopWith(Walker *
27bf0 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
27c00 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
27c10 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
27c20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b  pParse;.  if( OK
27c30 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28  _IF_ALWAYS_TRUE(
27c40 70 50 61 72 73 65 2d 3e 70 57 69 74 68 29 20 26  pParse->pWith) &
27c50 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  & p->pPrior==0 )
27c60 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 57 69 74  {.    With *pWit
27c70 68 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73  h = findRightmos
27c80 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 20  t(p)->pWith;.   
27c90 20 69 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b   if( pWith!=0 ){
27ca0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
27cb0 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57  Parse->pWith==pW
27cc0 69 74 68 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ith );.      pPa
27cd0 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
27ce0 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20  th->pOuter;.    
27cf0 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64  }.  }.}.#else.#d
27d00 65 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57  efine selectPopW
27d10 69 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ith 0.#endif../*
27d20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
27d30 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c   is a Walker cal
27d40 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e  lback for "expan
27d50 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73  ding" a SELECT s
27d60 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78  tatement..** "Ex
27d70 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74  panding" means t
27d80 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  o do the followi
27d90 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ng:.**.**    (1)
27da0 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45    Make sure VDBE
27db0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
27dc0 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
27dd0 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20  ed to every.**  
27de0 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f         element o
27df0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
27e00 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
27e10 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61   Fill in the pTa
27e20 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20  bList->a[].pTab 
27e30 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72  fields in the Sr
27e40 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20  cList that .**  
27e50 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46         defines F
27e60 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65  ROM clause.  Whe
27e70 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69  n views appear i
27e80 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
27e90 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69  e,.**         fi
27ea0 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  ll pTabList->a[]
27eb0 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20  .pSelect with a 
27ec0 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
27ed0 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  CT statement.** 
27ee0 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70          that imp
27ef0 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
27f00 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64  .  A copy is mad
27f10 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20  e of the view's 
27f20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  SELECT.**       
27f30 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74    statement so t
27f40 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c  hat we can freel
27f50 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65  y modify or dele
27f60 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  te that statemen
27f70 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74  t.**         wit
27f80 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62  hout worrying ab
27f90 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74  out messing up t
27fa0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 72 65  he persistent re
27fb0 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  presentation.** 
27fc0 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76          of the v
27fd0 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33  iew..**.**    (3
27fe0 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20  )  Add terms to 
27ff0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
28000 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20   to accommodate 
28010 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
28020 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ord.**         o
28030 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20  n joins and the 
28040 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
28050 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a  use of joins..**
28060 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e  .**    (4)  Scan
28070 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c   the list of col
28080 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
28090 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20  lt set (pEList) 
280a0 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  looking.**      
280b0 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73     for instances
280c0 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72   of the "*" oper
280d0 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c  ator or the TABL
280e0 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  E.* operator..**
280f0 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e           If foun
28100 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22  d, expand each "
28110 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  *" to be every c
28120 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74  olumn in every t
28130 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  able.**         
28140 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62  and TABLE.* to b
28150 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
28160 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73  n TABLE..**.*/.s
28170 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
28180 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20  Expander(Walker 
28190 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
281a0 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
281b0 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
281c0 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69  >pParse;.  int i
281d0 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73  , j, k;.  SrcLis
281e0 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45  t *pTabList;.  E
281f0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
28200 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
28210 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20  t_item *pFrom;. 
28220 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
28230 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70  Parse->db;.  Exp
28240 72 20 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20  r *pE, *pRight, 
28250 2a 70 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65  *pExpr;.  u16 se
28260 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46  lFlags = p->selF
28270 6c 61 67 73 3b 0a 20 20 75 33 32 20 65 6c 69 73  lags;.  u32 elis
28280 74 46 6c 61 67 73 20 3d 20 30 3b 0a 0a 20 20 70  tFlags = 0;..  p
28290 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
282a0 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28  _Expanded;.  if(
282b0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
282c0 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  d  ){.    return
282d0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
282e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72    assert( p->pSr
282f0 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 73  c!=0 );.  if( (s
28300 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70  elFlags & SF_Exp
28310 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20  anded)!=0 ){.   
28320 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
28330 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73  e;.  }.  pTabLis
28340 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
28350 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
28360 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68  t;.  sqlite3With
28370 50 75 73 68 28 70 50 61 72 73 65 2c 20 70 2d 3e  Push(pParse, p->
28380 70 57 69 74 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a  pWith, 0);..  /*
28390 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f   Make sure curso
283a0 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
283b0 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
283c0 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  all entries in. 
283d0 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
283e0 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43  use of the SELEC
283f0 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  T statement..  *
28400 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  /.  sqlite3SrcLi
28410 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
28420 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
28430 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70  );..  /* Look up
28440 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d   every table nam
28450 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
28460 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c  lause of the sel
28470 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e  ect.  If.  ** an
28480 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
28490 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73  OM clause is a s
284a0 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20  ubquery instead 
284b0 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
284c0 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72  ew,.  ** then cr
284d0 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74  eate a transient
284e0 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
284f0 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65   to describe the
28500 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a   subquery..  */.
28510 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
28520 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
28530 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
28540 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
28550 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
28560 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
28570 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76  m->fg.isRecursiv
28580 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70  e==0 || pFrom->p
28590 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab!=0 );.    if
285a0 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65  ( pFrom->fg.isRe
285b0 63 75 72 73 69 76 65 20 29 20 63 6f 6e 74 69 6e  cursive ) contin
285c0 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
285d0 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
285e0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
285f0 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 69 66  _OMIT_CTE.    if
28600 28 20 77 69 74 68 45 78 70 61 6e 64 28 70 57 61  ( withExpand(pWa
28610 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29 20 72  lker, pFrom) ) r
28620 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
28630 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
28640 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23  pTab ) {} else.#
28650 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 46  endif.    if( pF
28660 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b  rom->zName==0 ){
28670 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
28680 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
28690 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
286a0 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
286b0 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75  t;.      /* A su
286c0 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46  b-query in the F
286d0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
286e0 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
286f0 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20  assert( pSel!=0 
28700 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
28710 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
28720 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
28730 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
28740 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29 20  Walker, pSel) ) 
28750 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
28760 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
28770 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c  Tab = pTab = sql
28780 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
28790 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
287a0 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e));.      if( p
287b0 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
287c0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
287d0 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d   pTab->nTabRef =
287e0 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46   1;.      if( pF
287f0 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  rom->zAlias ){. 
28800 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
28810 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
28820 72 44 75 70 28 64 62 2c 20 70 46 72 6f 6d 2d 3e  rDup(db, pFrom->
28830 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d  zAlias);.      }
28840 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54  else{.        pT
28850 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ab->zName = sqli
28860 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
28870 73 75 62 71 75 65 72 79 5f 25 70 22 2c 20 28 76  subquery_%p", (v
28880 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20  oid*)pTab);.    
28890 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28    }.      while(
288a0 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b   pSel->pPrior ){
288b0 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
288c0 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 71  rior; }.      sq
288d0 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d  lite3ColumnsFrom
288e0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
288f0 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70   pSel->pEList,&p
28900 54 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d  Tab->nCol,&pTab-
28910 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54  >aCol);.      pT
28920 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
28930 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77        pTab->nRow
28940 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73  LogEst = 200; as
28950 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74  sert( 200==sqlit
28960 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36  e3LogEst(1048576
28970 29 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ) );.      pTab-
28980 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
28990 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69  Ephemeral;.#endi
289a0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
289b0 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72     /* An ordinar
289c0 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  y table or view 
289d0 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  name in the FROM
289e0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
289f0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
28a00 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
28a10 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
28a20 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
28a30 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61  ateTableItem(pPa
28a40 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a  rse, 0, pFrom);.
28a50 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
28a60 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
28a70 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20  bort;.      if( 
28a80 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 3d 30  pTab->nTabRef>=0
28a90 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20  xffff ){.       
28aa0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
28ab0 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
28ac0 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ny references to
28ad0 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35   \"%s\": max 655
28ae0 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  35",.           
28af0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
28b00 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
28b10 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  b = 0;.        r
28b20 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
28b30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
28b40 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a  Tab->nTabRef++;.
28b50 20 20 20 20 20 20 69 66 28 20 21 49 73 56 69 72        if( !IsVir
28b60 74 75 61 6c 28 70 54 61 62 29 20 26 26 20 63 61  tual(pTab) && ca
28b70 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70  nnotBeFunction(p
28b80 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b  Parse, pFrom) ){
28b90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
28ba0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
28bb0 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28   }.#if !defined(
28bc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
28bd0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53  ) || !defined (S
28be0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
28bf0 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69  ALTABLE).      i
28c00 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
28c10 62 29 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c  b) || pTab->pSel
28c20 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ect ){.        i
28c30 31 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  16 nCol;.       
28c40 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77   if( sqlite3View
28c50 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
28c60 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 20 72  Parse, pTab) ) r
28c70 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
28c80 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
28c90 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d   pFrom->pSelect=
28ca0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46  =0 );.        pF
28cb0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  rom->pSelect = s
28cc0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
28cd0 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  db, pTab->pSelec
28ce0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  t, 0);.        s
28cf0 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e  qlite3SelectSetN
28d00 61 6d 65 28 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  ame(pFrom->pSele
28d10 63 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  ct, pTab->zName)
28d20 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d  ;.        nCol =
28d30 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20   pTab->nCol;.   
28d40 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20       pTab->nCol 
28d50 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 71  = -1;.        sq
28d60 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
28d70 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e  pWalker, pFrom->
28d80 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
28d90 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e    pTab->nCol = n
28da0 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  Col;.      }.#en
28db0 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
28dc0 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  * Locate the ind
28dd0 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20  ex named by the 
28de0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
28df0 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20  e, if any. */.  
28e00 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64    if( sqlite3Ind
28e10 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61  exedByLookup(pPa
28e20 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20  rse, pFrom) ){. 
28e30 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
28e40 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  Abort;.    }.  }
28e50 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e  ..  /* Process N
28e60 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c  ATURAL keywords,
28e70 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e   and ON and USIN
28e80 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69  G clauses of joi
28e90 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ns..  */.  if( d
28ea0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
28eb0 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  || sqliteProcess
28ec0 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20  Join(pParse, p) 
28ed0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
28ee0 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20  C_Abort;.  }..  
28ef0 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22  /* For every "*"
28f00 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
28f10 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c  the column list,
28f20 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
28f30 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f  s of.  ** all co
28f40 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
28f50 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76  les.  And for ev
28f60 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65  ery TABLE.* inse
28f70 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a  rt the names.  *
28f80 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  * of all columns
28f90 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20   in TABLE.  The 
28fa0 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20  parser inserted 
28fb0 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73  a special expres
28fc0 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74  sion.  ** with t
28fd0 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 20 6f  he TK_ASTERISK o
28fe0 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68  perator for each
28ff0 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75   "*" that it fou
29000 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  nd in the column
29010 0a 20 20 2a 2a 20 6c 69 73 74 2e 20 20 54 68 65  .  ** list.  The
29020 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
29030 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61  just has to loca
29040 74 65 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49  te the TK_ASTERI
29050 53 4b 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  SK.  ** expressi
29060 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 20 65  ons and expand e
29070 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c  ach one to the l
29080 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d  ist of all colum
29090 6e 73 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74  ns in.  ** all t
290a0 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
290b0 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20   The first loop 
290c0 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73  just checks to s
290d0 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
290e0 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  any "*" operator
290f0 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64  s.  ** that need
29100 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f   expanding..  */
29110 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45  .  for(k=0; k<pE
29120 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
29130 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69  ){.    pE = pELi
29140 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  st->a[k].pExpr;.
29150 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
29160 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72  TK_ASTERISK ) br
29170 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  eak;.    assert(
29180 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
29190 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30  || pE->pRight!=0
291a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
291b0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
291c0 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20  | (pE->pLeft!=0 
291d0 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70  && pE->pLeft->op
291e0 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20  ==TK_ID) );.    
291f0 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
29200 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  OT && pE->pRight
29210 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53  ->op==TK_ASTERIS
29220 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 65  K ) break;.    e
29230 6c 69 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d  listFlags |= pE-
29240 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69 66  >flags;.  }.  if
29250 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ( k<pEList->nExp
29260 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  r ){.    /*.    
29270 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72  ** If we get her
29280 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72  e it means the r
29290 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69  esult set contai
292a0 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22  ns one or more "
292b0 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  *".    ** operat
292c0 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
292d0 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c   be expanded.  L
292e0 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
292f0 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
29300 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
29310 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20   set and expand 
29320 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  them one by one.
29330 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75  .    */.    stru
29340 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
29350 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b   *a = pEList->a;
29360 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
29370 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  New = 0;.    int
29380 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d   flags = pParse-
29390 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  >db->flags;.    
293a0 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20  int longNames = 
293b0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
293c0 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
293d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
293e0 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73         && (flags
293f0 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
29400 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20  olNames)==0;..  
29410 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
29420 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
29430 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b  {.      pE = a[k
29440 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65  ].pExpr;.      e
29450 6c 69 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d  listFlags |= pE-
29460 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 70 52  >flags;.      pR
29470 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68  ight = pE->pRigh
29480 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
29490 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
294a0 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  || pRight!=0 );.
294b0 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
294c0 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20  !=TK_ASTERISK.  
294d0 20 20 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21       && (pE->op!
294e0 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68  =TK_DOT || pRigh
294f0 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49  t->op!=TK_ASTERI
29500 53 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  SK).      ){.   
29510 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72       /* This par
29520 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69  ticular expressi
29530 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
29540 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
29550 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
29560 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
29570 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
29580 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61  (pParse, pNew, a
29590 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [k].pExpr);.    
295a0 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
295b0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
295c0 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
295d0 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e  .zName = a[k].zN
295e0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ame;.          p
295f0 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
29600 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b  pr-1].zSpan = a[
29610 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20  k].zSpan;.      
29620 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d      a[k].zName =
29630 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b   0;.          a[
29640 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20  k].zSpan = 0;.  
29650 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29660 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[k].pExpr = 0;.
29670 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29680 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70       /* This exp
29690 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22  ression is a "*"
296a0 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20   or a "TABLE.*" 
296b0 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  and needs to be.
296c0 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e          ** expan
296d0 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ded. */.        
296e0 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20  int tableSeen = 
296f0 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  0;      /* Set t
29700 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d  o 1 when TABLE m
29710 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
29720 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d    char *zTName =
29730 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78   0;       /* tex
29740 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42  t of name of TAB
29750 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  LE */.        if
29760 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
29770 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
29780 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21  sert( pE->pLeft!
29790 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
297a0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
297b0 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65  Property(pE->pLe
297c0 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  ft, EP_IntValue)
297d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   );.          zT
297e0 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74  Name = pE->pLeft
297f0 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
29800 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
29810 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
29820 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
29830 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
29840 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
29850 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
29860 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
29870 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
29880 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pSub = pFrom->
29890 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
298a0 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
298b0 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  e = pFrom->zAlia
298c0 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  s;.          con
298d0 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  st char *zSchema
298e0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
298f0 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
29900 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
29910 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
29920 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d        zTabName =
29930 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
29940 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29950 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
29960 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b  ocFailed ) break
29970 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29980 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62  pSub==0 || (pSub
29990 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
299a0 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29  NestedFrom)==0 )
299b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
299c0 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ub = 0;.        
299d0 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
299e0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
299f0 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d  (zTName, zTabNam
29a00 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
29a10 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
29a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
29a30 20 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d             iDb =
29a40 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
29a50 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
29a60 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
29a70 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d        zSchemaNam
29a80 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d  e = iDb>=0 ? db-
29a90 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
29aa0 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20  me : "*";.      
29ab0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29ac0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
29ad0 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
29ae0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
29af0 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Name = pTab->aCo
29b00 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  l[j].zName;.    
29b10 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43          char *zC
29b20 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20  olname;  /* The 
29b30 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  computed column 
29b40 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
29b50 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65      char *zToFre
29b60 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64  e;   /* Malloced
29b70 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65   string that nee
29b80 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a  ds to be freed *
29b90 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6f  /.            To
29ba0 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f  ken sColname;  /
29bb0 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d  * Computed colum
29bc0 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65  n name as a toke
29bd0 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20  n */..          
29be0 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20    assert( zName 
29bf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
29c00 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75  f( zTName && pSu
29c10 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  b.             &
29c20 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70  & sqlite3MatchSp
29c30 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c  anName(pSub->pEL
29c40 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c  ist->a[j].zSpan,
29c50 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d   0, zTName, 0)==
29c60 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b  0.            ){
29c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
29c80 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
29c90 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
29ca0 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75      /* If a colu
29cb0 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  mn is marked as 
29cc0 27 68 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69  'hidden', omit i
29cd0 74 20 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e  t from the expan
29ce0 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ded.            
29cf0 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69  ** result-set li
29d00 73 74 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45  st unless the SE
29d10 4c 45 43 54 20 68 61 73 20 74 68 65 20 53 46 5f  LECT has the SF_
29d20 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20  IncludeHidden.  
29d30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74            ** bit
29d40 20 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20   set..          
29d50 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
29d60 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
29d70 73 20 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69  s & SF_IncludeHi
29d80 64 64 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20  dden)==0.       
29d90 20 20 20 20 20 20 26 26 20 49 73 48 69 64 64 65        && IsHidde
29da0 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61  nColumn(&pTab->a
29db0 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20  Col[j]) .       
29dc0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
29dd0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
29de0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
29df0 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
29e00 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  een = 1;..      
29e10 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
29e20 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20   zTName==0 ){.  
29e30 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
29e40 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pFrom->fg.joint
29e50 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
29e60 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
29e70 20 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64       && tableAnd
29e80 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62  ColumnIndex(pTab
29e90 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  List, i, zName, 
29ea0 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20 20  0, 0).          
29eb0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
29ec0 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e         /* In a N
29ed0 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69  ATURAL join, omi
29ee0 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d  t the join colum
29ef0 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  ns from the .   
29f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
29f10 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67  table to the rig
29f20 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  ht of the join *
29f30 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
29f40 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
29f50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29f60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
29f70 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
29f80 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20  (pFrom->pUsing, 
29f90 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
29fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29fb0 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61  In a join with a
29fc0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f   USING clause, o
29fd0 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  mit columns in t
29fe0 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  he.             
29ff0 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75     ** using clau
2a000 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  se from the tabl
2a010 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  e on the right. 
2a020 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
2a030 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2a040 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2a050 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a060 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20         pRight = 
2a070 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
2a080 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20  TK_ID, zName);. 
2a090 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e             zColn
2a0a0 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
2a0b0 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65           zToFree
2a0c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2a0d0 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
2a0e0 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  || pTabList->nSr
2a0f0 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>1 ){.         
2a100 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
2a110 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2a120 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
2a130 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
2a140 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TabName);.      
2a150 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
2a160 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
2a170 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65  rse, TK_DOT, pLe
2a180 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  ft, pRight);.   
2a190 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
2a1a0 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20  SchemaName ){.  
2a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
2a1c0 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
2a1d0 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63  r(db, TK_ID, zSc
2a1e0 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20  hemaName);.     
2a1f0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2a200 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2a210 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
2a220 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 20  pLeft, pExpr);. 
2a230 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2a240 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2a250 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20   longNames ){.  
2a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
2a270 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  olname = sqlite3
2a280 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
2a290 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a  %s", zTabName, z
2a2a0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
2a2b0 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
2a2c0 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20   zColname;.     
2a2d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a2e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2a2f0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2a300 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  r = pRight;.    
2a310 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a320 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
2a330 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
2a340 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
2a350 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
2a360 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65       sqlite3Toke
2a370 6e 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c  nInit(&sColname,
2a380 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20   zColname);.    
2a390 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2a3a0 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70  xprListSetName(p
2a3b0 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43  Parse, pNew, &sC
2a3c0 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  olname, 0);.    
2a3d0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
2a3e0 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
2a3f0 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
2a400 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2a410 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
2a420 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d  rList_item *pX =
2a430 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e   &pNew->a[pNew->
2a440 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20  nExpr-1];.      
2a450 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
2a460 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a470 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20      pX->zSpan = 
2a480 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
2a490 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  db, pSub->pEList
2a4a0 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[j].zSpan);. 
2a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2a4c0 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70  estcase( pX->zSp
2a4d0 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  an==0 );.       
2a4e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
2a500 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
2a510 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
2a520 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20  .%s.%s",.       
2a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a550 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c      zSchemaName,
2a560 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e   zTabName, zColn
2a570 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2a580 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2a590 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a  pX->zSpan==0 );.
2a5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
2a5c0 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31  ->bSpanIsTab = 1
2a5d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2a5e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2a5f0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54  te3DbFree(db, zT
2a600 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  oFree);.        
2a610 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2a620 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65        if( !table
2a630 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Seen ){.        
2a640 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a    if( zTName ){.
2a650 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2a660 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2a670 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  se, "no such tab
2a680 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29  le: %s", zTName)
2a690 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2a6a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
2a6b0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2a6c0 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65  Parse, "no table
2a6d0 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20  s specified");. 
2a6e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a6f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2a700 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
2a710 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
2a720 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d   pEList);.    p-
2a730 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  >pEList = pNew;.
2a740 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c    }.  if( p->pEL
2a750 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ist ){.    if( p
2a760 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ->pEList->nExpr>
2a770 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
2a780 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
2a790 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2a7a0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2a7b0 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
2a7c0 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
2a7d0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
2a7e0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
2a7f0 7d 0a 20 20 20 20 69 66 28 20 28 65 6c 69 73 74  }.    if( (elist
2a800 46 6c 61 67 73 20 26 20 28 45 50 5f 48 61 73 46  Flags & (EP_HasF
2a810 75 6e 63 7c 45 50 5f 53 75 62 71 75 65 72 79 29  unc|EP_Subquery)
2a820 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )!=0 ){.      p-
2a830 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
2a840 43 6f 6d 70 6c 65 78 52 65 73 75 6c 74 3b 0a 20  ComplexResult;. 
2a850 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2a860 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2a870 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72  }../*.** No-op r
2a880 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70  outine for the p
2a890 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72  arse-tree walker
2a8a0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
2a8b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
2a8c0 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
2a8d0 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65  lback then expre
2a8e0 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61  ssion trees.** a
2a8f0 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75  re walked withou
2a900 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65  t any actions be
2a910 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63  ing taken at eac
2a920 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61  h node.  Presuma
2a930 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69  bly,.** when thi
2a940 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
2a950 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78  d for Walker.xEx
2a960 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
2a970 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65  .** Walker.xSele
2a980 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65  ctCallback is se
2a990 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e  t to do somethin
2a9a0 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65  g useful for eve
2a9b0 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ry .** subquery 
2a9c0 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72  in the parser tr
2a9d0 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ee..*/.int sqlit
2a9e0 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57  e3ExprWalkNoop(W
2a9f0 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
2aa00 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b  Expr *NotUsed2){
2aa10 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2aa20 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
2aa30 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
2aa40 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2aa50 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72  }../*.** No-op r
2aa60 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70  outine for the p
2aa70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72  arse-tree walker
2aa80 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
2aa90 65 6d 65 6e 74 73 2e 0a 2a 2a 20 73 75 62 71 75  ements..** subqu
2aaa0 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65  ery in the parse
2aab0 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73  r tree..*/.int s
2aac0 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
2aad0 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74  Noop(Walker *Not
2aae0 55 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f  Used, Select *No
2aaf0 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
2ab00 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
2ab10 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
2ab20 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
2ab30 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20 53  ntinue;.}..#if S
2ab40 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
2ab50 2a 20 41 6c 77 61 79 73 20 61 73 73 65 72 74 2e  * Always assert.
2ab60 20 20 54 68 69 73 20 78 53 65 6c 65 63 74 43 61    This xSelectCa
2ab70 6c 6c 62 61 63 6b 32 20 69 6d 70 6c 65 6d 65 6e  llback2 implemen
2ab80 74 61 74 69 6f 6e 20 70 72 6f 76 65 73 20 74 68  tation proves th
2ab90 61 74 20 74 68 65 0a 2a 2a 20 78 53 65 6c 65 63  at the.** xSelec
2aba0 74 43 61 6c 6c 62 61 63 6b 32 20 69 73 20 6e 65  tCallback2 is ne
2abb0 76 65 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a  ver invoked..*/.
2abc0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
2abd0 63 74 57 61 6c 6b 41 73 73 65 72 74 32 28 57 61  ctWalkAssert2(Wa
2abe0 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53  lker *NotUsed, S
2abf0 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29  elect *NotUsed2)
2ac00 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2ac10 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
2ac20 6f 74 55 73 65 64 32 29 3b 0a 20 20 61 73 73 65  otUsed2);.  asse
2ac30 72 74 28 20 30 20 29 3b 0a 7d 0a 23 65 6e 64 69  rt( 0 );.}.#endi
2ac40 66 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  f./*.** This rou
2ac50 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61  tine "expands" a
2ac60 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2ac70 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  t and all of its
2ac80 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20   subqueries..** 
2ac90 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  For additional i
2aca0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68  nformation on wh
2acb0 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22  at it means to "
2acc0 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54  expand" a SELECT
2acd0 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73  .** statement, s
2ace0 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f  ee the comment o
2acf0 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70 61  n the selectExpa
2ad00 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61  nd worker callba
2ad10 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  ck above..**.** 
2ad20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45  Expanding a SELE
2ad30 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  CT statement is 
2ad40 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20 69  the first step i
2ad50 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a  n processing a.*
2ad60 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
2ad70 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20  nt.  The SELECT 
2ad80 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62  statement must b
2ad90 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72  e expanded befor
2ada0 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75  e.** name resolu
2adb0 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65  tion is performe
2adc0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74  d..**.** If anyt
2add0 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
2ade0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2adf0 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
2ae00 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65  o pParse..** The
2ae10 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2ae20 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68 65  n can detect the
2ae30 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b   problem by look
2ae40 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e  ing at pParse->n
2ae50 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50  Err.** and/or pP
2ae60 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
2ae70 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  Failed..*/.stati
2ae80 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
2ae90 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73 65  lectExpand(Parse
2aea0 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
2aeb0 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61   *pSelect){.  Wa
2aec0 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70  lker w;.  w.xExp
2aed0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  rCallback = sqli
2aee0 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b  te3ExprWalkNoop;
2aef0 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
2af00 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49  arse;.  if( OK_I
2af10 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70 50  F_ALWAYS_TRUE(pP
2af20 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e  arse->hasCompoun
2af30 64 29 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c  d) ){.    w.xSel
2af40 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f  ectCallback = co
2af50 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c  nvertCompoundSel
2af60 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20  ectToSubquery;. 
2af70 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c     w.xSelectCall
2af80 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 73  back2 = 0;.    s
2af90 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
2afa0 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (&w, pSelect);. 
2afb0 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61   }.  w.xSelectCa
2afc0 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45  llback = selectE
2afd0 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53 65  xpander;.  w.xSe
2afe0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
2aff0 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20  selectPopWith;. 
2b000 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
2b010 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
2b020 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
2b030 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
2b040 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  Y./*.** This is 
2b050 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  a Walker.xSelect
2b060 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63  Callback callbac
2b070 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  k for the sqlite
2b080 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28  3SelectTypeInfo(
2b090 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a  ).** interface..
2b0a0 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46  **.** For each F
2b0b0 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
2b0c0 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e  ery, add Column.
2b0d0 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e  zType and Column
2b0e0 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  .zColl.** inform
2b0f0 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62  ation to the Tab
2b100 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
2b110 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
2b120 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f   result set.** o
2b130 66 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e  f that subquery.
2b140 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  .**.** The Table
2b150 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2b160 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
2b170 65 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f  esult set was co
2b180 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20  nstructed.** by 
2b190 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29  selectExpander()
2b1a0 20 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e   but the type an
2b1b0 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
2b1c0 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74  rmation was omit
2b1d0 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70  ted.** at that p
2b1e0 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65  oint because ide
2b1f0 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74  ntifiers had not
2b200 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76   yet been resolv
2b210 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ed.  This.** rou
2b220 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
2b230 66 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20  fter identifier 
2b240 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73  resolution..*/.s
2b250 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
2b260 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65  tAddSubqueryType
2b270 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61  Info(Walker *pWa
2b280 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
2b290 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
2b2a0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72  e;.  int i;.  Sr
2b2b0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
2b2c0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2b2d0 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a  t_item *pFrom;..
2b2e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c    assert( p->sel
2b2f0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
2b300 76 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ved );.  assert(
2b310 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2b320 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d  SF_HasTypeInfo)=
2b330 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c  =0 );.  p->selFl
2b340 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70  ags |= SF_HasTyp
2b350 65 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20  eInfo;.  pParse 
2b360 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
2b370 65 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  e;.  pTabList = 
2b380 70 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->pSrc;.  for(i
2b390 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
2b3a0 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
2b3b0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
2b3c0 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  rom++){.    Tabl
2b3d0 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
2b3e0 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72  >pTab;.    asser
2b3f0 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
2b400 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62    if( (pTab->tab
2b410 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
2b420 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  eral)!=0 ){.    
2b430 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
2b440 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2b450 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
2b460 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
2b470 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSel = pFrom->p
2b480 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66  Select;.      if
2b490 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20  ( pSel ){.      
2b4a0 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70    while( pSel->p
2b4b0 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70  Prior ) pSel = p
2b4c0 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  Sel->pPrior;.   
2b4d0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
2b4e0 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
2b4f0 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72  ndCollation(pPar
2b500 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b  se, pTab, pSel);
2b510 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2b520 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
2b530 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2b540 20 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61   adds datatype a
2b550 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
2b560 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  uence informatio
2b570 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c  n to.** the Tabl
2b580 65 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  e structures of 
2b590 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
2b5a0 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a  subqueries in a.
2b5b0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
2b5c0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ent..**.** Use t
2b5d0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65  his routine afte
2b5e0 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
2b5f0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
2b600 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41  d sqlite3SelectA
2b610 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65  ddTypeInfo(Parse
2b620 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
2b630 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e   *pSelect){.#ifn
2b640 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2b650 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65  SUBQUERY.  Walke
2b660 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  r w;.  w.xSelect
2b670 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
2b680 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70  e3SelectWalkNoop
2b690 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
2b6a0 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41  lback2 = selectA
2b6b0 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
2b6c0 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  fo;.  w.xExprCal
2b6d0 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  lback = sqlite3E
2b6e0 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
2b6f0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
2b700 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  ;.  sqlite3WalkS
2b710 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
2b720 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  t);.#endif.}.../
2b730 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2b740 65 20 73 65 74 73 20 75 70 20 61 20 53 45 4c 45  e sets up a SELE
2b750 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  CT statement for
2b760 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68   processing.  Th
2b770 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  e.** following i
2b780 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a  s accomplished:.
2b790 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42  **.**     *  VDB
2b7a0 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E Cursor numbers
2b7b0 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f   are assigned to
2b7c0 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
2b7d0 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a   terms..**     *
2b7e0 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c    Ephemeral Tabl
2b7f0 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72  e objects are cr
2b800 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52  eated for all FR
2b810 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
2b820 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  ries..**     *  
2b830 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
2b840 75 73 65 73 20 61 72 65 20 73 68 69 66 74 65 64  uses are shifted
2b850 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74   into WHERE stat
2b860 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20  ements.**     * 
2b870 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61   Wildcards "*" a
2b880 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20  nd "TABLE.*" in 
2b890 72 65 73 75 6c 74 20 73 65 74 73 20 61 72 65 20  result sets are 
2b8a0 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20  expanded..**    
2b8b0 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73 20   *  Identifiers 
2b8c0 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72  in expression ar
2b8d0 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62  e matched to tab
2b8e0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  les..**.** This 
2b8f0 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65 63  routine acts rec
2b900 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20  ursively on all 
2b910 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68 69  subqueries withi
2b920 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f  n the SELECT..*/
2b930 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
2b940 65 63 74 50 72 65 70 28 0a 20 20 50 61 72 73 65  ectPrep(.  Parse
2b950 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2b960 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
2b970 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
2b980 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
2b990 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
2b9a0 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
2b9b0 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61  g coded. */.  Na
2b9c0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65  meContext *pOute
2b9d0 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  rNC  /* Name con
2b9e0 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e  text for contain
2b9f0 65 72 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  er */.){.  asser
2ba00 74 28 20 70 21 3d 30 20 7c 7c 20 70 50 61 72 73  t( p!=0 || pPars
2ba10 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
2ba20 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 50 61  led );.  if( pPa
2ba30 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
2ba40 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
2ba50 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
2ba60 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e  s & SF_HasTypeIn
2ba70 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  fo ) return;.  s
2ba80 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
2ba90 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  nd(pParse, p);. 
2baa0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
2bab0 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  r || pParse->db-
2bac0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2bad0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
2bae0 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61  3ResolveSelectNa
2baf0 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  mes(pParse, p, p
2bb00 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20  OuterNC);.  if( 
2bb10 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
2bb20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
2bb30 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
2bb40 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  n;.  sqlite3Sele
2bb50 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50  ctAddTypeInfo(pP
2bb60 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  arse, p);.}../*.
2bb70 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67  ** Reset the agg
2bb80 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
2bb90 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67  or..**.** The ag
2bba0 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
2bbb0 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20  tor is a set of 
2bbc0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61  memory cells tha
2bbd0 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d  t hold.** interm
2bbe0 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77  ediate results w
2bbf0 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67  hile calculating
2bc00 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
2bc10 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
2bc20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
2bc30 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73  hat stores NULLs
2bc40 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65   in all of those
2bc50 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73   memory.** cells
2bc60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2bc70 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
2bc80 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
2bc90 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
2bca0 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
2bcb0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
2bcc0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
2bcd0 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
2bce0 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65  pFunc;.  int nRe
2bcf0 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  g = pAggInfo->nF
2bd00 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e  unc + pAggInfo->
2bd10 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e  nColumn;.  if( n
2bd20 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Reg==0 ) return;
2bd30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2bd40 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79  EBUG.  /* Verify
2bd50 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66   that all AggInf
2bd60 6f 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20  o registers are 
2bd70 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65  within the range
2bd80 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 20 20   specified by.  
2bd90 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67  ** AggInfo.mnReg
2bda0 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20  ..AggInfo.mxReg 
2bdb0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  */.  assert( nRe
2bdc0 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  g==pAggInfo->mxR
2bdd0 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  eg-pAggInfo->mnR
2bde0 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d  eg+1 );.  for(i=
2bdf0 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
2be00 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
2be10 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e    assert( pAggIn
2be20 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
2be30 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
2be40 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
2be50 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e  ggInfo->aCol[i].
2be60 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem<=pAggInfo->
2be70 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66  mxReg );.  }.  f
2be80 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
2be90 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  fo->nFunc; i++){
2bea0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67  .    assert( pAg
2beb0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e  gInfo->aFunc[i].
2bec0 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem>=pAggInfo->
2bed0 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26  mnReg.         &
2bee0 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  & pAggInfo->aFun
2bef0 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49  c[i].iMem<=pAggI
2bf00 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20  nfo->mxReg );.  
2bf10 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
2bf20 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2bf30 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67  OP_Null, 0, pAgg
2bf40 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67  Info->mnReg, pAg
2bf50 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20  gInfo->mxReg);. 
2bf60 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49   for(pFunc=pAggI
2bf70 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b  nfo->aFunc, i=0;
2bf80 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
2bf90 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b  nc; i++, pFunc++
2bfa0 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  ){.    if( pFunc
2bfb0 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
2bfc0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
2bfd0 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b   = pFunc->pExpr;
2bfe0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
2bff0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2c000 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pE, EP_xIsSelect
2c010 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
2c020 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c  E->x.pList==0 ||
2c030 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45   pE->x.pList->nE
2c040 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
2c050 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2c060 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  g(pParse, "DISTI
2c070 4e 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d  NCT aggregates m
2c080 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79  ust have exactly
2c090 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20   one ".         
2c0a0 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20    "argument");. 
2c0b0 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44         pFunc->iD
2c0c0 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
2c0d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c0e0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
2c0f0 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
2c100 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
2c110 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20  e, pE->x.pList, 
2c120 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
2c130 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2c140 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
2c150 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69  eral, pFunc->iDi
2c160 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  stinct, 0, 0,.  
2c170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c180 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
2c190 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
2c1a0 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NFO);.      }.  
2c1b0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
2c1c0 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
2c1d0 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
2c1e0 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
2c1f0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
2c200 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
2c210 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
2c220 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
2c230 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
2c240 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
2c250 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
2c260 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
2c270 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
2c280 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
2c290 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
2c2a0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
2c2b0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
2c2c0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
2c2d0 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
2c2e0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
2c2f0 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
2c300 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
2c310 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2c320 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
2c330 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2c340 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2c350 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
2c360 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65  ggFinal, pF->iMe
2c370 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74  m, pList ? pList
2c380 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20  ->nExpr : 0);.  
2c390 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
2c3a0 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75  endP4(v, pF->pFu
2c3b0 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
2c3c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70  .  }.}../*.** Up
2c3d0 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c  date the accumul
2c3e0 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ator memory cell
2c3f0 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  s for an aggrega
2c400 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  te based on.** t
2c410 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
2c420 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73  r position..*/.s
2c430 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74  tatic void updat
2c440 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  eAccumulator(Par
2c450 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
2c460 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
2c470 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
2c480 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
2c490 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74   i;.  int regHit
2c4a0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72   = 0;.  int addr
2c4b0 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73  HitTest = 0;.  s
2c4c0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
2c4d0 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74  nc *pF;.  struct
2c4e0 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
2c4f0 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64  ;..  pAggInfo->d
2c500 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
2c510 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
2c520 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
2c530 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
2c540 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
2c550 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
2c560 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
2c570 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b  .    int regAgg;
2c580 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
2c590 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
2c5a0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
2c5b0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2c5c0 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
2c5d0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
2c5e0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
2c5f0 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
2c600 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
2c610 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
2c620 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
2c630 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
2c640 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2c650 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
2c660 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
2c670 65 67 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45  egAgg, 0, SQLITE
2c680 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20  _ECEL_DUP);.    
2c690 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72  }else{.      nAr
2c6a0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67  g = 0;.      reg
2c6b0 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Agg = 0;.    }. 
2c6c0 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74     if( pF->iDist
2c6d0 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
2c6e0 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69   addrNext = sqli
2c6f0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
2c700 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
2c710 61 73 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20  ase( nArg==0 ); 
2c720 20 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74   /* Error condit
2c730 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  ion */.      tes
2c740 74 63 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b  tcase( nArg>1 );
2c750 20 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72     /* Also an er
2c760 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64  ror */.      cod
2c770 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65  eDistinct(pParse
2c780 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c  , pF->iDistinct,
2c790 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65   addrNext, 1, re
2c7a0 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gAgg);.    }.   
2c7b0 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e   if( pF->pFunc->
2c7c0 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
2c7d0 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
2c7e0 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
2c7f0 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
2c800 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
2c810 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2c820 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
2c830 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
2c840 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73  t!=0 );  /* pLis
2c850 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e  t!=0 if pF->pFun
2c860 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a  c has NEEDCOLL *
2c870 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  /.      for(j=0,
2c880 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
2c890 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72   !pColl && j<nAr
2c8a0 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  g; j++, pItem++)
2c8b0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
2c8c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
2c8d0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
2c8e0 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
2c8f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
2c900 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
2c910 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
2c920 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
2c930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2c940 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41   regHit==0 && pA
2c950 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
2c960 61 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20  ator ) regHit = 
2c970 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2c980 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2c990 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
2c9a0 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30  llSeq, regHit, 0
2c9b0 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
2c9c0 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
2c9d0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2c9e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2c9f0 4f 50 5f 41 67 67 53 74 65 70 30 2c 20 30 2c 20  OP_AggStep0, 0, 
2ca00 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d  regAgg, pF->iMem
2ca10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2ca20 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46  beAppendP4(v, pF
2ca30 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
2ca40 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  DEF);.    sqlite
2ca50 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2ca60 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20   (u8)nArg);.    
2ca70 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2ca80 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
2ca90 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e  Parse, regAgg, n
2caa0 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
2cab0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
2cac0 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67  e(pParse, regAgg
2cad0 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28  , nArg);.    if(
2cae0 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20   addrNext ){.   
2caf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2cb00 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
2cb10 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73  drNext);.      s
2cb20 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
2cb30 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
2cb40 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65    }.  }..  /* Be
2cb50 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20  fore populating 
2cb60 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
2cb70 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72  registers, clear
2cb80 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
2cb90 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  e..  ** Otherwis
2cba0 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  e, if any of the
2cbb0 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e   required column
2cbc0 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65   values are alre
2cbd0 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a  ady present .  *
2cbe0 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20  * in registers, 
2cbf0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
2cc00 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f  ) may use OP_SCo
2cc10 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76  py to copy the v
2cc20 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d  alue.  ** to pC-
2cc30 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68  >iMem. But by th
2cc40 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65  e time the value
2cc50 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72   is used, the or
2cc60 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a  iginal register.
2cc70 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65    ** may have be
2cc80 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64  en used, invalid
2cc90 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c  ating the underl
2cca0 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64  ying buffer hold
2ccb0 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78  ing the.  ** tex
2ccc0 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e  t or blob value.
2ccd0 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33   See ticket [883
2cce0 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20  034dcb5]..  **. 
2ccf0 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75   ** Another solu
2cd00 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f  tion would be to
2cd10 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53   change the OP_S
2cd20 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70  Copy used to cop
2cd30 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61  y cached.  ** va
2cd40 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f  lues to an OP_Co
2cd50 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  py..  */.  if( r
2cd60 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64  egHit ){.    add
2cd70 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74  rHitTest = sqlit
2cd80 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2cd90 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20  OP_If, regHit); 
2cda0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2cdb0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
2cdc0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2cdd0 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  rse);.  for(i=0,
2cde0 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43   pC=pAggInfo->aC
2cdf0 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  ol; i<pAggInfo->
2ce00 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b  nAccumulator; i+
2ce10 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71  +, pC++){.    sq
2ce20 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
2ce30 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c  arse, pC->pExpr,
2ce40 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a   pC->iMem);.  }.
2ce50 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
2ce60 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71  ctMode = 0;.  sq
2ce70 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2ce80 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69  ear(pParse);.  i
2ce90 66 28 20 61 64 64 72 48 69 74 54 65 73 74 20 29  f( addrHitTest )
2cea0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
2ceb0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
2cec0 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d  rHitTest);.  }.}
2ced0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69  ../*.** Add a si
2cee0 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20  ngle OP_Explain 
2cef0 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74  instruction to t
2cf00 68 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61  he VDBE to expla
2cf10 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63  in a simple.** c
2cf20 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22  ount(*) query ("
2cf30 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
2cf40 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a  FROM pTab")..*/.
2cf50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2cf60 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74  MIT_EXPLAIN.stat
2cf70 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53  ic void explainS
2cf80 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61  impleCount(.  Pa
2cf90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
2cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cfb0 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
2cfc0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
2cfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfe0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69      /* Table bei
2cff0 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20  ng queried */.  
2d000 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
2d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d020 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f  /* Index used to
2d030 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20   optimize scan, 
2d040 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  or NULL */.){.  
2d050 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
2d060 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e  ain==2 ){.    in
2d070 74 20 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78  t bCover = (pIdx
2d080 21 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69 64  !=0 && (HasRowid
2d090 28 70 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69  (pTab) || !IsPri
2d0a0 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64  maryKeyIndex(pId
2d0b0 78 29 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  x)));.    sqlite
2d0c0 33 56 64 62 65 45 78 70 6c 61 69 6e 28 70 50 61  3VdbeExplain(pPa
2d0d0 72 73 65 2c 20 30 2c 20 22 53 43 41 4e 20 54 41  rse, 0, "SCAN TA
2d0e0 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20  BLE %s%s%s",.   
2d0f0 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
2d100 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72  ,.        bCover
2d110 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52   ? " USING COVER
2d120 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22  ING INDEX " : ""
2d130 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72  ,.        bCover
2d140 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a   ? pIdx->zName :
2d150 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d   "".    );.  }.}
2d160 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
2d170 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
2d180 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66  nt(a,b,c).#endif
2d190 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57  ../*.** sqlite3W
2d1a0 61 6c 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61  alkExpr() callba
2d1b0 63 6b 20 75 73 65 64 20 62 79 20 68 61 76 69 6e  ck used by havin
2d1c0 67 54 6f 57 68 65 72 65 28 29 2e 0a 2a 2a 0a 2a  gToWhere()..**.*
2d1d0 2a 20 49 66 20 74 68 65 20 6e 6f 64 65 20 70 61  * If the node pa
2d1e0 73 73 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  ssed to the call
2d1f0 62 61 63 6b 20 69 73 20 61 20 54 4b 5f 41 4e 44  back is a TK_AND
2d200 20 6e 6f 64 65 2c 20 72 65 74 75 72 6e 20 0a 2a   node, return .*
2d210 2a 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 20 74  * WRC_Continue t
2d220 6f 20 74 65 6c 6c 20 73 71 6c 69 74 65 33 57 61  o tell sqlite3Wa
2d230 6c 6b 45 78 70 72 28 29 20 74 6f 20 69 74 65 72  lkExpr() to iter
2d240 61 74 65 20 74 68 72 6f 75 67 68 20 63 68 69 6c  ate through chil
2d250 64 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  d nodes..**.** O
2d260 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
2d270 20 57 52 43 5f 50 72 75 6e 65 2e 20 49 6e 20 74   WRC_Prune. In t
2d280 68 69 73 20 63 61 73 65 2c 20 61 6c 73 6f 20 63  his case, also c
2d290 68 65 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20  heck if the .** 
2d2a0 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e 20 6d  sub-expression m
2d2b0 61 74 63 68 65 73 20 74 68 65 20 63 72 69 74 65  atches the crite
2d2c0 72 69 61 20 66 6f 72 20 62 65 69 6e 67 20 6d 6f  ria for being mo
2d2d0 76 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45  ved to the WHERE
2d2e0 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 49 66 20 73  .** clause. If s
2d2f0 6f 2c 20 61 64 64 20 69 74 20 74 6f 20 74 68 65  o, add it to the
2d300 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e   WHERE clause an
2d310 64 20 72 65 70 6c 61 63 65 20 74 68 65 20 73 75  d replace the su
2d320 62 2d 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  b-expression.** 
2d330 77 69 74 68 69 6e 20 74 68 65 20 48 41 56 49 4e  within the HAVIN
2d340 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  G expression wit
2d350 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 22 31 22  h a constant "1"
2d360 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2d370 68 61 76 69 6e 67 54 6f 57 68 65 72 65 45 78 70  havingToWhereExp
2d380 72 43 62 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  rCb(Walker *pWal
2d390 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
2d3a0 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  ){.  if( pExpr->
2d3b0 6f 70 21 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20  op!=TK_AND ){.  
2d3c0 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70    Select *pS = p
2d3d0 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c 65 63  Walker->u.pSelec
2d3e0 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
2d3f0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
2d400 4f 72 47 72 6f 75 70 42 79 28 70 57 61 6c 6b 65  OrGroupBy(pWalke
2d410 72 2d 3e 70 50 61 72 73 65 2c 20 70 45 78 70 72  r->pParse, pExpr
2d420 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 20  , pS->pGroupBy) 
2d430 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2d440 20 2a 64 62 20 3d 20 70 57 61 6c 6b 65 72 2d 3e   *db = pWalker->
2d450 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
2d460 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
2d470 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
2d480 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  db, TK_INTEGER, 
2d490 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e  &sqlite3IntToken
2d4a0 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  s[1], 0);.      
2d4b0 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
2d4c0 20 20 20 20 45 78 70 72 20 2a 70 57 68 65 72 65      Expr *pWhere
2d4d0 20 3d 20 70 53 2d 3e 70 57 68 65 72 65 3b 0a 20   = pS->pWhere;. 
2d4e0 20 20 20 20 20 20 20 53 57 41 50 28 45 78 70 72         SWAP(Expr
2d4f0 2c 20 2a 70 4e 65 77 2c 20 2a 70 45 78 70 72 29  , *pNew, *pExpr)
2d500 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  ;.        pNew =
2d510 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
2d520 64 62 2c 20 70 57 68 65 72 65 2c 20 70 4e 65 77  db, pWhere, pNew
2d530 29 3b 0a 20 20 20 20 20 20 20 20 70 53 2d 3e 70  );.        pS->p
2d540 57 68 65 72 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Where = pNew;.  
2d550 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
2d560 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Code = 1;.      
2d570 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
2d580 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
2d590 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
2d5a0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
2d5b0 2a 20 54 72 61 6e 73 66 65 72 20 65 6c 69 67 69  * Transfer eligi
2d5c0 62 6c 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  ble terms from t
2d5d0 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
2d5e0 20 6f 66 20 61 20 71 75 65 72 79 2c 20 77 68 69   of a query, whi
2d5f0 63 68 20 69 73 0a 2a 2a 20 70 72 6f 63 65 73 73  ch is.** process
2d600 65 64 20 61 66 74 65 72 20 67 72 6f 75 70 69 6e  ed after groupin
2d610 67 2c 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  g, to the WHERE 
2d620 63 6c 61 75 73 65 2c 20 77 68 69 63 68 20 69 73  clause, which is
2d630 20 70 72 6f 63 65 73 73 65 64 20 62 65 66 6f 72   processed befor
2d640 65 0a 2a 2a 20 67 72 6f 75 70 69 6e 67 2e 20 46  e.** grouping. F
2d650 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  or example, the 
2d660 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53  query:.**.**   S
2d670 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61  ELECT * FROM <ta
2d680 62 6c 65 73 3e 20 57 48 45 52 45 20 61 3d 3f 20  bles> WHERE a=? 
2d690 47 52 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e  GROUP BY b HAVIN
2d6a0 47 20 62 3d 3f 20 41 4e 44 20 63 3d 3f 0a 2a 2a  G b=? AND c=?.**
2d6b0 0a 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69  .** can be rewri
2d6c0 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  tten as:.**.**  
2d6d0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c   SELECT * FROM <
2d6e0 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20 61 3d  tables> WHERE a=
2d6f0 3f 20 41 4e 44 20 62 3d 3f 20 47 52 4f 55 50 20  ? AND b=? GROUP 
2d700 42 59 20 62 20 48 41 56 49 4e 47 20 63 3d 3f 0a  BY b HAVING c=?.
2d710 2a 2a 0a 2a 2a 20 41 20 74 65 72 6d 20 6f 66 20  **.** A term of 
2d720 74 68 65 20 48 41 56 49 4e 47 20 65 78 70 72 65  the HAVING expre
2d730 73 73 69 6f 6e 20 69 73 20 65 6c 69 67 69 62 6c  ssion is eligibl
2d740 65 20 66 6f 72 20 74 72 61 6e 73 66 65 72 20 69  e for transfer i
2d750 66 20 69 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a  f it consists.**
2d760 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e   entirely of con
2d770 73 74 61 6e 74 73 20 61 6e 64 20 65 78 70 72 65  stants and expre
2d780 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
2d790 61 6c 73 6f 20 47 52 4f 55 50 20 42 59 20 74 65  also GROUP BY te
2d7a0 72 6d 73 20 74 68 61 74 0a 2a 2a 20 75 73 65 20  rms that.** use 
2d7b0 74 68 65 20 22 42 49 4e 41 52 59 22 20 63 6f 6c  the "BINARY" col
2d7c0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e  lation sequence.
2d7d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2d7e0 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28 50 61  havingToWhere(Pa
2d7f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
2d800 65 63 74 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65  ect *p){.  Walke
2d810 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20 6d 65 6d  r sWalker;.  mem
2d820 73 65 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c  set(&sWalker, 0,
2d830 20 73 69 7a 65 6f 66 28 73 57 61 6c 6b 65 72 29   sizeof(sWalker)
2d840 29 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50 61  );.  sWalker.pPa
2d850 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
2d860 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c  sWalker.xExprCal
2d870 6c 62 61 63 6b 20 3d 20 68 61 76 69 6e 67 54 6f  lback = havingTo
2d880 57 68 65 72 65 45 78 70 72 43 62 3b 0a 20 20 73  WhereExprCb;.  s
2d890 57 61 6c 6b 65 72 2e 75 2e 70 53 65 6c 65 63 74  Walker.u.pSelect
2d8a0 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 57   = p;.  sqlite3W
2d8b0 61 6c 6b 45 78 70 72 28 26 73 57 61 6c 6b 65 72  alkExpr(&sWalker
2d8c0 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 23  , p->pHaving);.#
2d8d0 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2d8e0 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 57 61  NABLED.  if( sWa
2d8f0 6c 6b 65 72 2e 65 43 6f 64 65 20 26 26 20 28 73  lker.eCode && (s
2d900 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
2d910 65 20 26 20 30 78 31 30 30 29 21 3d 30 20 29 7b  e & 0x100)!=0 ){
2d920 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
2d930 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
2d940 28 22 4d 6f 76 65 20 48 41 56 49 4e 47 20 74 65  ("Move HAVING te
2d950 72 6d 73 20 69 6e 74 6f 20 57 48 45 52 45 3a 5c  rms into WHERE:\
2d960 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
2d970 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
2d980 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
2d990 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ndif.}../*.** Ch
2d9a0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
2d9b0 65 20 70 54 68 69 73 20 65 6e 74 72 79 20 6f 66  e pThis entry of
2d9c0 20 70 54 61 62 4c 69 73 74 20 69 73 20 61 20 73   pTabList is a s
2d9d0 65 6c 66 2d 6a 6f 69 6e 20 6f 66 20 61 20 70 72  elf-join of a pr
2d9e0 69 6f 72 20 76 69 65 77 2e 0a 2a 2a 20 49 66 20  ior view..** If 
2d9f0 69 74 20 69 73 2c 20 74 68 65 6e 20 72 65 74 75  it is, then retu
2da00 72 6e 20 74 68 65 20 53 72 63 4c 69 73 74 5f 69  rn the SrcList_i
2da10 74 65 6d 20 66 6f 72 20 74 68 65 20 70 72 69 6f  tem for the prio
2da20 72 20 76 69 65 77 2e 20 20 49 66 20 69 74 20 69  r view.  If it i
2da30 73 20 6e 6f 74 2c 0a 2a 2a 20 74 68 65 6e 20 72  s not,.** then r
2da40 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
2da50 69 63 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  ic struct SrcLis
2da60 74 5f 69 74 65 6d 20 2a 69 73 53 65 6c 66 4a 6f  t_item *isSelfJo
2da70 69 6e 56 69 65 77 28 0a 20 20 53 72 63 4c 69 73  inView(.  SrcLis
2da80 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
2da90 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
2daa0 20 66 6f 72 20 73 65 6c 66 2d 6a 6f 69 6e 73 20   for self-joins 
2dab0 69 6e 20 74 68 69 73 20 46 52 4f 4d 20 63 6c 61  in this FROM cla
2dac0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
2dad0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
2dae0 68 69 73 20 20 20 2f 2a 20 53 65 61 72 63 68 20  his   /* Search 
2daf0 66 6f 72 20 70 72 69 6f 72 20 72 65 66 65 72 65  for prior refere
2db00 6e 63 65 20 74 6f 20 74 68 69 73 20 73 75 62 71  nce to this subq
2db10 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  uery */.){.  str
2db20 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2db30 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f 72 28 70   *pItem;.  for(p
2db40 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d  Item = pTabList-
2db50 3e 61 3b 20 70 49 74 65 6d 3c 70 54 68 69 73 3b  >a; pItem<pThis;
2db60 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69   pItem++){.    i
2db70 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
2db80 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t==0 ) continue;
2db90 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
2dba0 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
2dbb0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2dbc0 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  if( pItem->zName
2dbd0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2dbe0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
2dbf0 73 74 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a  stricmp(pItem->z
2dc00 44 61 74 61 62 61 73 65 2c 20 70 54 68 69 73 2d  Database, pThis-
2dc10 3e 7a 44 61 74 61 62 61 73 65 29 21 3d 30 20 29  >zDatabase)!=0 )
2dc20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2dc30 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
2dc40 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  mp(pItem->zName,
2dc50 20 70 54 68 69 73 2d 3e 7a 4e 61 6d 65 29 21 3d   pThis->zName)!=
2dc60 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2dc70 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2dc80 72 43 6f 6d 70 61 72 65 28 30 2c 20 0a 20 20 20  rCompare(0, .   
2dc90 20 20 20 20 20 20 20 70 54 68 69 73 2d 3e 70 53         pThis->pS
2dca0 65 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c 20 70  elect->pWhere, p
2dcb0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Item->pSelect->p
2dcc0 57 68 65 72 65 2c 20 2d 31 29 20 0a 20 20 20 20  Where, -1) .    
2dcd0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
2dce0 76 69 65 77 20 77 61 73 20 6d 6f 64 69 66 69 65  view was modifie
2dcf0 64 20 62 79 20 73 6f 6d 65 20 6f 74 68 65 72 20  d by some other 
2dd00 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73 75 63  optimization suc
2dd10 68 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 70 75  h as.      ** pu
2dd20 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
2dd30 28 29 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74  () */.      cont
2dd40 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
2dd50 72 65 74 75 72 6e 20 70 49 74 65 6d 3b 0a 20 20  return pItem;.  
2dd60 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2dd70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
2dd80 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d  OUNTOFVIEW_OPTIM
2dd90 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74  IZATION./*.** At
2dda0 74 65 6d 70 74 20 74 6f 20 74 72 61 6e 73 66 6f  tempt to transfo
2ddb0 72 6d 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  rm a query of th
2ddc0 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
2ddd0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
2dde0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46  FROM (SELECT x F
2ddf0 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c  ROM t1 UNION ALL
2de00 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74   SELECT y FROM t
2de10 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68  2).**.** Into th
2de20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
2de30 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 75 6e  ECT (SELECT coun
2de40 74 28 2a 29 20 46 52 4f 4d 20 74 31 29 2b 28 53  t(*) FROM t1)+(S
2de50 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2de60 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68  ROM t2).**.** Th
2de70 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
2de80 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 61   only works if a
2de90 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
2dea0 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
2deb0 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 73 75 62  .**   *  The sub
2dec0 71 75 65 72 79 20 69 73 20 61 20 55 4e 49 4f 4e  query is a UNION
2ded0 20 41 4c 4c 20 6f 66 20 74 77 6f 20 6f 72 20 6d   ALL of two or m
2dee0 6f 72 65 20 74 65 72 6d 73 0a 2a 2a 20 20 20 2a  ore terms.**   *
2def0 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 57 48    There is no WH
2df00 45 52 45 20 6f 72 20 47 52 4f 55 50 20 42 59 20  ERE or GROUP BY 
2df10 6f 72 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  or HAVING clause
2df20 73 20 6f 6e 20 74 68 65 20 73 75 62 71 75 65 72  s on the subquer
2df30 69 65 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20  ies.**   *  The 
2df40 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 61  outer query is a
2df50 20 73 69 6d 70 6c 65 20 63 6f 75 6e 74 28 2a 29   simple count(*)
2df60 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  .**.** Return TR
2df70 55 45 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69  UE if the optimi
2df80 7a 61 74 69 6f 6e 20 69 73 20 75 6e 64 65 72 74  zation is undert
2df90 61 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aken..*/.static 
2dfa0 69 6e 74 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f  int countOfViewO
2dfb0 70 74 69 6d 69 7a 61 74 69 6f 6e 28 50 61 72 73  ptimization(Pars
2dfc0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
2dfd0 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20  t *p){.  Select 
2dfe0 2a 70 53 75 62 2c 20 2a 70 50 72 69 6f 72 3b 0a  *pSub, *pPrior;.
2dff0 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20    Expr *pExpr;. 
2e000 20 45 78 70 72 20 2a 70 43 6f 75 6e 74 3b 0a 20   Expr *pCount;. 
2e010 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2e020 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
2e030 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
2e040 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
2e050 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20    /* This is an 
2e060 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 69  aggregate */.  i
2e070 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  f( p->pEList->nE
2e080 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
2e090 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2e0a0 20 2f 2a 20 53 69 6e 67 6c 65 20 72 65 73 75 6c   /* Single resul
2e0b0 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 70 45  t column */.  pE
2e0c0 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
2e0d0 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
2e0e0 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
2e0f0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
2e100 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
2e110 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61 6e   /* Result is an
2e120 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20   aggregate */.  
2e130 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
2e140 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  cmp(pExpr->u.zTo
2e150 6b 65 6e 2c 22 63 6f 75 6e 74 22 29 20 29 20 72  ken,"count") ) r
2e160 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 49 73 20  eturn 0;  /* Is 
2e170 63 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 69 66 28  count() */.  if(
2e180 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21   pExpr->x.pList!
2e190 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
2e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e1b0 2a 20 4d 75 73 74 20 62 65 20 63 6f 75 6e 74 28  * Must be count(
2e1c0 2a 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  *) */.  if( p->p
2e1d0 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
2e1e0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
2e1f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
2e200 20 74 61 62 6c 65 20 69 6e 20 46 52 4f 4d 20 20   table in FROM  
2e210 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e 70  */.  pSub = p->p
2e220 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
2e230 74 3b 0a 20 20 69 66 28 20 70 53 75 62 3d 3d 30  t;.  if( pSub==0
2e240 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e260 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52         /* The FR
2e270 4f 4d 20 69 73 20 61 20 73 75 62 71 75 65 72 79  OM is a subquery
2e280 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
2e290 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75  pPrior==0 ) retu
2e2a0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
2e2b0 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
2e2c0 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 72 79  be a compound ry
2e2d0 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66   */.  do{.    if
2e2e0 28 20 70 53 75 62 2d 3e 6f 70 21 3d 54 4b 5f 41  ( pSub->op!=TK_A
2e2f0 4c 4c 20 26 26 20 70 53 75 62 2d 3e 70 50 72 69  LL && pSub->pPri
2e300 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
2e310 2f 2a 20 4d 75 73 74 20 62 65 20 55 4e 49 4f 4e  /* Must be UNION
2e320 20 41 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28 20   ALL */.    if( 
2e330 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 20 72  pSub->pWhere ) r
2e340 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
2e350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e360 20 4e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   No WHERE clause
2e370 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
2e380 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2e390 41 67 67 72 65 67 61 74 65 20 29 20 72 65 74 75  Aggregate ) retu
2e3a0 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 4e 6f 74  rn 0;     /* Not
2e3b0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f   an aggregate */
2e3c0 0a 20 20 20 20 70 53 75 62 20 3d 20 70 53 75 62  .    pSub = pSub
2e3d0 2d 3e 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20  ->pPrior;       
2e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3f0 20 20 20 20 20 20 20 2f 2a 20 52 65 70 65 61 74         /* Repeat
2e400 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e 64 20 2a   over compound *
2e410 2f 0a 20 20 7d 77 68 69 6c 65 28 20 70 53 75 62  /.  }while( pSub
2e420 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20   );..  /* If we 
2e430 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
2e440 20 74 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 74   then it is OK t
2e450 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 74 72  o perform the tr
2e460 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a  ansformation */.
2e470 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
2e480 64 62 3b 0a 20 20 70 43 6f 75 6e 74 20 3d 20 70  db;.  pCount = p
2e490 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20  Expr;.  pExpr = 
2e4a0 30 3b 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e 70  0;.  pSub = p->p
2e4b0 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
2e4c0 74 3b 0a 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  t;.  p->pSrc->a[
2e4d0 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a  0].pSelect = 0;.
2e4e0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
2e4f0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53  Delete(db, p->pS
2e500 72 63 29 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d  rc);.  p->pSrc =
2e510 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2e520 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
2e530 20 73 69 7a 65 6f 66 28 2a 70 2d 3e 70 53 72 63   sizeof(*p->pSrc
2e540 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 75  ));.  while( pSu
2e550 62 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  b ){.    Expr *p
2e560 54 65 72 6d 3b 0a 20 20 20 20 70 50 72 69 6f 72  Term;.    pPrior
2e570 20 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b   = pSub->pPrior;
2e580 0a 20 20 20 20 70 53 75 62 2d 3e 70 50 72 69 6f  .    pSub->pPrio
2e590 72 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 2d  r = 0;.    pSub-
2e5a0 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  >pNext = 0;.    
2e5b0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  pSub->selFlags |
2e5c0 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a  = SF_Aggregate;.
2e5d0 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61      pSub->selFla
2e5e0 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75  gs &= ~SF_Compou
2e5f0 6e 64 3b 0a 20 20 20 20 70 53 75 62 2d 3e 6e 53  nd;.    pSub->nS
2e600 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20  electRow = 0;.  
2e610 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
2e620 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
2e630 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  ->pEList);.    p
2e640 54 65 72 6d 20 3d 20 70 50 72 69 6f 72 20 3f 20  Term = pPrior ? 
2e650 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
2e660 62 2c 20 70 43 6f 75 6e 74 2c 20 30 29 20 3a 20  b, pCount, 0) : 
2e670 70 43 6f 75 6e 74 3b 0a 20 20 20 20 70 53 75 62  pCount;.    pSub
2e680 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
2e690 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
2e6a0 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 65 72  (pParse, 0, pTer
2e6b0 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  m);.    pTerm = 
2e6c0 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
2e6d0 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54 2c 20  rse, TK_SELECT, 
2e6e0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
2e6f0 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63 74  e3PExprAddSelect
2e700 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
2e710 70 53 75 62 29 3b 0a 20 20 20 20 69 66 28 20 70  pSub);.    if( p
2e720 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Expr==0 ){.     
2e730 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 3b 0a   pExpr = pTerm;.
2e740 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e750 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
2e760 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2e770 5f 50 4c 55 53 2c 20 70 54 65 72 6d 2c 20 70 45  _PLUS, pTerm, pE
2e780 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xpr);.    }.    
2e790 70 53 75 62 20 3d 20 70 50 72 69 6f 72 3b 0a 20  pSub = pPrior;. 
2e7a0 20 7d 0a 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   }.  p->pEList->
2e7b0 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78  a[0].pExpr = pEx
2e7c0 70 72 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67  pr;.  p->selFlag
2e7d0 73 20 26 3d 20 7e 53 46 5f 41 67 67 72 65 67 61  s &= ~SF_Aggrega
2e7e0 74 65 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54  te;..#if SELECTT
2e7f0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
2e800 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2e810 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b  Trace & 0x400 ){
2e820 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
2e830 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x400,pParse,p,
2e840 28 22 41 66 74 65 72 20 63 6f 75 6e 74 2d 6f 66  ("After count-of
2e850 2d 76 69 65 77 20 6f 70 74 69 6d 69 7a 61 74 69  -view optimizati
2e860 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  on:\n"));.    sq
2e870 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
2e880 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
2e890 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
2e8a0 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
2e8b0 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56   SQLITE_COUNTOFV
2e8c0 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IEW_OPTIMIZATION
2e8d0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72   */../*.** Gener
2e8e0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
2e8f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2e900 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70  t given in the p
2e910 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a   argument.  .**.
2e920 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  ** The results a
2e930 72 65 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f  re returned acco
2e940 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c  rding to the Sel
2e950 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
2e960 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  e..** See commen
2e970 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ts in sqliteInt.
2e980 68 20 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e  h for further in
2e990 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
2e9a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
2e9b0 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
2e9c0 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
2e9d0 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
2e9e0 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
2e9f0 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
2ea00 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
2ea10 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
2ea20 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
2ea30 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2ea40 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
2ea50 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
2ea60 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
2ea70 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
2ea80 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
2ea90 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69  to do that..*/.i
2eaa0 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
2eab0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2eac0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
2ead0 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
2eae0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
2eaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2eb00 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
2eb10 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
2eb20 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
2eb30 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a  t *pDest      /*
2eb40 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
2eb50 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
2eb60 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
2eb70 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
2eb80 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2eb90 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  rs */.  WhereInf
2eba0 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f  o *pWInfo;     /
2ebb0 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71  * Return from sq
2ebc0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2ebd0 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ) */.  Vdbe *v; 
2ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ebf0 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
2ec00 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  hine under const
2ec10 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
2ec20 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20   isAgg;         
2ec30 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
2ec40 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b  select lists lik
2ec50 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a  e "count(*)" */.
2ec60 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
2ec70 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74  st = 0;  /* List
2ec80 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65   of columns to e
2ec90 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63  xtract. */.  Src
2eca0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
2ecb0 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
2ecc0 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20  ables to select 
2ecd0 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a  from */.  Expr *
2ece0 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
2ecf0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
2ed00 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
2ed10 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
2ed20 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f   *pGroupBy;    /
2ed30 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63  * The GROUP BY c
2ed40 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
2ed50 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
2ed60 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20  Having;         
2ed70 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c  /* The HAVING cl
2ed80 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
2ed90 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  LL */.  int rc =
2eda0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
2edb0 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
2edc0 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
2edd0 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e  tion */.  Distin
2ede0 63 74 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b  ctCtx sDistinct;
2edf0 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20   /* Info on how 
2ee00 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53 54  to code the DIST
2ee10 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a  INCT keyword */.
2ee20 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72 74 3b    SortCtx sSort;
2ee30 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
2ee40 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20   on how to code 
2ee50 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2ee60 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f  use */.  AggInfo
2ee70 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20   sAggInfo;      
2ee80 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  /* Information u
2ee90 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65  sed by aggregate
2eea0 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e   queries */.  in
2eeb0 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t iEnd;         
2eec0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
2eed0 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  of the end of th
2eee0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  e query */.  sql
2eef0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
2ef00 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
2ef10 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
2ef20 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d  /.  ExprList *pM
2ef30 69 6e 4d 61 78 4f 72 64 65 72 42 79 20 3d 20 30  inMaxOrderBy = 0
2ef40 3b 20 20 2f 2a 20 41 64 64 65 64 20 4f 52 44 45  ;  /* Added ORDE
2ef50 52 20 42 59 20 66 6f 72 20 6d 69 6e 2f 6d 61 78  R BY for min/max
2ef60 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 75 38   queries */.  u8
2ef70 20 6d 69 6e 4d 61 78 46 6c 61 67 3b 20 20 20 20   minMaxFlag;    
2ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ef90 46 6c 61 67 20 66 6f 72 20 6d 69 6e 2f 6d 61 78  Flag for min/max
2efa0 20 71 75 65 72 69 65 73 20 2a 2f 0a 0a 20 20 64   queries */..  d
2efb0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2efc0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
2efd0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
2efe0 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  if( p==0 || db->
2eff0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
2f000 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
2f010 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2f020 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  }.  if( sqlite3A
2f030 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
2f040 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
2f050 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
2f060 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  n 1;.  memset(&s
2f070 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  AggInfo, 0, size
2f080 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23  of(sAggInfo));.#
2f090 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2f0a0 4e 41 42 4c 45 44 0a 20 20 53 45 4c 45 43 54 54  NABLED.  SELECTT
2f0b0 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c  RACE(1,pParse,p,
2f0c0 20 28 22 62 65 67 69 6e 20 70 72 6f 63 65 73 73   ("begin process
2f0d0 69 6e 67 3a 5c 6e 22 2c 20 70 50 61 72 73 65 2d  ing:\n", pParse-
2f0e0 3e 61 64 64 72 45 78 70 6c 61 69 6e 29 29 3b 0a  >addrExplain));.
2f0f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2f100 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
2f110 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54   ){.    sqlite3T
2f120 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2f130 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
2f140 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  if..  assert( p-
2f150 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
2f160 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
2f170 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20  T_DistFifo );.  
2f180 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
2f190 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
2f1a0 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f  >eDest!=SRT_Fifo
2f1b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
2f1c0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
2f1d0 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
2f1e0 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20  T_DistQueue );. 
2f1f0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
2f200 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
2f210 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65  ->eDest!=SRT_Que
2f220 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f  ue );.  if( Igno
2f230 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
2f240 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  st) ){.    asser
2f250 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  t(pDest->eDest==
2f260 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44  SRT_Exists || pD
2f270 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2f280 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20  Union || .      
2f290 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
2f2a0 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c  t==SRT_Except ||
2f2b0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2f2c0 52 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20  RT_Discard ||.  
2f2d0 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
2f2e0 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65  eDest==SRT_Queue
2f2f0 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73    || pDest->eDes
2f300 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
2f310 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  ||.           pD
2f320 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2f330 44 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65  DistQueue || pDe
2f340 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46  st->eDest==SRT_F
2f350 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  ifo);.    /* If 
2f360 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e  ORDER BY makes n
2f370 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  o difference in 
2f380 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20  the output then 
2f390 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20  neither does.   
2f3a0 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20   ** DISTINCT so 
2f3b0 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65  it can be remove
2f3c0 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71  d too. */.    sq
2f3d0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2f3e0 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
2f3f0 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rBy);.    p->pOr
2f400 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
2f410 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
2f420 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  F_Distinct;.  }.
2f430 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
2f440 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30  rep(pParse, p, 0
2f450 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f  );.  memset(&sSo
2f460 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  rt, 0, sizeof(sS
2f470 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70  ort));.  sSort.p
2f480 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
2f490 64 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73  derBy;.  pTabLis
2f4a0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69  t = p->pSrc;.  i
2f4b0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2f4c0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
2f4d0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
2f4e0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
2f4f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
2f500 69 73 74 21 3d 30 20 29 3b 0a 20 20 69 73 41 67  ist!=0 );.  isAg
2f510 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  g = (p->selFlags
2f520 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
2f530 21 3d 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  !=0;.#if SELECTT
2f540 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
2f550 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2f560 54 72 61 63 65 20 26 20 30 78 31 30 34 20 29 7b  Trace & 0x104 ){
2f570 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
2f580 28 30 78 31 30 34 2c 70 50 61 72 73 65 2c 70 2c  (0x104,pParse,p,
2f590 20 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72 65   ("after name re
2f5a0 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a  solution:\n"));.
2f5b0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2f5c0 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
2f5d0 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
2f5e0 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
2f5f0 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
2f600 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  {.    generateCo
2f610 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
2f620 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , p);.  }..  /* 
2f630 54 72 79 20 74 6f 20 76 61 72 69 6f 75 73 20 6f  Try to various o
2f640 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 28 66 6c  ptimizations (fl
2f650 61 74 74 65 6e 69 6e 67 20 73 75 62 71 75 65 72  attening subquer
2f660 69 65 73 2c 20 61 6e 64 20 73 74 72 65 6e 67 74  ies, and strengt
2f670 68 0a 20 20 2a 2a 20 72 65 64 75 63 74 69 6f 6e  h.  ** reduction
2f680 20 6f 66 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f   of join operato
2f690 72 73 29 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  rs) in the FROM 
2f6a0 63 6c 61 75 73 65 20 75 70 20 69 6e 74 6f 20 74  clause up into t
2f6b0 68 65 20 6d 61 69 6e 20 71 75 65 72 79 0a 20 20  he main query.  
2f6c0 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
2f6d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
2f6e0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
2f6f0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
2f700 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21  EW).  for(i=0; !
2f710 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70  p->pPrior && i<p
2f720 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
2f730 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
2f740 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2f750 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
2f760 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
2f770 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
2f780 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 54 61  >pSelect;.    Ta
2f790 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65  ble *pTab = pIte
2f7a0 6d 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a  m->pTab;..    /*
2f7b0 20 43 6f 6e 76 65 72 74 20 4c 45 46 54 20 4a 4f   Convert LEFT JO
2f7c0 49 4e 20 69 6e 74 6f 20 4a 4f 49 4e 20 69 66 20  IN into JOIN if 
2f7d0 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20  there are terms 
2f7e0 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
2f7f0 6c 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  le.    ** of the
2f800 20 4c 45 46 54 20 4a 4f 49 4e 20 75 73 65 64 20   LEFT JOIN used 
2f810 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
2f820 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  use..    */.    
2f830 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a  if( (pItem->fg.j
2f840 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
2f850 54 29 21 3d 30 0a 20 20 20 20 20 26 26 20 73 71  T)!=0.     && sq
2f860 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
2f870 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 70 2d 3e 70 57  NonNullRow(p->pW
2f880 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75  here, pItem->iCu
2f890 72 73 6f 72 29 0a 20 20 20 20 20 26 26 20 4f 70  rsor).     && Op
2f8a0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
2f8b0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 69 6d  d(db, SQLITE_Sim
2f8c0 70 6c 69 66 79 4a 6f 69 6e 29 0a 20 20 20 20 29  plifyJoin).    )
2f8d0 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  {.      SELECTTR
2f8e0 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
2f8f0 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ,p,.            
2f900 20 20 20 20 28 22 4c 45 46 54 2d 4a 4f 49 4e 20      ("LEFT-JOIN 
2f910 73 69 6d 70 6c 69 66 69 65 73 20 74 6f 20 4a 4f  simplifies to JO
2f920 49 4e 20 6f 6e 20 74 65 72 6d 20 25 64 5c 6e 22  IN on term %d\n"
2f930 2c 69 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65  ,i));.      pIte
2f940 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
2f950 3d 20 7e 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f  = ~(JT_LEFT|JT_O
2f960 55 54 45 52 29 3b 0a 20 20 20 20 20 20 75 6e 73  UTER);.      uns
2f970 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 57  etJoinExpr(p->pW
2f980 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75  here, pItem->iCu
2f990 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  rsor);.    }..  
2f9a0 20 20 2f 2a 20 4e 6f 20 66 75 74 68 65 72 20 61    /* No futher a
2f9b0 63 74 69 6f 6e 20 69 66 20 74 68 69 73 20 74 65  ction if this te
2f9c0 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
2f9d0 6c 61 75 73 65 20 69 73 20 6e 6f 20 61 20 73 75  lause is no a su
2f9e0 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 69 66  bquery */.    if
2f9f0 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
2fa00 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 61  inue;..    /* Ca
2fa10 74 63 68 20 6d 69 73 6d 61 74 63 68 20 69 6e 20  tch mismatch in 
2fa20 74 68 65 20 64 65 63 6c 61 72 65 64 20 63 6f 6c  the declared col
2fa30 75 6d 6e 73 20 6f 66 20 61 20 76 69 65 77 20 61  umns of a view a
2fa40 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
2fa50 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  .    ** columns 
2fa60 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 6f 6e  in the SELECT on
2fa70 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 20 20   the RHS */.    
2fa80 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d  if( pTab->nCol!=
2fa90 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSub->pEList->nE
2faa0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  xpr ){.      sql
2fab0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2fac0 72 73 65 2c 20 22 65 78 70 65 63 74 65 64 20 25  rse, "expected %
2fad0 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27 25  d columns for '%
2fae0 73 27 20 62 75 74 20 67 6f 74 20 25 64 22 2c 0a  s' but got %d",.
2faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb00 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
2fb10 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70  , pTab->zName, p
2fb20 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
2fb30 70 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  pr);.      goto 
2fb40 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2fb50 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  }..    /* Do not
2fb60 20 74 72 79 20 74 6f 20 66 6c 61 74 74 65 6e 20   try to flatten 
2fb70 61 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  an aggregate sub
2fb80 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20  query..    **.  
2fb90 20 20 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20    ** Flattening 
2fba0 61 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  an aggregate sub
2fbb0 71 75 65 72 79 20 69 73 20 6f 6e 6c 79 20 70 6f  query is only po
2fbc0 73 73 69 62 6c 65 20 69 66 20 74 68 65 20 6f 75  ssible if the ou
2fbd0 74 65 72 20 71 75 65 72 79 0a 20 20 20 20 2a 2a  ter query.    **
2fbe0 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 20   is not a join. 
2fbf0 20 42 75 74 20 69 66 20 74 68 65 20 6f 75 74 65   But if the oute
2fc00 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
2fc10 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20   join, then the 
2fc20 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a 20  subquery.    ** 
2fc30 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e  will be implemen
2fc40 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
2fc50 69 6e 65 20 61 6e 64 20 74 68 65 72 65 20 69 73  ine and there is
2fc60 20 6e 6f 20 61 64 76 61 6e 74 61 67 65 20 74 6f   no advantage to
2fc70 0a 20 20 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69  .    ** flatteni
2fc80 6e 67 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e  ng in that case.
2fc90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2fca0 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20  (pSub->selFlags 
2fcb0 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21  & SF_Aggregate)!
2fcc0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2fcd0 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d     assert( pSub-
2fce0 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
2fcf0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
2fd00 75 74 65 72 20 71 75 65 72 79 20 63 6f 6e 74 61  uter query conta
2fd10 69 6e 73 20 61 20 22 63 6f 6d 70 6c 65 78 22 20  ins a "complex" 
2fd20 72 65 73 75 6c 74 20 73 65 74 20 28 74 68 61 74  result set (that
2fd30 20 69 73 2c 0a 20 20 20 20 2a 2a 20 69 66 20 74   is,.    ** if t
2fd40 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
2fd50 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
2fd60 20 75 73 65 73 20 66 75 6e 63 74 69 6f 6e 73 20   uses functions 
2fd70 6f 72 20 73 75 62 71 75 65 72 69 65 73 29 0a 20  or subqueries). 
2fd80 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
2fd90 20 73 75 62 71 75 65 72 79 20 63 6f 6e 74 61 69   subquery contai
2fda0 6e 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  ns an ORDER BY c
2fdb0 6c 61 75 73 65 20 61 6e 64 20 69 66 0a 20 20 20  lause and if.   
2fdc0 20 2a 2a 20 69 74 20 77 69 6c 6c 20 62 65 20 69   ** it will be i
2fdd0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
2fde0 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e  co-routine, then
2fdf0 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e   do not flatten.
2fe00 20 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 72 65    This.    ** re
2fe10 73 74 72 69 63 74 69 6f 6e 20 61 6c 6c 6f 77 73  striction allows
2fe20 20 53 51 4c 20 63 6f 6e 73 74 72 75 63 74 73 20   SQL constructs 
2fe30 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
2fe40 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43 54  *.    **  SELECT
2fe50 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74   expensive_funct
2fe60 69 6f 6e 28 78 29 0a 20 20 20 20 2a 2a 20 20 20  ion(x).    **   
2fe70 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20   FROM (SELECT x 
2fe80 46 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20 42  FROM tab ORDER B
2fe90 59 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20  Y y LIMIT 10);. 
2fea0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
2feb0 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74   expensive_funct
2fec0 69 6f 6e 28 29 20 69 73 20 6f 6e 6c 79 20 63 6f  ion() is only co
2fed0 6d 70 75 74 65 64 20 6f 6e 20 74 68 65 20 31 30  mputed on the 10
2fee0 20 72 6f 77 73 20 74 68 61 74 0a 20 20 20 20 2a   rows that.    *
2fef0 2a 20 61 72 65 20 6f 75 74 70 75 74 2c 20 72 61  * are output, ra
2ff00 74 68 65 72 20 74 68 61 6e 20 65 76 65 72 79 20  ther than every 
2ff10 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c 65  row of the table
2ff20 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2ff30 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20  The requirement 
2ff40 74 68 61 74 20 74 68 65 20 6f 75 74 65 72 20 71  that the outer q
2ff50 75 65 72 79 20 68 61 76 65 20 61 20 63 6f 6d 70  uery have a comp
2ff60 6c 65 78 20 72 65 73 75 6c 74 20 73 65 74 0a 20  lex result set. 
2ff70 20 20 20 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74     ** means that
2ff80 20 66 6c 61 74 74 65 6e 69 6e 67 20 64 6f 65 73   flattening does
2ff90 20 6f 63 63 75 72 20 6f 6e 20 73 69 6d 70 6c 65   occur on simple
2ffa0 72 20 53 51 4c 20 63 6f 6e 73 74 72 61 69 6e 74  r SQL constraint
2ffb0 73 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a  s without.    **
2ffc0 20 74 68 65 20 65 78 70 65 6e 73 69 76 65 5f 66   the expensive_f
2ffd0 75 6e 63 74 69 6f 6e 28 29 20 6c 69 6b 65 3a 0a  unction() like:.
2ffe0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 53      **.    **  S
2fff0 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53 45  ELECT x FROM (SE
30000 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 20  LECT x FROM tab 
30010 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49 54  ORDER BY y LIMIT
30020 20 31 30 29 3b 0a 20 20 20 20 2a 2f 0a 20 20 20   10);.    */.   
30030 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
30040 72 42 79 21 3d 30 0a 20 20 20 20 20 26 26 20 69  rBy!=0.     && i
30050 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e  ==0.     && (p->
30060 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f  selFlags & SF_Co
30070 6d 70 6c 65 78 52 65 73 75 6c 74 29 21 3d 30 0a  mplexResult)!=0.
30080 20 20 20 20 20 26 26 20 28 70 54 61 62 4c 69 73       && (pTabLis
30090 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20  t->nSrc==1.     
300a0 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74      || (pTabList
300b0 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79  ->a[1].fg.jointy
300c0 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43  pe&(JT_LEFT|JT_C
300d0 52 4f 53 53 29 29 21 3d 30 29 0a 20 20 20 20 29  ROSS))!=0).    )
300e0 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
300f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
30100 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
30110 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69  (pParse, p, i, i
30120 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 2f  sAgg) ){.      /
30130 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79 20  * This subquery 
30140 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20  can be absorbed 
30150 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e  into its parent.
30160 20 2a 2f 0a 20 20 20 20 20 20 69 20 3d 20 2d 31   */.      i = -1
30170 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
30180 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
30190 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
301a0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
301b0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
301c0 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72  if( !IgnorableOr
301d0 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
301e0 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
301f0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
30200 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  By;.    }.  }.#e
30210 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
30220 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
30230 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 48  ND_SELECT.  /* H
30240 61 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 53  andle compound S
30250 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
30260 20 75 73 69 6e 67 20 74 68 65 20 73 65 70 61 72   using the separ
30270 61 74 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  ate multiSelect(
30280 29 0a 20 20 2a 2a 20 70 72 6f 63 65 64 75 72 65  ).  ** procedure
30290 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
302a0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 63  pPrior ){.    rc
302b0 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70   = multiSelect(p
302c0 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
302d0 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
302e0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 53 45  E_ENABLED.    SE
302f0 4c 45 43 54 54 52 41 43 45 28 30 78 31 2c 70 50  LECTTRACE(0x1,pP
30300 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d  arse,p,("end com
30310 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f  pound-select pro
30320 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20  cessing\n"));.  
30330 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 53 65    if( (sqlite3Se
30340 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 32 30  lectTrace & 0x20
30350 30 30 29 21 3d 30 20 26 26 20 45 78 70 6c 61 69  00)!=0 && Explai
30360 6e 51 75 65 72 79 50 6c 61 6e 50 61 72 65 6e 74  nQueryPlanParent
30370 28 70 50 61 72 73 65 29 3d 3d 30 20 29 7b 0a 20  (pParse)==0 ){. 
30380 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
30390 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
303a0 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
303b0 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65  f.    if( p->pNe
303c0 78 74 3d 3d 30 20 29 20 45 78 70 6c 61 69 6e 51  xt==0 ) ExplainQ
303d0 75 65 72 79 50 6c 61 6e 50 6f 70 28 70 50 61 72  ueryPlanPop(pPar
303e0 73 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  se);.    return 
303f0 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
30400 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 74 65    /* For each te
30410 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  rm in the FROM c
30420 6c 61 75 73 65 2c 20 64 6f 20 74 77 6f 20 74 68  lause, do two th
30430 69 6e 67 73 3a 0a 20 20 2a 2a 20 28 31 29 20 41  ings:.  ** (1) A
30440 75 74 68 6f 72 69 7a 65 64 20 75 6e 72 65 66 65  uthorized unrefe
30450 72 65 6e 63 65 64 20 74 61 62 6c 65 73 0a 20 20  renced tables.  
30460 2a 2a 20 28 32 29 20 47 65 6e 65 72 61 74 65 20  ** (2) Generate 
30470 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
30480 2d 71 75 65 72 69 65 73 0a 20 20 2a 2f 0a 20 20  -queries.  */.  
30490 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
304a0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
304b0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
304c0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
304d0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
304e0 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73  ];.    SelectDes
304f0 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65  t dest;.    Sele
30500 63 74 20 2a 70 53 75 62 3b 0a 23 69 66 20 21 64  ct *pSub;.#if !d
30510 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
30520 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
30530 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
30540 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20 63  OMIT_VIEW).    c
30550 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65  onst char *zSave
30560 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65  dAuthContext;.#e
30570 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 73 73  ndif..    /* Iss
30580 75 65 20 53 51 4c 49 54 45 5f 52 45 41 44 20 61  ue SQLITE_READ a
30590 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73 20 77 69  uthorizations wi
305a0 74 68 20 61 20 66 61 6b 65 20 63 6f 6c 75 6d 6e  th a fake column
305b0 20 6e 61 6d 65 20 66 6f 72 20 61 6e 79 0a 20 20   name for any.  
305c0 20 20 2a 2a 20 74 61 62 6c 65 73 20 74 68 61 74    ** tables that
305d0 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 64 20   are referenced 
305e0 62 75 74 20 66 72 6f 6d 20 77 68 69 63 68 20 6e  but from which n
305f0 6f 20 76 61 6c 75 65 73 20 61 72 65 20 65 78 74  o values are ext
30600 72 61 63 74 65 64 2e 0a 20 20 20 20 2a 2a 20 45  racted..    ** E
30610 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 65 72 65  xamples of where
30620 20 74 68 65 73 65 20 6b 69 6e 64 73 20 6f 66 20   these kinds of 
30630 6e 75 6c 6c 20 53 51 4c 49 54 45 5f 52 45 41 44  null SQLITE_READ
30640 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73 0a   authorizations.
30650 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 6f 63 63      ** would occ
30660 75 72 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ur:.    **.    *
30670 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  *     SELECT cou
30680 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 20 20  nt(*) FROM t1;  
30690 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20   -- SQLITE_READ 
306a0 74 31 2e 22 22 0a 20 20 20 20 2a 2a 20 20 20 20  t1."".    **    
306b0 20 53 45 4c 45 43 54 20 74 31 2e 2a 20 46 52 4f   SELECT t1.* FRO
306c0 4d 20 74 31 2c 20 74 32 3b 20 20 20 2d 2d 20 53  M t1, t2;   -- S
306d0 51 4c 49 54 45 5f 52 45 41 44 20 74 32 2e 22 22  QLITE_READ t2.""
306e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
306f0 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e  he fake column n
30700 61 6d 65 20 69 73 20 61 6e 20 65 6d 70 74 79 20  ame is an empty 
30710 73 74 72 69 6e 67 2e 20 20 49 74 20 69 73 20 70  string.  It is p
30720 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 74 61  ossible for a ta
30730 62 6c 65 20 74 6f 0a 20 20 20 20 2a 2a 20 68 61  ble to.    ** ha
30740 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  ve a column name
30750 64 20 62 79 20 74 68 65 20 65 6d 70 74 79 20 73  d by the empty s
30760 74 72 69 6e 67 2c 20 69 6e 20 77 68 69 63 68 20  tring, in which 
30770 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f  case there is no
30780 20 77 61 79 20 74 6f 0a 20 20 20 20 2a 2a 20 64   way to.    ** d
30790 69 73 74 69 6e 67 75 69 73 68 20 62 65 74 77 65  istinguish betwe
307a0 65 6e 20 61 6e 20 75 6e 72 65 66 65 72 65 6e 63  en an unreferenc
307b0 65 64 20 74 61 62 6c 65 20 61 6e 64 20 61 6e 20  ed table and an 
307c0 61 63 74 75 61 6c 20 72 65 66 65 72 65 6e 63 65  actual reference
307d0 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 22   to the.    ** "
307e0 22 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 20 6f 72  " column. The or
307f0 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 77 61  iginal design wa
30800 73 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20 63  s for the fake c
30810 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74 6f 20 62 65  olumn name to be
30820 20 61 20 4e 55 4c 4c 2c 0a 20 20 20 20 2a 2a 20   a NULL,.    ** 
30830 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 75  which would be u
30840 6e 61 6d 62 69 67 75 6f 75 73 2e 20 20 42 75 74  nambiguous.  But
30850 20 6c 65 67 61 63 79 20 61 75 74 68 6f 72 69 7a   legacy authoriz
30860 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 20  ation callbacks 
30870 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 61 73 73  might.    ** ass
30880 75 6d 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ume the column n
30890 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20  ame is non-NULL 
308a0 61 6e 64 20 73 65 67 66 61 75 6c 74 2e 20 20 54  and segfault.  T
308b0 68 65 20 75 73 65 20 6f 66 20 61 6e 20 65 6d 70  he use of an emp
308c0 74 79 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67  ty.    ** string
308d0 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20 63 6f   for the fake co
308e0 6c 75 6d 6e 20 6e 61 6d 65 20 73 65 65 6d 73 20  lumn name seems 
308f0 73 61 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  safer..    */.  
30900 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 63 6f 6c    if( pItem->col
30910 55 73 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Used==0 ){.     
30920 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
30930 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
30940 5f 52 45 41 44 2c 20 70 49 74 65 6d 2d 3e 7a 4e  _READ, pItem->zN
30950 61 6d 65 2c 20 22 22 2c 20 70 49 74 65 6d 2d 3e  ame, "", pItem->
30960 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
30970 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
30980 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
30990 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
309a0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
309b0 45 57 29 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  EW).    /* Gener
309c0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
309d0 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20   sub-queries in 
309e0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
309f0 20 20 20 20 2a 2f 0a 20 20 20 20 70 53 75 62 20      */.    pSub 
30a00 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  = pItem->pSelect
30a10 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d  ;.    if( pSub==
30a20 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
30a30 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20     /* Sometimes 
30a40 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73  the code for a s
30a50 75 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20  ubquery will be 
30a60 67 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74  generated more t
30a70 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c  han.    ** once,
30a80 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
30a90 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
30aa0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20  WHERE clause in 
30ab0 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20  a LEFT JOIN,.   
30ac0 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e   ** for example.
30ad0 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
30ae0 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74  do not regenerat
30af0 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61  e the code to ma
30b00 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20  nifest.    ** a 
30b10 76 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72  view or the co-r
30b20 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d  outine to implem
30b30 65 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68 65  ent a view.  The
30b40 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a   first instance.
30b50 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63      ** is suffic
30b60 69 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65  ient, though the
30b70 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d   subroutine to m
30b80 61 6e 69 66 65 73 74 20 74 68 65 20 76 69 65 77  anifest the view
30b90 20 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a   does need.    *
30ba0 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  * to be invoked 
30bb0 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66  again. */.    if
30bc0 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  ( pItem->addrFil
30bd0 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66  lSub ){.      if
30be0 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43  ( pItem->fg.viaC
30bf0 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20  oroutine==0 ){. 
30c00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
30c10 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61  broutine that ma
30c20 6e 69 66 65 73 74 73 20 74 68 65 20 76 69 65 77  nifests the view
30c30 20 6d 69 67 68 74 20 62 65 20 61 20 6f 6e 65 2d   might be a one-
30c40 74 69 6d 65 20 72 6f 75 74 69 6e 65 2c 0a 20 20  time routine,.  
30c50 20 20 20 20 20 20 2a 2a 20 6f 72 20 69 74 20 6d        ** or it m
30c60 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20  ight need to be 
30c70 72 65 72 75 6e 20 6f 6e 20 65 61 63 68 20 69 74  rerun on each it
30c80 65 72 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20  eration because 
30c90 69 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e  it.        ** en
30ca0 63 6f 64 65 73 20 61 20 63 6f 72 72 65 6c 61 74  codes a correlat
30cb0 65 64 20 73 75 62 71 75 65 72 79 2e 20 2a 2f 0a  ed subquery. */.
30cc0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
30cd0 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
30ce0 4f 70 28 76 2c 20 70 49 74 65 6d 2d 3e 61 64 64  Op(v, pItem->add
30cf0 72 46 69 6c 6c 53 75 62 29 2d 3e 6f 70 63 6f 64  rFillSub)->opcod
30d00 65 3d 3d 4f 50 5f 4f 6e 63 65 20 29 3b 0a 20 20  e==OP_Once );.  
30d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30d20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
30d30 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  sub, pItem->regR
30d40 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64  eturn, pItem->ad
30d50 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
30d60 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e    }.      contin
30d70 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ue;.    }..    /
30d80 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73  * Increment Pars
30d90 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65  e.nHeight by the
30da0 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c   height of the l
30db0 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f  argest expressio
30dc0 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65  n.    ** tree re
30dd0 66 65 72 72 65 64 20 74 6f 20 62 79 20 74 68 69  ferred to by thi
30de0 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65  s, the parent se
30df0 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20  lect. The child 
30e00 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61  select.    ** ma
30e10 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73  y contain expres
30e20 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74  sion trees of at
30e30 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51   most.    ** (SQ
30e40 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
30e50 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68  PTH-Parse.nHeigh
30e60 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20  t) height. This 
30e70 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20  is a bit.    ** 
30e80 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76  more conservativ
30e90 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79  e than necessary
30ea0 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65  , but much easie
30eb0 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67  r than enforcing
30ec0 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74  .    ** an exact
30ed0 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   limit..    */. 
30ee0 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
30ef0 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht += sqlite3Sel
30f00 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
30f10 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63  ;..    /* Make c
30f20 6f 70 69 65 73 20 6f 66 20 63 6f 6e 73 74 61 6e  opies of constan
30f30 74 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74  t WHERE-clause t
30f40 65 72 6d 73 20 69 6e 20 74 68 65 20 6f 75 74 65  erms in the oute
30f50 72 20 71 75 65 72 79 20 64 6f 77 6e 0a 20 20 20  r query down.   
30f60 20 2a 2a 20 69 6e 73 69 64 65 20 74 68 65 20 73   ** inside the s
30f70 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 63  ubquery.  This c
30f80 61 6e 20 68 65 6c 70 20 74 68 65 20 73 75 62 71  an help the subq
30f90 75 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f 72 65  uery to run more
30fa0 20 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a 20 20   efficiently..  
30fb0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4f 70 74    */.    if( Opt
30fc0 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
30fd0 28 64 62 2c 20 53 51 4c 49 54 45 5f 50 75 73 68  (db, SQLITE_Push
30fe0 44 6f 77 6e 29 0a 20 20 20 20 20 26 26 20 70 75  Down).     && pu
30ff0 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
31000 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 70  (pParse, pSub, p
31010 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d  ->pWhere, pItem-
31020 3e 69 43 75 72 73 6f 72 2c 0a 20 20 20 20 20 20  >iCursor,.      
31030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31040 20 20 20 20 20 28 70 49 74 65 6d 2d 3e 66 67 2e       (pItem->fg.
31050 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
31060 54 45 52 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a  TER)!=0).    ){.
31070 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
31080 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 69 66  ENABLED.      if
31090 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
310a0 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
310b0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 54 52          SELECTTR
310c0 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
310d0 2c 70 2c 28 22 41 66 74 65 72 20 57 48 45 52 45  ,p,("After WHERE
310e0 2d 63 6c 61 75 73 65 20 70 75 73 68 2d 64 6f 77  -clause push-dow
310f0 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  n:\n"));.       
31100 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
31110 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
31120 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
31130 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31140 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
31150 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 50 75  00,pParse,p,("Pu
31160 73 68 2d 64 6f 77 6e 20 6e 6f 74 20 70 6f 73 73  sh-down not poss
31170 69 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 20 20 7d  ible\n"));.    }
31180 0a 0a 20 20 20 20 7a 53 61 76 65 64 41 75 74 68  ..    zSavedAuth
31190 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65  Context = pParse
311a0 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  ->zAuthContext;.
311b0 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74      pParse->zAut
311c0 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74 65 6d  hContext = pItem
311d0 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a  ->zName;..    /*
311e0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
311f0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
31200 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a 0a  subquery.    **.
31210 20 20 20 20 2a 2a 20 54 68 65 20 73 75 62 71 75      ** The subqu
31220 65 72 79 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ery is implement
31230 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69  ed as a co-routi
31240 6e 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ne if the subque
31250 72 79 20 69 73 0a 20 20 20 20 2a 2a 20 67 75 61  ry is.    ** gua
31260 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 74 68  ranteed to be th
31270 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 28 73 6f  e outer loop (so
31280 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f   that it does no
31290 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 20  t need to be.   
312a0 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 6d 6f 72   ** computed mor
312b0 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20 20 20  e than once).   
312c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a   **.    ** TODO:
312d0 20 41 72 65 20 74 68 65 72 65 20 6f 74 68 65 72   Are there other
312e0 20 72 65 61 73 6f 6e 73 20 62 65 73 69 64 65 20   reasons beside 
312f0 28 31 29 20 74 6f 20 75 73 65 20 61 20 63 6f 2d  (1) to use a co-
31300 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69  routine.    ** i
31310 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f 0a 20  mplementation?. 
31320 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3d     */.    if( i=
31330 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 61 62  =0.     && (pTab
31340 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20  List->nSrc==1.  
31350 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54            || (pT
31360 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e  abList->a[1].fg.
31370 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45 46  jointype&(JT_LEF
31380 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 29  T|JT_CROSS))!=0)
31390 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20    /* (1) */.    
313a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c  ){.      /* Impl
313b0 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69  ement a co-routi
313c0 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74  ne that will ret
313d0 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  urn a single row
313e0 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
313f0 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65       ** set on e
31400 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a  ach invocation..
31410 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
31420 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  nt addrTop = sql
31430 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
31440 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 20 0a  ddr(v)+1;.     .
31450 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67        pItem->reg
31460 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
31470 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
31480 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
31490 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
314a0 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
314b0 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54  Return, 0, addrT
314c0 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  op);.      VdbeC
314d0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
314e0 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
314f0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74  ame));.      pIt
31500 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
31510 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20  = addrTop;.     
31520 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
31530 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
31540 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74  T_Coroutine, pIt
31550 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
31560 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
31570 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
31580 31 2c 20 22 43 4f 2d 52 4f 55 54 49 4e 45 20 30  1, "CO-ROUTINE 0
31590 78 25 70 22 2c 20 70 53 75 62 29 29 3b 0a 20 20  x%p", pSub));.  
315a0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
315b0 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20  t(pParse, pSub, 
315c0 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49  &dest);.      pI
315d0 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c  tem->pTab->nRowL
315e0 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53  ogEst = pSub->nS
315f0 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
31600 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  pItem->fg.viaCor
31610 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20  outine = 1;.    
31620 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 73 75    pItem->regResu
31630 6c 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b  lt = dest.iSdst;
31640 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
31650 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76  beEndCoroutine(v
31660 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
31670 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rn);.      sqlit
31680 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
31690 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20  , addrTop-1);.  
316a0 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
316b0 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61  TempRegCache(pPa
316c0 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rse);.    }else{
316d0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
316e0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
316f0 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61  that will fill a
31700 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
31710 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20  e with.      ** 
31720 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
31730 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20 70  his subquery.  p
31740 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
31750 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20  b will point.   
31760 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64     ** to the add
31770 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65  ress of the gene
31780 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  rated subroutine
31790 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  .  pItem->regRet
317a0 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  urn.      ** is 
317b0 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63  a register alloc
317c0 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  ated to hold the
317d0 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   subroutine retu
317e0 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20 20  rn address.     
317f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f   */.      int to
31800 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74  pAddr;.      int
31810 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20   onceAddr = 0;. 
31820 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64 72       int retAddr
31830 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  ;.      struct S
31840 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 50 72  rcList_item *pPr
31850 69 6f 72 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  ior;..      asse
31860 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  rt( pItem->addrF
31870 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20  illSub==0 );.   
31880 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74     pItem->regRet
31890 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
318a0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41  nMem;.      topA
318b0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
318c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
318d0 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d  teger, 0, pItem-
318e0 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
318f0 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69     pItem->addrFi
31900 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b  llSub = topAddr+
31910 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  1;.      if( pIt
31920 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61  em->fg.isCorrela
31930 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ted==0 ){.      
31940 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71    /* If the subq
31950 75 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72  uery is not corr
31960 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77 65  elated and if we
31970 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20   are not inside 
31980 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  of.        ** a 
31990 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65  trigger, then we
319a0 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f   only need to co
319b0 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20  mpute the value 
319c0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0a  of the subquery.
319d0 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e          ** once.
319e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65   */.        once
319f0 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
31a00 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
31a10 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
31a20 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56  ge(v);.        V
31a30 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
31a40 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73  materialize \"%s
31a50 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  \"", pItem->pTab
31a60 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
31a70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31a80 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
31a90 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
31aa0 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d   \"%s\"", pItem-
31ab0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
31ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
31ad0 72 69 6f 72 20 3d 20 69 73 53 65 6c 66 4a 6f 69  rior = isSelfJoi
31ae0 6e 56 69 65 77 28 70 54 61 62 4c 69 73 74 2c 20  nView(pTabList, 
31af0 70 49 74 65 6d 29 3b 0a 20 20 20 20 20 20 69 66  pItem);.      if
31b00 28 20 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ( pPrior ){.    
31b10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
31b20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
31b30 44 75 70 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Dup, pItem->iCur
31b40 73 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 69 43 75  sor, pPrior->iCu
31b50 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 61  rsor);.        a
31b60 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
31b70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20  Select!=0 );.   
31b80 20 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65       pSub->nSele
31b90 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
31ba0 70 53 65 6c 65 63 74 2d 3e 6e 53 65 6c 65 63 74  pSelect->nSelect
31bb0 52 6f 77 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Row;.      }else
31bc0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
31bd0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
31be0 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d  &dest, SRT_Ephem
31bf0 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Tab, pItem->iCur
31c00 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 45 78  sor);.        Ex
31c10 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
31c20 70 50 61 72 73 65 2c 20 31 2c 20 22 4d 41 54 45  pParse, 1, "MATE
31c30 52 49 41 4c 49 5a 45 20 30 78 25 70 22 2c 20 70  RIALIZE 0x%p", p
31c40 53 75 62 29 29 3b 0a 20 20 20 20 20 20 20 20 73  Sub));.        s
31c50 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
31c60 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
31c70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
31c80 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52   pItem->pTab->nR
31c90 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d  owLogEst = pSub-
31ca0 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
31cb0 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20     if( onceAddr 
31cc0 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
31cd0 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64  pHere(v, onceAdd
31ce0 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64  r);.      retAdd
31cf0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
31d00 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
31d10 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  rn, pItem->regRe
31d20 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62  turn);.      Vdb
31d30 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
31d40 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54  d %s", pItem->pT
31d50 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
31d60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
31d70 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64  angeP1(v, topAdd
31d80 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20  r, retAddr);.   
31d90 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54     sqlite3ClearT
31da0 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72  empRegCache(pPar
31db0 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  se);.    }.    i
31dc0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
31dd0 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  led ) goto selec
31de0 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61 72 73  t_end;.    pPars
31df0 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71  e->nHeight -= sq
31e00 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
31e10 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 50  eight(p);.    pP
31e20 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
31e30 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
31e40 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 20  ontext;.#endif. 
31e50 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73   }..  /* Various
31e60 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
31e70 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20 69   SELECT copied i
31e80 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  nto local variab
31e90 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e  les for.  ** con
31ea0 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45  venience */.  pE
31eb0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
31ec0 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  ;.  pWhere = p->
31ed0 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70  pWhere;.  pGroup
31ee0 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
31ef0 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d  ;.  pHaving = p-
31f00 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73  >pHaving;.  sDis
31f10 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28  tinct.isTnct = (
31f20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
31f30 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a  _Distinct)!=0;..
31f40 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
31f50 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
31f60 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
31f70 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
31f80 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30  SELECTTRACE(0x40
31f90 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74  0,pParse,p,("Aft
31fa0 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  er all FROM-clau
31fb0 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29  se analysis:\n")
31fc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
31fd0 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
31fe0 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
31ff0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
32000 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54  _COUNTOFVIEW_OPT
32010 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  IMIZATION.  if( 
32020 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
32030 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51  led(db, SQLITE_Q
32040 75 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53 51  ueryFlattener|SQ
32050 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65 77  LITE_CountOfView
32060 29 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66 56  ).   && countOfV
32070 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28  iewOptimization(
32080 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b 0a  pParse, p).  ){.
32090 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
320a0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
320b0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
320c0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
320d0 73 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  st;.    pTabList
320e0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a   = p->pSrc;.  }.
320f0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
32100 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53  the query is DIS
32110 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52  TINCT with an OR
32120 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f  DER BY but is no
32130 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20  t an aggregate, 
32140 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65  and .  ** if the
32150 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20   select-list is 
32160 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
32170 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74  ORDER BY list, t
32180 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20  hen this query. 
32190 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69   ** can be rewri
321a0 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20  tten as a GROUP 
321b0 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  BY. In other wor
321c0 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ds, this:.  **. 
321d0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44   **     SELECT D
321e0 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d  ISTINCT xyz FROM
321f0 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79   ... ORDER BY xy
32200 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74  z.  **.  ** is t
32210 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20  ransformed to:. 
32220 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
32230 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  ECT xyz FROM ...
32240 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f 52   GROUP BY xyz OR
32250 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a  DER BY xyz.  **.
32260 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20    ** The second 
32270 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65  form is preferre
32280 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  d as a single in
32290 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62  dex (or temp-tab
322a0 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a  le) may be .  **
322b0 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74   used for both t
322c0 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20  he ORDER BY and 
322d0 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73  DISTINCT process
322e0 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c  ing. As original
322f0 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e  ly .  ** written
32300 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20   the query must 
32310 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65  use a temp-table
32320 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e   for at least on
32330 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a  e of the ORDER .
32340 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54    ** BY and DIST
32350 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64  INCT, and an ind
32360 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74  ex or separate t
32370 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68  emp-table for th
32380 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20  e other..  */.  
32390 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
323a0 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
323b0 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
323c0 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20  SF_Distinct .   
323d0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  && sqlite3ExprLi
323e0 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e  stCompare(sSort.
323f0 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73 74  pOrderBy, pEList
32400 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20  , -1)==0.  ){.  
32410 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
32420 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
32430 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
32440 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
32450 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
32460 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20  b, pEList, 0);. 
32470 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61     /* Notice tha
32480 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53  t even thought S
32490 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62  F_Distinct has b
324a0 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d  een cleared from
324b0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20   p->selFlags,.  
324c0 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e    ** the sDistin
324d0 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69  ct.isTnct is sti
324e0 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20  ll set.  Hence, 
324f0 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74  isTnct represent
32500 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69  s the.    ** ori
32510 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66  ginal setting of
32520 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74   the SF_Distinct
32530 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63   flag, not the c
32540 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a  urrent setting *
32550 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44  /.    assert( sD
32560 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29  istinct.isTnct )
32570 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
32580 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69  CE_ENABLED.    i
32590 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
325a0 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b  Trace & 0x400 ){
325b0 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
325c0 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c  CE(0x400,pParse,
325d0 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44 49  p,("Transform DI
325e0 53 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f 55  STINCT into GROU
325f0 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  P BY:\n"));.    
32600 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
32610 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
32620 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
32630 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
32640 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
32650 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63 72   clause, then cr
32660 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61  eate an ephemera
32670 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20  l index to.  ** 
32680 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 20  do the sorting. 
32690 20 42 75 74 20 74 68 69 73 20 73 6f 72 74 69 6e   But this sortin
326a0 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  g ephemeral inde
326b0 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a 20  x might end up. 
326c0 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65 64   ** being unused
326d0 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
326e0 20 62 65 20 65 78 74 72 61 63 74 65 64 20 69 6e   be extracted in
326f0 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65   pre-sorted orde
32700 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74 20  r..  ** If that 
32710 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
32720 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  n the OP_OpenEph
32730 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
32740 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  on will be.  ** 
32750 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50  changed to an OP
32760 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66 69  _Noop once we fi
32770 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68  gure out that th
32780 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
32790 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64  is.  ** not need
327a0 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e 61  ed.  The sSort.a
327b0 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61 72  ddrSortIndex var
327c0 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
327d0 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a   facilitate.  **
327e0 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20   that change..  
327f0 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70  */.  if( sSort.p
32800 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b  OrderBy ){.    K
32810 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
32820 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
32830 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
32840 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73 53 6f  List(pParse, sSo
32850 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20  rt.pOrderBy, 0, 
32860 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
32870 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73      sSort.iECurs
32880 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
32890 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61  b++;.    sSort.a
328a0 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20  ddrSortIndex =. 
328b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
328c0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
328d0 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
328e0 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75        sSort.iECu
328f0 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64  rsor, sSort.pOrd
32900 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45  erBy->nExpr+1+pE
32910 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a  List->nExpr, 0,.
32920 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
32930 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
32940 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20  YINFO.      );. 
32950 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72   }else{.    sSor
32960 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
32970 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
32980 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
32990 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
329a0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
329b0 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
329c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  ..  */.  if( pDe
329d0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
329e0 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73  phemTab ){.    s
329f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
32a00 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
32a10 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44  eral, pDest->iSD
32a20 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Parm, pEList->nE
32a30 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  xpr);.  }..  /* 
32a40 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
32a50 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73  .  */.  iEnd = s
32a60 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
32a70 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 28 70  bel(v);.  if( (p
32a80 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
32a90 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20 29  FixedLimit)==0 )
32aa0 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  {.    p->nSelect
32ab0 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34  Row = 320;  /* 4
32ac0 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f   billion rows */
32ad0 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c 69  .  }.  computeLi
32ae0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
32af0 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20  rse, p, iEnd);. 
32b00 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d   if( p->iLimit==
32b10 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53  0 && sSort.addrS
32b20 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20  ortIndex>=0 ){. 
32b30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
32b40 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73 53  angeOpcode(v, sS
32b50 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
32b60 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  x, OP_SorterOpen
32b70 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72  );.    sSort.sor
32b80 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c  tFlags |= SORTFL
32b90 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20  AG_UseSorter;.  
32ba0 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20  }..  /* Open an 
32bb0 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
32bc0 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
32bd0 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a  istinct set..  *
32be0 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
32bf0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
32c00 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e  t ){.    sDistin
32c10 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61  ct.tabTnct = pPa
32c20 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
32c30 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54   sDistinct.addrT
32c40 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nct = sqlite3Vdb
32c50 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
32c60 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
32c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c80 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69            sDisti
32c90 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20  nct.tabTnct, 0, 
32ca0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
32cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32cc0 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72  (char*)keyInfoFr
32cd0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
32ce0 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30  e, p->pEList,0,0
32cf0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
32d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d10 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
32d20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
32d30 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e  geP5(v, BTREE_UN
32d40 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44  ORDERED);.    sD
32d50 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
32d60 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e = WHERE_DISTIN
32d70 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20  CT_UNORDERED;.  
32d80 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74  }else{.    sDist
32d90 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
32da0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
32db0 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  NOOP;.  }..  if(
32dc0 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75   !isAgg && pGrou
32dd0 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBy==0 ){.    /*
32de0 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   No aggregate fu
32df0 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47  nctions and no G
32e00 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
32e10 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c 46  /.    u16 wctrlF
32e20 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e 63  lags = (sDistinc
32e30 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52 45  t.isTnct ? WHERE
32e40 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a  _WANT_DISTINCT :
32e50 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
32e60 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54   WHERE_USE_LIMIT
32e70 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 20  ==SF_FixedLimit 
32e80 29 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67  );.    wctrlFlag
32e90 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  s |= p->selFlags
32ea0 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74   & SF_FixedLimit
32eb0 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  ;..    /* Begin 
32ec0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
32ed0 6e 2e 20 2a 2f 0a 20 20 20 20 53 45 4c 45 43 54  n. */.    SELECT
32ee0 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
32ef0 2c 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22  ,("WhereBegin\n"
32f00 29 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d  ));.    pWInfo =
32f10 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
32f20 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
32f30 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f  ist, pWhere, sSo
32f40 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20  rt.pOrderBy,.   
32f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f60 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
32f70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67  EList, wctrlFlag
32f80 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  s, p->nSelectRow
32f90 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
32fa0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
32fb0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  ct_end;.    if( 
32fc0 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
32fd0 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
32fe0 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52  o) < p->nSelectR
32ff0 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  ow ){.      p->n
33000 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
33010 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
33020 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a  wCount(pWInfo);.
33030 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44      }.    if( sD
33040 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26  istinct.isTnct &
33050 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  & sqlite3WhereIs
33060 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29  Distinct(pWInfo)
33070 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69   ){.      sDisti
33080 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
33090 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
330a0 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a  stinct(pWInfo);.
330b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53      }.    if( sS
330c0 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ort.pOrderBy ){.
330d0 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53        sSort.nOBS
330e0 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  at = sqlite3Wher
330f0 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66  eIsOrdered(pWInf
33100 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e  o);.      sSort.
33110 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f  bOrderedInnerLoo
33120 70 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  p = sqlite3Where
33130 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70  OrderedInnerLoop
33140 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
33150 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74  if( sSort.nOBSat
33160 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ==sSort.pOrderBy
33170 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
33180 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
33190 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 0;.      }. 
331a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
331b0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
331c0 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62  at was created b
331d0 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65  y a prior OP_Ope
331e0 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20  nEphemeral .    
331f0 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65  ** instruction e
33200 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e  nded up not bein
33210 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63  g needed, then c
33220 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65  hange the OP_Ope
33230 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a  nEphemeral.    *
33240 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  * into an OP_Noo
33250 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  p..    */.    if
33260 28 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  ( sSort.addrSort
33270 49 6e 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72  Index>=0 && sSor
33280 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  t.pOrderBy==0 ){
33290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
332a0 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
332b0 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  , sSort.addrSort
332c0 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20  Index);.    }.. 
332d0 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74     /* Use the st
332e0 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f  andard inner loo
332f0 70 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p. */.    assert
33300 28 20 70 2d 3e 70 45 4c 69 73 74 3d 3d 70 45 4c  ( p->pEList==pEL
33310 69 73 74 20 29 3b 0a 20 20 20 20 73 65 6c 65 63  ist );.    selec
33320 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
33330 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74  e, p, -1, &sSort
33340 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44  , &sDistinct, pD
33350 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
33360 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
33370 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62  WhereContinueLab
33380 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20  el(pWInfo),.    
33390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
333a0 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
333b0 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b  kLabel(pWInfo));
333c0 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65  ..    /* End the
333d0 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c   database scan l
333e0 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
333f0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
33400 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65  pWInfo);.  }else
33410 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
33420 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65 78  se when there ex
33430 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66 75  ist aggregate fu
33440 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f  nctions or a GRO
33450 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20  UP BY clause.   
33460 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20   ** or both */. 
33470 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
33480 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63  NC;    /* Name c
33490 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65  ontext for proce
334a0 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20  ssing aggregate 
334b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
334c0 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20     int iAMem;   
334d0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
334e0 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
334f0 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20  storing current 
33500 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
33510 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20  int iBMem;      
33520 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
33530 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65   address for pre
33540 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a  vious GROUP BY *
33550 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c  /.    int iUseFl
33560 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  ag;       /* Mem
33570 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67   address holding
33580 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67   flag indicating
33590 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20   that at least. 
335a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
335b0 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f         ** one ro
335c0 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74  w of the input t
335d0 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72  o the aggregator
335e0 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20   has been.      
335f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33600 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a    ** processed *
33610 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74  /.    int iAbort
33620 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d  Flag;     /* Mem
33630 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63   address which c
33640 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72  auses query abor
33650 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f  t if positive */
33660 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79  .    int groupBy
33670 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73  Sort;    /* Rows
33680 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63   come from sourc
33690 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  e in GROUP BY or
336a0 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  der */.    int a
336b0 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f  ddrEnd;        /
336c0 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73  * End of process
336d0 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ing for this SEL
336e0 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ECT */.    int s
336f0 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f  ortPTab = 0;   /
33700 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73  * Pseudotable us
33710 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72  ed to decode sor
33720 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ting results */.
33730 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20      int sortOut 
33740 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75  = 0;    /* Outpu
33750 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20  t register from 
33760 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20  the sorter */.  
33770 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72 70    int orderByGrp
33780 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66   = 0; /* True if
33790 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 6e   the GROUP BY an
337a0 64 20 4f 52 44 45 52 20 42 59 20 61 72 65 20 74  d ORDER BY are t
337b0 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20 20  he same */..    
337c0 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e  /* Remove any an
337d0 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65  d all aliases be
337e0 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74  tween the result
337f0 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20   set and the.   
33800 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61   ** GROUP BY cla
33810 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  use..    */.    
33820 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
33830 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20        int k;    
33840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33850 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
33860 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  ter */.      str
33870 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
33880 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f  m *pItem;  /* Fo
33890 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
338a0 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c  xpression in a l
338b0 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f  ist */..      fo
338c0 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r(k=p->pEList->n
338d0 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70  Expr, pItem=p->p
338e0 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b  EList->a; k>0; k
338f0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
33900 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
33910 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  .iAlias = 0;.   
33920 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b     }.      for(k
33930 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  =pGroupBy->nExpr
33940 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79  , pItem=pGroupBy
33950 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70  ->a; k>0; k--, p
33960 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
33970 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69   pItem->u.x.iAli
33980 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  as = 0;.      }.
33990 20 20 20 20 20 20 61 73 73 65 72 74 28 20 36 36        assert( 66
339a0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
339b0 31 30 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66  100) );.      if
339c0 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  ( p->nSelectRow>
339d0 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  66 ) p->nSelectR
339e0 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65 6c  ow = 66;.    }el
339f0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
33a00 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  ( 0==sqlite3LogE
33a10 73 74 28 31 29 20 29 3b 0a 20 20 20 20 20 20 70  st(1) );.      p
33a20 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30  ->nSelectRow = 0
33a30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
33a40 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68  If there is both
33a50 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20   a GROUP BY and 
33a60 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
33a70 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a  se and they are.
33a80 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c      ** identical
33a90 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65  , then it may be
33aa0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69 73   possible to dis
33ab0 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42  able the ORDER B
33ac0 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a 2a  Y clause .    **
33ad0 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73 20   on the grounds 
33ae0 74 68 61 74 20 74 68 65 20 47 52 4f 55 50 20 42  that the GROUP B
33af0 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65  Y will cause ele
33b00 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75  ments to come ou
33b10 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  t .    ** in the
33b20 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20   correct order. 
33b30 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74 20  It also may not 
33b40 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 6d  - the GROUP BY m
33b50 69 67 68 74 20 75 73 65 20 61 0a 20 20 20 20 2a  ight use a.    *
33b60 2a 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  * database index
33b70 20 74 68 61 74 20 63 61 75 73 65 73 20 72 6f 77   that causes row
33b80 73 20 74 6f 20 62 65 20 67 72 6f 75 70 65 64 20  s to be grouped 
33b90 74 6f 67 65 74 68 65 72 20 61 73 20 72 65 71 75  together as requ
33ba0 69 72 65 64 0a 20 20 20 20 2a 2a 20 62 75 74 20  ired.    ** but 
33bb0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 73 6f 72  not actually sor
33bc0 74 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ted. Either way,
33bd0 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
33be0 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
33bf0 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47 52   ORDER BY and GR
33c00 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73 20 61  OUP BY clauses a
33c10 72 65 20 74 68 65 20 73 61 6d 65 20 62 79 20 73  re the same by s
33c20 65 74 74 69 6e 67 20 74 68 65 20 6f 72 64 65 72  etting the order
33c30 42 79 47 72 70 0a 20 20 20 20 2a 2a 20 76 61 72  ByGrp.    ** var
33c40 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69  iable.  */.    i
33c50 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
33c60 73 74 43 6f 6d 70 61 72 65 28 70 47 72 6f 75 70  stCompare(pGroup
33c70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  By, sSort.pOrder
33c80 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  By, -1)==0 ){.  
33c90 20 20 20 20 6f 72 64 65 72 42 79 47 72 70 20 3d      orderByGrp =
33ca0 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20   1;.    }. .    
33cb0 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62 65  /* Create a labe
33cc0 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65  l to jump to whe
33cd0 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f  n we want to abo
33ce0 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  rt the query */.
33cf0 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71      addrEnd = sq
33d00 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
33d10 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  el(v);..    /* C
33d20 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e  onvert TK_COLUMN
33d30 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41   nodes into TK_A
33d40 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61  GG_COLUMN and ma
33d50 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ke entries in.  
33d60 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f    ** sAggInfo fo
33d70 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e  r all TK_AGG_FUN
33d80 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65  CTION nodes in e
33d90 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
33da0 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  e.    ** SELECT 
33db0 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a  statement..    *
33dc0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  /.    memset(&sN
33dd0 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
33de0 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72  ));.    sNC.pPar
33df0 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
33e00 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
33e10 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e  pTabList;.    sN
33e20 43 2e 75 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d  C.uNC.pAggInfo =
33e30 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20   &sAggInfo;.    
33e40 56 56 41 5f 4f 4e 4c 59 28 20 73 4e 43 2e 6e 63  VVA_ONLY( sNC.nc
33e50 46 6c 61 67 73 20 3d 20 4e 43 5f 55 41 67 67 49  Flags = NC_UAggI
33e60 6e 66 6f 3b 20 29 0a 20 20 20 20 73 41 67 67 49  nfo; ).    sAggI
33e70 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61 72  nfo.mnReg = pPar
33e80 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
33e90 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
33ea0 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70  gColumn = pGroup
33eb0 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e  By ? pGroupBy->n
33ec0 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 73 41  Expr : 0;.    sA
33ed0 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20  ggInfo.pGroupBy 
33ee0 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = pGroupBy;.    
33ef0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
33f00 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
33f10 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
33f20 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
33f30 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 53 6f  ggList(&sNC, sSo
33f40 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  rt.pOrderBy);.  
33f50 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b    if( pHaving ){
33f60 0a 20 20 20 20 20 20 69 66 28 20 70 47 72 6f 75  .      if( pGrou
33f70 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61  pBy ){.        a
33f80 73 73 65 72 74 28 20 70 57 68 65 72 65 3d 3d 70  ssert( pWhere==p
33f90 2d 3e 70 57 68 65 72 65 20 29 3b 0a 20 20 20 20  ->pWhere );.    
33fa0 20 20 20 20 61 73 73 65 72 74 28 20 70 48 61 76      assert( pHav
33fb0 69 6e 67 3d 3d 70 2d 3e 70 48 61 76 69 6e 67 20  ing==p->pHaving 
33fc0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
33fd0 74 28 20 70 47 72 6f 75 70 42 79 3d 3d 70 2d 3e  t( pGroupBy==p->
33fe0 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20 20 20  pGroupBy );.    
33ff0 20 20 20 20 68 61 76 69 6e 67 54 6f 57 68 65 72      havingToWher
34000 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  e(pParse, p);.  
34010 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 70        pWhere = p
34020 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20  ->pWhere;.      
34030 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
34040 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
34050 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69  ates(&sNC, pHavi
34060 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ng);.    }.    s
34070 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c  AggInfo.nAccumul
34080 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e  ator = sAggInfo.
34090 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28  nColumn;.    if(
340a0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
340b0 26 26 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30  && p->pHaving==0
340c0 20 26 26 20 73 41 67 67 49 6e 66 6f 2e 6e 46 75   && sAggInfo.nFu
340d0 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d  nc==1 ){.      m
340e0 69 6e 4d 61 78 46 6c 61 67 20 3d 20 6d 69 6e 4d  inMaxFlag = minM
340f0 61 78 51 75 65 72 79 28 64 62 2c 20 73 41 67 67  axQuery(db, sAgg
34100 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 70 45  Info.aFunc[0].pE
34110 78 70 72 2c 20 26 70 4d 69 6e 4d 61 78 4f 72 64  xpr, &pMinMaxOrd
34120 65 72 42 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65  erBy);.    }else
34130 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78 46 6c  {.      minMaxFl
34140 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  ag = WHERE_ORDER
34150 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 7d  BY_NORMAL;.    }
34160 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
34170 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20  sAggInfo.nFunc; 
34180 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
34190 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
341a0 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46  erty(sAggInfo.aF
341b0 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50  unc[i].pExpr, EP
341c0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
341d0 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73       sNC.ncFlags
341e0 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63   |= NC_InAggFunc
341f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
34200 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
34210 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f  t(&sNC, sAggInfo
34220 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d  .aFunc[i].pExpr-
34230 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  >x.pList);.     
34240 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20   sNC.ncFlags &= 
34250 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20  ~NC_InAggFunc;. 
34260 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
34270 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65  o.mxReg = pParse
34280 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20  ->nMem;.    if( 
34290 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
342a0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
342b0 6e 64 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  nd;.#if SELECTTR
342c0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
342d0 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
342e0 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
342f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a  {.      int ii;.
34300 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
34310 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70  E(0x400,pParse,p
34320 2c 28 22 41 66 74 65 72 20 61 67 67 72 65 67 61  ,("After aggrega
34330 74 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29  te analysis:\n")
34340 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34350 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
34360 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  , p, 0);.      f
34370 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41 67 67  or(ii=0; ii<sAgg
34380 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 69  Info.nColumn; ii
34390 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
343a0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
343b0 22 61 67 67 2d 63 6f 6c 75 6d 6e 5b 25 64 5d 20  "agg-column[%d] 
343c0 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  iMem=%d\n",.    
343d0 20 20 20 20 20 20 20 20 69 69 2c 20 73 41 67 67          ii, sAgg
343e0 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 69 4d  Info.aCol[ii].iM
343f0 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
34400 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
34410 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f  (0, sAggInfo.aCo
34420 6c 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b  l[ii].pExpr, 0);
34430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
34440 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41 67 67  or(ii=0; ii<sAgg
34450 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 69 2b 2b  Info.nFunc; ii++
34460 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34470 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 61  e3DebugPrintf("a
34480 67 67 2d 66 75 6e 63 5b 25 64 5d 3a 20 69 4d 65  gg-func[%d]: iMe
34490 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  m=%d\n",.       
344a0 20 20 20 20 20 69 69 2c 20 73 41 67 67 49 6e 66       ii, sAggInf
344b0 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 69 4d 65 6d  o.aFunc[ii].iMem
344c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
344d0 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30  e3TreeViewExpr(0
344e0 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
344f0 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  [ii].pExpr, 0);.
34500 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
34510 6e 64 69 66 0a 0a 0a 20 20 20 20 2f 2a 20 50 72  ndif...    /* Pr
34520 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67  ocessing for agg
34530 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f  regates with GRO
34540 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69  UP BY is very di
34550 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20  fferent and.    
34560 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d  ** much more com
34570 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67  plex than aggreg
34580 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47  ates without a G
34590 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a  ROUP BY..    */.
345a0 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
345b0 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   ){.      KeyInf
345c0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a  o *pKeyInfo;  /*
345d0 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74   Keying informat
345e0 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75  ion for the grou
345f0 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20  p by clause */. 
34600 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 20       int addr1; 
34610 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73           /* A-vs
34620 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a  -B comparision j
34630 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ump */.      int
34640 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20   addrOutputRow; 
34650 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62   /* Start of sub
34660 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
34670 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f  puts a result ro
34680 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  w */.      int r
34690 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f  egOutputRow;   /
346a0 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73  * Return address
346b0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75   register for ou
346c0 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20  tput subroutine 
346d0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
346e0 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20  rSetAbort;   /* 
346f0 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c  Set the abort fl
34700 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  ag and return */
34710 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
34720 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f  opOfLoop;  /* To
34730 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c  p of the input l
34740 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  oop */.      int
34750 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b   addrSortingIdx;
34760 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45   /* The OP_OpenE
34770 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65  phemeral for the
34780 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a   sorting index *
34790 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
347a0 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  Reset;      /* S
347b0 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65  ubroutine for re
347c0 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75  setting the accu
347d0 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  mulator */.     
347e0 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20   int regReset;  
347f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61       /* Return a
34800 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
34810 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75  for reset subrou
34820 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  tine */..      /
34830 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
34840 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
34850 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20  we might need a 
34860 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f  sorting index to
34870 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d  .      ** implem
34880 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74  ent it.  Allocat
34890 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69  e that sorting i
348a0 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74  ndex now.  If it
348b0 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20   turns out.     
348c0 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
348d0 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72  ot need it after
348e0 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72   all, the OP_Sor
348f0 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74  terOpen instruct
34900 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  ion.      ** wil
34910 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
34920 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20  nto a Noop.  .  
34930 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67      */.      sAg
34940 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
34950 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
34960 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  +;.      pKeyInf
34970 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
34980 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
34990 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 73 41 67  pGroupBy, 0, sAg
349a0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a  gInfo.nColumn);.
349b0 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e        addrSortin
349c0 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64  gIdx = sqlite3Vd
349d0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
349e0 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20  orterOpen, .    
349f0 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
34a00 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49  ortingIdx, sAggI
34a10 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
34a20 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30  mn, .          0
34a30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
34a40 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
34a50 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
34a60 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  lize memory loca
34a70 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52  tions used by GR
34a80 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65  OUP BY aggregate
34a90 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20   processing.    
34aa0 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46    */.      iUseF
34ab0 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
34ac0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f  nMem;.      iAbo
34ad0 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  rtFlag = ++pPars
34ae0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
34af0 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b  egOutputRow = ++
34b00 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
34b10 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
34b20 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  w = sqlite3VdbeM
34b30 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
34b40 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b     regReset = ++
34b50 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
34b60 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20      addrReset = 
34b70 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
34b80 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
34b90 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  AMem = pParse->n
34ba0 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
34bb0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
34bc0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
34bd0 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50        iBMem = pP
34be0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
34bf0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
34c00 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
34c10 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
34c20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
34c30 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
34c40 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
34c50 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
34c60 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74  (v, "clear abort
34c70 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
34c80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34c90 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
34ca0 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   0, iUseFlag);. 
34cb0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
34cc0 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61  ((v, "indicate a
34cd0 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79  ccumulator empty
34ce0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
34cf0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
34d00 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65  OP_Null, 0, iAMe
34d10 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42  m, iAMem+pGroupB
34d20 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20  y->nExpr-1);..  
34d30 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
34d40 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
34d50 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
34d60 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
34d70 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
34d80 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
34d90 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
34da0 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
34db0 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in betwe
34dc0 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  en, or.      ** 
34dd0 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69  it might be a si
34de0 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75  ngle loop that u
34df0 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ses an index to 
34e00 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
34e10 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ion.      ** in 
34e20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20  the right order 
34e30 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20  to begin with.. 
34e40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
34e50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
34e60 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
34e70 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
34e80 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  );.      SELECTT
34e90 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c  RACE(1,pParse,p,
34ea0 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22 29  ("WhereBegin\n")
34eb0 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
34ec0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
34ed0 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
34ee0 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47  List, pWhere, pG
34ef0 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20  roupBy, 0,.     
34f00 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50       WHERE_GROUP
34f10 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70  BY | (orderByGrp
34f20 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47   ? WHERE_SORTBYG
34f30 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20  ROUP : 0), 0.   
34f40 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
34f50 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
34f60 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
34f70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
34f80 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
34f90 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e  nfo)==pGroupBy->
34fa0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
34fb0 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65   /* The optimize
34fc0 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c  r is able to del
34fd0 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f  iver rows in gro
34fe0 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20  up by order so. 
34ff0 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20         ** we do 
35000 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74  not have to sort
35010 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  .  The OP_OpenEp
35020 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
35030 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
35040 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72   cancelled later
35050 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c   because we stil
35060 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68  l need to use th
35070 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20  e pKeyInfo.     
35080 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72     */.        gr
35090 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20  oupBySort = 0;. 
350a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
350b0 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20      /* Rows are 
350c0 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e  coming out in un
350d0 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72  determined order
350e0 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75  .  We have to pu
350f0 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61  sh.        ** ea
35100 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f  ch row into a so
35110 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72  rting index, ter
35120 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74  minate the first
35130 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a   loop,.        *
35140 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72  * then loop over
35150 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
35160 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ex in order to g
35170 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  et the output.  
35180 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74        ** in sort
35190 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  ed order.       
351a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
351b0 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20  regBase;.       
351c0 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a   int regRecord;.
351d0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
351e0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47  ;.        int nG
351f0 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20  roupBy;..       
35200 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
35210 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
35220 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63         (sDistinc
35230 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e  t.isTnct && (p->
35240 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74  selFlags&SF_Dist
35250 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20  inct)==0) ?.    
35260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35270 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52  "DISTINCT" : "GR
35280 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20  OUP BY");..     
35290 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
352a0 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f   1;.        nGro
352b0 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d  upBy = pGroupBy-
352c0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
352d0 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b  nCol = nGroupBy;
352e0 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
352f0 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66  oupBy;.        f
35300 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
35310 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
35320 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
35330 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
35340 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  .iSorterColumn>=
35350 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
35360 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20   nCol++;.       
35370 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
35380 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
35390 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
353a0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
353b0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
353c0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
353d0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
353e0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
353f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
35400 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
35410 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65  se, pGroupBy, re
35420 67 42 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  gBase, 0, 0);.  
35430 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
35440 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  By;.        for(
35450 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
35460 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
35470 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
35480 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
35490 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43  l = &sAggInfo.aC
354a0 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  ol[i];.         
354b0 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
354c0 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20  erColumn>=j ){. 
354d0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
354e0 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b  1 = j + regBase;
354f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
35500 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
35510 6f 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61 72 73  olumnToReg(pPars
35520 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
35530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35540 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70     pCol->pTab, p
35550 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43  Col->iColumn, pC
35560 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29 3b  ol->iTable, r1);
35570 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  .            j++
35580 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
35590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
355a0 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
355b0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
355c0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
355d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
355e0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
355f0 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  d, regBase, nCol
35600 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
35610 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
35620 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
35630 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67  rterInsert, sAgg
35640 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
35650 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
35660 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
35670 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
35680 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
35690 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
356a0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
356b0 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
356c0 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
356d0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
356e0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
356f0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
35700 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54  IdxPTab = sortPT
35710 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
35720 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72  b++;.        sor
35730 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65  tOut = sqlite3Ge
35740 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
35750 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
35760 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
35770 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f  P_OpenPseudo, so
35780 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c  rtPTab, sortOut,
35790 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
357a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
357b0 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f  2(v, OP_SorterSo
357c0 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
357d0 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64  tingIdx, addrEnd
357e0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
357f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55  omment((v, "GROU
35800 50 20 42 59 20 73 6f 72 74 22 29 29 3b 20 56 64  P BY sort")); Vd
35810 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
35820 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
35830 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  useSortingIdx = 
35840 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
35850 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
35860 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
35870 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
35880 74 68 65 20 69 6e 64 65 78 20 6f 72 20 74 65 6d  the index or tem
35890 70 6f 72 61 72 79 20 74 61 62 6c 65 20 75 73 65  porary table use
358a0 64 20 62 79 20 74 68 65 20 47 52 4f 55 50 20 42  d by the GROUP B
358b0 59 20 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a 20  Y sort.      ** 
358c0 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20 64  will naturally d
358d0 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 74  eliver rows in t
358e0 68 65 20 6f 72 64 65 72 20 72 65 71 75 69 72 65  he order require
358f0 64 20 62 79 20 74 68 65 20 4f 52 44 45 52 20 42  d by the ORDER B
35900 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73  Y.      ** claus
35910 65 2c 20 63 61 6e 63 65 6c 20 74 68 65 20 65 70  e, cancel the ep
35920 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f 70  hemeral table op
35930 65 6e 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72  en coded earlier
35940 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
35950 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f   ** This is an o
35960 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68  ptimization - th
35970 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
35980 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72   should result r
35990 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20  egardless..     
359a0 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c 49   ** Use the SQLI
359b0 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20  TE_GroupByOrder 
359c0 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54 45  flag with SQLITE
359d0 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
359e0 5a 45 52 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ZER to .      **
359f0 20 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70   disable this op
35a00 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
35a10 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  esting purposes.
35a20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f    */.      if( o
35a30 72 64 65 72 42 79 47 72 70 20 26 26 20 4f 70 74  rderByGrp && Opt
35a40 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
35a50 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75  (db, SQLITE_Grou
35a60 70 42 79 4f 72 64 65 72 29 20 0a 20 20 20 20 20  pByOrder) .     
35a70 20 20 26 26 20 28 67 72 6f 75 70 42 79 53 6f 72    && (groupBySor
35a80 74 20 7c 7c 20 73 71 6c 69 74 65 33 57 68 65 72  t || sqlite3Wher
35a90 65 49 73 53 6f 72 74 65 64 28 70 57 49 6e 66 6f  eIsSorted(pWInfo
35aa0 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  )).      ){.    
35ab0 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
35ac0 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  By = 0;.        
35ad0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
35ae0 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74  eToNoop(v, sSort
35af0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  .addrSortIndex);
35b00 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
35b10 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
35b20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
35b30 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65   terms and store
35b40 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e   in b0, b1, b2..
35b50 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69  ..      ** (b0 i
35b60 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  s memory locatio
35b70 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73  n iBMem+0, b1 is
35b80 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f   iBMem+1, and so
35b90 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a   forth).      **
35ba0 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68   Then compare th
35bb0 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
35bc0 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74  BY terms against
35bd0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
35be0 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  rms.      ** fro
35bf0 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  m the previous r
35c00 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ow currently sto
35c10 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61  red in a0, a1, a
35c20 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  2....      */.  
35c30 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f      addrTopOfLoo
35c40 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
35c50 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
35c60 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
35c70 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
35c80 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72  e);.      if( gr
35c90 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
35ca0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
35cb0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  AddOp3(v, OP_Sor
35cc0 74 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66  terData, sAggInf
35cd0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20  o.sortingIdx,.  
35ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35cf0 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74 2c          sortOut,
35d00 20 73 6f 72 74 50 54 61 62 29 3b 0a 20 20 20 20   sortPTab);.    
35d10 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
35d20 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; j<pGroupBy->n
35d30 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
35d40 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
35d50 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ort ){.         
35d60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
35d70 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
35d80 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42   sortPTab, j, iB
35d90 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
35da0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
35db0 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74   sAggInfo.direct
35dc0 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Mode = 1;.      
35dd0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
35de0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ode(pParse, pGro
35df0 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  upBy->a[j].pExpr
35e00 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
35e10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35e20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
35e30 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
35e40 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65  are, iAMem, iBMe
35e50 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  m, pGroupBy->nEx
35e60 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
35e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
35e80 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
35e90 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
35ea0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
35eb0 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
35ec0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
35ed0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
35ee0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
35ef0 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
35f00 31 2b 31 2c 20 30 2c 20 61 64 64 72 31 2b 31 29  1+1, 0, addr1+1)
35f10 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
35f20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
35f30 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
35f40 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68  runs whenever th
35f50 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67  e GROUP BY chang
35f60 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61  es..      ** Cha
35f70 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55  nges in the GROU
35f80 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65  P BY are detecte
35f90 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
35fa0 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20  s code.      ** 
35fb0 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65  block.  If there
35fc0 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73   were no changes
35fd0 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  , this block is 
35fe0 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a  skipped..      *
35ff0 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  *.      ** This 
36000 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72  code copies curr
36010 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72  ent group by ter
36020 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e  ms in b0,b1,b2,.
36030 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  ...      ** over
36040 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49   to a0,a1,a2.  I
36050 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65  t then calls the
36060 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
36070 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ne.      ** and 
36080 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65  resets the aggre
36090 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
360a0 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72   registers in pr
360b0 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20  eparation.      
360c0 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ** for the next 
360d0 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a  GROUP BY batch..
360e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
360f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
36100 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d  ve(pParse, iBMem
36110 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42  , iAMem, pGroupB
36120 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  y->nExpr);.     
36130 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
36140 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
36150 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
36160 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
36170 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
36180 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20  (v, "output one 
36190 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71  row"));.      sq
361a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
361b0 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62  v, OP_IfPos, iAb
361c0 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64  ortFlag, addrEnd
361d0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
361e0 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
361f0 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b  mment((v, "check
36200 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
36210 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
36220 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
36230 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61  sub, regReset, a
36240 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
36250 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
36260 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61   "reset accumula
36270 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
36280 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67  * Update the agg
36290 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
362a0 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ors based on the
362b0 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20   content of.    
362c0 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
362d0 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20   row.      */.  
362e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
362f0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
36300 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41  );.      updateA
36310 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
36320 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
36330 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36340 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
36350 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61  eger, 1, iUseFla
36360 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
36370 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63  mment((v, "indic
36380 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63 75  ate data in accu
36390 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
363a0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65     /* End of the
363b0 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20   loop.      */. 
363c0 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
363d0 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
363e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
363f0 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65  2(v, OP_SorterNe
36400 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  xt, sAggInfo.sor
36410 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70  tingIdx, addrTop
36420 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  OfLoop);.       
36430 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
36440 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
36450 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
36460 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
36470 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
36480 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
36490 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  v, addrSortingId
364a0 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  x);.      }..   
364b0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65     /* Output the
364c0 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65   final row of re
364d0 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sult.      */.  
364e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
364f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
36500 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c  b, regOutputRow,
36510 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
36520 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
36530 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66  nt((v, "output f
36540 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20  inal row"));..  
36550 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72      /* Jump over
36560 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73   the subroutines
36570 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
36580 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
36590 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20  v, addrEnd);..  
365a0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
365b0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
365c0 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67  t outputs a sing
365d0 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
365e0 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
365f0 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74  t.  This subrout
36600 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20  ine first looks 
36610 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e  at the iUseFlag.
36620 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20    If iUseFlag.  
36630 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74      ** is less t
36640 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
36650 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75  zero, the subrou
36660 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
36670 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68    If.      ** th
36680 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c  e processing cal
36690 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79  ls for the query
366a0 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20   to abort, this 
366b0 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
366c0 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74   ** increments t
366d0 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65  he iAbortFlag me
366e0 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65  mory location be
366f0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
36700 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
36710 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63   to signal the c
36720 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a  aller to abort..
36730 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
36740 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71  ddrSetAbort = sq
36750 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
36760 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
36770 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
36780 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
36790 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  1, iAbortFlag);.
367a0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
367b0 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74  t((v, "set abort
367c0 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
367d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
367e0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
367f0 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
36800 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36810 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
36820 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
36830 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
36840 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
36850 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
36860 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
36870 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
36880 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20  fPos, iUseFlag, 
36890 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29  addrOutputRow+2)
368a0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
368b0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
368c0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
368d0 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  Groupby result g
368e0 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70  enerator entry p
368f0 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73  oint"));.      s
36900 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
36910 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
36920 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
36930 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
36940 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
36950 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
36960 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
36970 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
36980 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75  aving, addrOutpu
36990 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a  tRow+1, SQLITE_J
369a0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
369b0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
369c0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c  p(pParse, p, -1,
369d0 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20 20 20   &sSort,.       
369e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
369f0 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74  sDistinct, pDest
36a00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
36a10 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70          addrOutp
36a20 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74  utRow+1, addrSet
36a30 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Abort);.      sq
36a40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
36a50 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
36a60 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
36a70 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
36a80 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20  v, "end groupby 
36a90 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72  result generator
36aa0 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  "));..      /* G
36ab0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
36ac0 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
36ad0 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62  eset the group-b
36ae0 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20  y accumulator.  
36af0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
36b00 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
36b10 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65  abel(v, addrRese
36b20 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41  t);.      resetA
36b30 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
36b40 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
36b50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36b60 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
36b70 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a  urn, regReset);.
36b80 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65       .    } /* e
36b90 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20  ndif pGroupBy.  
36ba0 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65 20  Begin aggregate 
36bb0 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 20  queries without 
36bc0 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20  GROUP BY: */.   
36bd0 20 65 6c 73 65 20 7b 0a 23 69 66 6e 64 65 66 20   else {.#ifndef 
36be0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
36bf0 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62  ECOUNT.      Tab
36c00 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
36c10 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69  if( (pTab = isSi
36c20 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41  mpleCount(p, &sA
36c30 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20  ggInfo))!=0 ){. 
36c40 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53         /* If isS
36c50 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74  impleCount() ret
36c60 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
36c70 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  o a Table struct
36c80 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ure, then.      
36c90 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61    ** the SQL sta
36ca0 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65  tement is of the
36cb0 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a   form:.        *
36cc0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  *.        **   S
36cd0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
36ce0 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20  ROM <tbl>.      
36cf0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
36d00 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20  where the Table 
36d10 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
36d20 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61  ed represents ta
36d30 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20  ble <tbl>..     
36d40 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
36d50 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
36d60 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61  is so common tha
36d70 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65  t it is optimize
36d80 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65  d specially. The
36d90 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43  .        ** OP_C
36da0 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  ount instruction
36db0 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74   is executed eit
36dc0 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65  her on the intke
36dd0 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20  y table that.   
36de0 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
36df0 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61   the data for ta
36e00 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20  ble <tbl> or on 
36e10 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78  one of its index
36e20 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a  es. It.        *
36e30 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65  * is better to e
36e40 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e  xecute the op on
36e50 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e   an index, as in
36e60 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74  dexes are almost
36e70 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
36e80 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73  ys spread across
36e90 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e   less pages than
36ea0 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e   their correspon
36eb0 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20  ding tables..   
36ec0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
36ed0 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20  const int iDb = 
36ee0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
36ef0 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
36f00 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
36f10 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
36f20 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65  nt iCsr = pParse
36f30 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
36f40 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20   Cursor to scan 
36f50 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20  b-tree */.      
36f60 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
36f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f80 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
36f90 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
36fa0 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
36fb0 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
36fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
36fd0 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e  eyinfo for scann
36fe0 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ed index */.    
36ff0 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74      Index *pBest
37000 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
37010 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74           /* Best
37020 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20   index found so 
37030 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  far */.        i
37040 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d  nt iRoot = pTab-
37050 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  >tnum;          
37060 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
37070 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72   of scanned b-tr
37080 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73  ee */..        s
37090 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
370a0 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
370b0 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
370c0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
370d0 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
370e0 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
370f0 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20  zName);..       
37100 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74   /* Search for t
37110 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61  he index that ha
37120 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61  s the lowest sca
37130 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20  n cost..        
37140 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32  **.        ** (2
37150 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f  011-04-15) Do no
37160 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e  t do a full scan
37170 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64   of an unordered
37180 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
37190 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32  **.        ** (2
371a0 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f  013-10-03) Do no
371b0 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72  t count the entr
371c0 69 65 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c  ies in a partial
371d0 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
371e0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
371f0 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65   practice the Ke
37200 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
37210 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64  will not be used
37220 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20  . It is only .  
37230 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20        ** passed 
37240 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52  to keep OP_OpenR
37250 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20  ead happy..     
37260 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
37270 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
37280 29 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69  ) ) pBest = sqli
37290 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
372a0 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  ex(pTab);.      
372b0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
372c0 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
372d0 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
372e0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
372f0 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  pIdx->bUnordered
37300 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
37310 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77  & pIdx->szIdxRow
37320 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a  <pTab->szTabRow.
37330 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49             && pI
37340 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
37350 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
37360 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49  && (!pBest || pI
37370 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65  dx->szIdxRow<pBe
37380 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20  st->szIdxRow).  
37390 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
373a0 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70         pBest = p
373b0 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Idx;.          }
373c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
373d0 20 20 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a     if( pBest ){.
373e0 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20            iRoot 
373f0 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20  = pBest->tnum;. 
37400 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
37410 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
37420 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
37430 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20  , pBest);.      
37440 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
37450 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Open a read-only
37460 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65   cursor, execute
37470 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63   the OP_Count, c
37480 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e  lose the cursor.
37490 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
374a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
374b0 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
374c0 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44   iCsr, iRoot, iD
374d0 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  b, 1);.        i
374e0 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
374f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
37500 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
37510 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79  -1, (char *)pKey
37520 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
37530 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
37540 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37550 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75  AddOp2(v, OP_Cou
37560 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e  nt, iCsr, sAggIn
37570 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d  fo.aFunc[0].iMem
37580 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
37590 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
375a0 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b  OP_Close, iCsr);
375b0 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e  .        explain
375c0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72  SimpleCount(pPar
375d0 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29  se, pTab, pBest)
375e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
375f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
37600 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a  MIT_BTREECOUNT *
37610 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
37620 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72    /* This case r
37630 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65  uns if the aggre
37640 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55  gate has no GROU
37650 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68  P BY clause.  Th
37660 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  e.        ** pro
37670 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20  cessing is much 
37680 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68  simpler since th
37690 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69  ere is only a si
376a0 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20  ngle row.       
376b0 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20   ** of output.. 
376c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
376d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
376e0 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  oupBy==0 );.    
376f0 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c      resetAccumul
37700 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
37710 67 67 49 6e 66 6f 29 3b 0a 0a 20 20 20 20 20 20  ggInfo);..      
37720 20 20 2f 2a 20 49 66 20 74 68 69 73 20 71 75 65    /* If this que
37730 72 79 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ry is a candidat
37740 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61  e for the min/ma
37750 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  x optimization, 
37760 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  then.        ** 
37770 6d 69 6e 4d 61 78 46 6c 61 67 20 77 69 6c 6c 20  minMaxFlag will 
37780 68 61 76 65 20 62 65 65 6e 20 70 72 65 76 69 6f  have been previo
37790 75 73 6c 79 20 73 65 74 20 74 6f 20 65 69 74 68  usly set to eith
377a0 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 48  er.        ** WH
377b0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
377c0 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  or WHERE_ORDERBY
377d0 5f 4d 41 58 20 61 6e 64 20 70 4d 69 6e 4d 61 78  _MAX and pMinMax
377e0 4f 72 64 65 72 42 79 20 77 69 6c 6c 0a 20 20 20  OrderBy will.   
377f0 20 20 20 20 20 2a 2a 20 62 65 20 61 6e 20 61 70       ** be an ap
37800 70 72 6f 70 72 69 61 74 65 20 4f 52 44 45 52 20  propriate ORDER 
37810 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 66 6f  BY expression fo
37820 72 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  r the optimizati
37830 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  on..        */. 
37840 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d         assert( m
37850 69 6e 4d 61 78 46 6c 61 67 3d 3d 57 48 45 52 45  inMaxFlag==WHERE
37860 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20  _ORDERBY_NORMAL 
37870 7c 7c 20 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42  || pMinMaxOrderB
37880 79 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  y!=0 );.        
37890 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 4f  assert( pMinMaxO
378a0 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 4d 69  rderBy==0 || pMi
378b0 6e 4d 61 78 4f 72 64 65 72 42 79 2d 3e 6e 45 78  nMaxOrderBy->nEx
378c0 70 72 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20  pr==1 );..      
378d0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
378e0 70 50 61 72 73 65 2c 70 2c 28 22 57 68 65 72 65  pParse,p,("Where
378f0 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20 20 20  Begin\n"));.    
37900 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
37910 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
37920 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
37930 20 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78   pWhere, pMinMax
37940 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
37950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37960 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 6d              0, m
37970 69 6e 4d 61 78 46 6c 61 67 2c 20 30 29 3b 0a 20  inMaxFlag, 0);. 
37980 20 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66         if( pWInf
37990 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
379a0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
379b0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
379c0 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
379d0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
379e0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
379f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
37a00 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
37a10 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  nfo)>0 ){.      
37a20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
37a30 6f 74 6f 28 76 2c 20 73 71 6c 69 74 65 33 57 68  oto(v, sqlite3Wh
37a40 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57  ereBreakLabel(pW
37a50 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20 20  Info));.        
37a60 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
37a70 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78  , "%s() by index
37a80 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
37a90 20 20 20 28 6d 69 6e 4d 61 78 46 6c 61 67 3d 3d     (minMaxFlag==
37aa0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
37ab0 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29  N?"min":"max")))
37ac0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37ad0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
37ae0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
37af0 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
37b00 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
37b10 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
37b20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 53 6f      }..      sSo
37b30 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
37b40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
37b50 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
37b60 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45  , pHaving, addrE
37b70 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nd, SQLITE_JUMPI
37b80 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65  FNULL);.      se
37b90 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
37ba0 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30 2c 20  arse, p, -1, 0, 
37bb0 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
37bc0 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2c            pDest,
37bd0 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e   addrEnd, addrEn
37be0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  d);.    }.    sq
37bf0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
37c00 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64  Label(v, addrEnd
37c10 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65  );.    .  } /* e
37c20 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71  ndif aggregate q
37c30 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20 73  uery */..  if( s
37c40 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
37c50 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e  pe==WHERE_DISTIN
37c60 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b 0a  CT_UNORDERED ){.
37c70 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
37c80 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44 49  able(pParse, "DI
37c90 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a 20  STINCT");.  }.. 
37ca0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
37cb0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
37cc0 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64  se, then we need
37cd0 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73   to sort the res
37ce0 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65  ults.  ** and se
37cf0 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63  nd them to the c
37d00 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f  allback one by o
37d10 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ne..  */.  if( s
37d20 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
37d30 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70  .    explainTemp
37d40 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a 20 20  Table(pParse,.  
37d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d60 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3e     sSort.nOBSat>
37d70 30 20 3f 20 22 52 49 47 48 54 20 50 41 52 54 20  0 ? "RIGHT PART 
37d80 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22 4f 52  OF ORDER BY":"OR
37d90 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20 61 73  DER BY");.    as
37da0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 3d  sert( p->pEList=
37db0 3d 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 67  =pEList );.    g
37dc0 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
37dd0 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f 72  pParse, p, &sSor
37de0 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
37df0 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20  , pDest);.  }.. 
37e00 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
37e10 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79   skip this query
37e20 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
37e30 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
37e40 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  v, iEnd);..  /* 
37e50 54 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62  The SELECT has b
37e60 65 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74 68  een coded. If th
37e70 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ere is an error 
37e80 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72  in the Parse str
37e90 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65 74  ucture,.  ** set
37ea0 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
37eb0 20 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73 65   to 1. Otherwise
37ec0 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28 70   0. */.  rc = (p
37ed0 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b 0a  Parse->nErr>0);.
37ee0 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75  .  /* Control ju
37ef0 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61  mps to here if a
37f00 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
37f10 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72  ntered above, or
37f20 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65   upon.  ** succe
37f30 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20  ssful coding of 
37f40 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f  the SELECT..  */
37f50 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 73  .select_end:.  s
37f60 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
37f70 6c 65 74 65 28 64 62 2c 20 70 4d 69 6e 4d 61 78  lete(db, pMinMax
37f80 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69  OrderBy);.  sqli
37f90 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41  te3DbFree(db, sA
37fa0 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20  ggInfo.aCol);.  
37fb0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
37fc0 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
37fd0 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
37fe0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c  CE_ENABLED.  SEL
37ff0 45 43 54 54 52 41 43 45 28 30 78 31 2c 70 50 61  ECTTRACE(0x1,pPa
38000 72 73 65 2c 70 2c 28 22 65 6e 64 20 70 72 6f 63  rse,p,("end proc
38010 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 69  essing\n"));.  i
38020 66 28 20 28 73 71 6c 69 74 65 33 53 65 6c 65 63  f( (sqlite3Selec
38030 74 54 72 61 63 65 20 26 20 30 78 32 30 30 30 29  tTrace & 0x2000)
38040 21 3d 30 20 26 26 20 45 78 70 6c 61 69 6e 51 75  !=0 && ExplainQu
38050 65 72 79 50 6c 61 6e 50 61 72 65 6e 74 28 70 50  eryPlanParent(pP
38060 61 72 73 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  arse)==0 ){.    
38070 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
38080 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
38090 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 45 78 70    }.#endif.  Exp
380a0 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70  lainQueryPlanPop
380b0 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74 75  (pParse);.  retu
380c0 72 6e 20 72 63 3b 0a 7d 0a                       rn rc;.}.