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

Artifact bf9185f40cbb98a1342c0149f66dff3fbadf262081305519927523b4ec7b876e:


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 20 20 73 74 72 75 63 74 20 52 6f  ndif.  struct Ro
0c20: 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 44 65 66 65  wLoadInfo *pDefe
0c30: 72 72 65 64 52 6f 77 4c 6f 61 64 3b 20 20 2f 2a  rredRowLoad;  /*
0c40: 20 44 65 66 65 72 72 65 64 20 72 6f 77 20 6c 6f   Deferred row lo
0c50: 61 64 69 6e 67 20 69 6e 66 6f 20 6f 72 20 4e 55  ading info or NU
0c60: 4c 4c 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65  LL */.};.#define
0c70: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
0c80: 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a 20 55  ter  0x01   /* U
0c90: 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e  se SorterOpen in
0ca0: 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45 70 68  stead of OpenEph
0cb0: 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  emeral */../*.**
0cc0: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
0cd0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
0ce0: 65 63 74 20 73 74 72 75 63 74 75 72 65 2e 20 20  ect structure.  
0cf0: 44 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  Deallocate the s
0d00: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65  tructure.** itse
0d10: 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46 72 65 65  lf only if bFree
0d20: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
0d30: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0d40: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0d50: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
0d60: 20 62 46 72 65 65 29 7b 0a 20 20 77 68 69 6c 65   bFree){.  while
0d70: 28 20 70 20 29 7b 0a 20 20 20 20 53 65 6c 65 63  ( p ){.    Selec
0d80: 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
0d90: 50 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74  Prior;.    sqlit
0da0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
0db0: 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  (db, p->pEList);
0dc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
0dd0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
0de0: 3e 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69  >pSrc);.    sqli
0df0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
0e00: 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  , p->pWhere);.  
0e10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0e20: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
0e30: 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71  GroupBy);.    sq
0e40: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0e50: 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  db, p->pHaving);
0e60: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0e70: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0e80: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
0e90: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
0ea0: 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
0eb0: 29 3b 0a 20 20 20 20 69 66 28 20 4f 4b 5f 49 46  );.    if( OK_IF
0ec0: 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70 2d 3e  _ALWAYS_TRUE(p->
0ed0: 70 57 69 74 68 29 20 29 20 73 71 6c 69 74 65 33  pWith) ) sqlite3
0ee0: 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70  WithDelete(db, p
0ef0: 2d 3e 70 57 69 74 68 29 3b 0a 20 20 20 20 69 66  ->pWith);.    if
0f00: 28 20 62 46 72 65 65 20 29 20 73 71 6c 69 74 65  ( bFree ) sqlite
0f10: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
0f20: 3b 0a 20 20 20 20 70 20 3d 20 70 50 72 69 6f 72  ;.    p = pPrior
0f30: 3b 0a 20 20 20 20 62 46 72 65 65 20 3d 20 31 3b  ;.    bFree = 1;
0f40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
0f50: 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63  itialize a Selec
0f60: 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e  tDest structure.
0f70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0f80: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53  SelectDestInit(S
0f90: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
0fa0: 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74  , int eDest, int
0fb0: 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74   iParm){.  pDest
0fc0: 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44  ->eDest = (u8)eD
0fd0: 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53  est;.  pDest->iS
0fe0: 44 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20  DParm = iParm;. 
0ff0: 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74   pDest->zAffSdst
1000: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69   = 0;.  pDest->i
1010: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
1020: 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a  t->nSdst = 0;.}.
1030: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1040: 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74   a new Select st
1050: 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75  ructure and retu
1060: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1070: 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72  that.** structur
1080: 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71  e..*/.Select *sq
1090: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a  lite3SelectNew(.
10a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
10c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
10d0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
10e0: 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63  ,     /* which c
10f0: 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64  olumns to includ
1100: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
1110: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1120: 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  rc,        /* th
1130: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d  e FROM clause --
1140: 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f   which tables to
1150: 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20   scan */.  Expr 
1160: 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
1170: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
1180: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
1190: 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20  st *pGroupBy,   
11a0: 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  /* the GROUP BY 
11b0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
11c0: 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20   *pHaving,      
11d0: 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20    /* the HAVING 
11e0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
11f0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
1200: 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42    /* the ORDER B
1210: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 33  Y clause */.  u3
1220: 32 20 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20  2 selFlags,     
1230: 20 20 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61      /* Flag para
1240: 6d 65 74 65 72 73 2c 20 73 75 63 68 20 61 73 20  meters, such as 
1250: 53 46 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20  SF_Distinct */. 
1260: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 20 20   Expr *pLimit   
1270: 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20         /* LIMIT 
1280: 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61  value.  NULL mea
1290: 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 29  ns not used */.)
12a0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
12b0: 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64  ;.  Select stand
12c0: 69 6e 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  in;.  pNew = sql
12d0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
12e0: 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  N(pParse->db, si
12f0: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
1300: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1310: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1320: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1330: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
1340: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d   = &standin;.  }
1350: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
1360: 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d   ){.    pEList =
1370: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1380: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
1390: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13c0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 54 4b 5f 41  (pParse->db,TK_A
13d0: 53 54 45 52 49 53 4b 2c 30 29 29 3b 0a 20 20 7d  STERISK,0));.  }
13e0: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
13f0: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77  = pEList;.  pNew
1400: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
1410: 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61  ;.  pNew->selFla
1420: 67 73 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20  gs = selFlags;. 
1430: 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20   pNew->iLimit = 
1440: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  0;.  pNew->iOffs
1450: 65 74 20 3d 20 30 3b 0a 23 69 66 20 53 45 4c 45  et = 0;.#if SELE
1460: 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
1470: 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65    pNew->zSelName
1480: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  [0] = 0;.#endif.
1490: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
14a0: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
14b0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
14c0: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
14d0: 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d  ew->nSelectRow =
14e0: 20 30 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d   0;.  if( pSrc==
14f0: 30 20 29 20 70 53 72 63 20 3d 20 73 71 6c 69 74  0 ) pSrc = sqlit
1500: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
1510: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
1520: 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65  f(*pSrc));.  pNe
1530: 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  w->pSrc = pSrc;.
1540: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
1550: 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d   pWhere;.  pNew-
1560: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
1570: 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  upBy;.  pNew->pH
1580: 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b  aving = pHaving;
1590: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
15a0: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
15b0: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30  pNew->pPrior = 0
15c0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
15d0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  = 0;.  pNew->pLi
15e0: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
15f0: 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b  pNew->pWith = 0;
1600: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
1610: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1620: 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c  ) {.    clearSel
1630: 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ect(pParse->db, 
1640: 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26 73 74 61  pNew, pNew!=&sta
1650: 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e 65 77 20  ndin);.    pNew 
1660: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1670: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
1680: 70 53 72 63 21 3d 30 20 7c 7c 20 70 50 61 72 73  pSrc!=0 || pPars
1690: 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20 20 7d  e->nErr>0 );.  }
16a0: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 21  .  assert( pNew!
16b0: 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20 20 72  =&standin );.  r
16c0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 23  eturn pNew;.}..#
16d0: 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
16e0: 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 53 65 74  NABLED./*.** Set
16f0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 53   the name of a S
1700: 65 6c 65 63 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a  elect object.*/.
1710: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
1720: 63 74 53 65 74 4e 61 6d 65 28 53 65 6c 65 63 74  ctSetName(Select
1730: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
1740: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 70  *zName){.  if( p
1750: 20 26 26 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20   && zName ){.   
1760: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1770: 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a 53 65 6c  f(sizeof(p->zSel
1780: 4e 61 6d 65 29 2c 20 70 2d 3e 7a 53 65 6c 4e 61  Name), p->zSelNa
1790: 6d 65 2c 20 22 25 73 22 2c 20 7a 4e 61 6d 65 29  me, "%s", zName)
17a0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
17b0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
17c0: 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20 73  e given Select s
17d0: 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c  tructure and all
17e0: 20 6f 66 20 69 74 73 20 73 75 62 73 74 72 75 63   of its substruc
17f0: 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tures..*/.void s
1800: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1810: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
1820: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66  Select *p){.  if
1830: 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54  ( OK_IF_ALWAYS_T
1840: 52 55 45 28 70 29 20 29 20 63 6c 65 61 72 53 65  RUE(p) ) clearSe
1850: 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29 3b 0a  lect(db, p, 1);.
1860: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1870: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1880: 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
1890: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
18a0: 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73  a compound..*/.s
18b0: 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66 69  tatic Select *fi
18c0: 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c 65  ndRightmost(Sele
18d0: 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  ct *p){.  while(
18e0: 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d 20   p->pNext ) p = 
18f0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75  p->pNext;.  retu
1900: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
1910: 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e  iven 1 to 3 iden
1920: 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69 6e  tifiers precedin
1930: 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f  g the JOIN keywo
1940: 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68  rd, determine th
1950: 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69  e.** type of joi
1960: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
1970: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74  teger constant t
1980: 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68  hat expresses th
1990: 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65  at type.** in te
19a0: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  rms of the follo
19b0: 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a  wing bit values:
19c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e  .**.**     JT_IN
19d0: 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52  NER.**     JT_CR
19e0: 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55  OSS.**     JT_OU
19f0: 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41  TER.**     JT_NA
1a00: 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f  TURAL.**     JT_
1a10: 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52  LEFT.**     JT_R
1a20: 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c  IGHT.**.** A ful
1a30: 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20  l outer join is 
1a40: 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  the combination 
1a50: 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a  of JT_LEFT and J
1a60: 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49  T_RIGHT..**.** I
1a70: 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20  f an illegal or 
1a80: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
1a90: 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74   type is seen, t
1aa0: 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
1ab0: 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c  .** a join type,
1ac0: 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f   but put an erro
1ad0: 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  r in the pParse 
1ae0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
1af0: 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70  t sqlite3JoinTyp
1b00: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1b10: 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65   Token *pA, Toke
1b20: 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43  n *pB, Token *pC
1b30: 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70  ){.  int jointyp
1b40: 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a  e = 0;.  Token *
1b50: 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65  apAll[3];.  Toke
1b60: 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20  n *p;.          
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b80: 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37     /*   01234567
1b90: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
1ba0: 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20  456789 123 */.  
1bb0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
1bc0: 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22  r zKeyText[] = "
1bd0: 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69  naturaleftouteri
1be0: 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73  ghtfullinnercros
1bf0: 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  s";.  static con
1c00: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
1c10: 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20  u8 i;        /* 
1c20: 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79  Beginning of key
1c30: 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65  word text in zKe
1c40: 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75  yText[] */.    u
1c50: 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c  8 nChar;    /* L
1c60: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79  ength of the key
1c70: 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74 65  word in characte
1c80: 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64  rs */.    u8 cod
1c90: 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74  e;     /* Join t
1ca0: 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20  ype mask */.  } 
1cb0: 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20  aKeyword[] = {. 
1cc0: 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f     /* natural */
1cd0: 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54   { 0,  7, JT_NAT
1ce0: 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20 20  URAL            
1cf0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65      },.    /* le
1d00: 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34  ft    */ { 6,  4
1d10: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
1d20: 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ER          },. 
1d30: 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f     /* outer   */
1d40: 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54   { 10, 5, JT_OUT
1d50: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1d60: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69      },.    /* ri
1d70: 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35  ght   */ { 14, 5
1d80: 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  , JT_RIGHT|JT_OU
1d90: 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  TER         },. 
1da0: 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f     /* full    */
1db0: 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46   { 19, 4, JT_LEF
1dc0: 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  T|JT_RIGHT|JT_OU
1dd0: 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e  TER },.    /* in
1de0: 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35  ner   */ { 23, 5
1df0: 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20  , JT_INNER      
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1e10: 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f     /* cross   */
1e20: 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 28, 5, JT_INN
1e30: 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20  ER|JT_CROSS     
1e40: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e      },.  };.  in
1e50: 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b  t i, j;.  apAll[
1e60: 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c  0] = pA;.  apAll
1e70: 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c  [1] = pB;.  apAl
1e80: 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72  l[2] = pC;.  for
1e90: 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41  (i=0; i<3 && apA
1ea0: 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll[i]; i++){.   
1eb0: 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20   p = apAll[i];. 
1ec0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72     for(j=0; j<Ar
1ed0: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
1ee0: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); j++){.      i
1ef0: 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72  f( p->n==aKeywor
1f00: 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20  d[j].nChar .    
1f10: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
1f20: 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
1f30: 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b  p->z, &zKeyText[
1f40: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20  aKeyword[j].i], 
1f50: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
1f60: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
1f70: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65  aKeyword[j].code
1f80: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1f90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1fa0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
1fb0: 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d  0 || j==1 || j==
1fc0: 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d  2 || j==3 || j==
1fd0: 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d  4 || j==5 || j==
1fe0: 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d  6 );.    if( j>=
1ff0: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
2000: 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69  rd) ){.      joi
2010: 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f  ntype |= JT_ERRO
2020: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
2030: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a      }.  }.  if(.
2040: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
2050: 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55   (JT_INNER|JT_OU
2060: 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52  TER))==(JT_INNER
2070: 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20  |JT_OUTER) ||.  
2080: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a     (jointype & J
2090: 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b  T_ERROR)!=0.  ){
20a0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
20b0: 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20  *zSp = " ";.    
20c0: 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b  assert( pB!=0 );
20d0: 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29  .    if( pC==0 )
20e0: 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73  { zSp++; }.    s
20f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2100: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
2110: 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a  or unsupported j
2120: 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20  oin type: ".    
2130: 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c 20     "%T %T%s%T", 
2140: 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29  pA, pB, zSp, pC)
2150: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
2160: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
2170: 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65  se if( (jointype
2180: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
2190: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f  .         && (jo
21a0: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
21b0: 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54  T|JT_RIGHT))!=JT
21c0: 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c  _LEFT ){.    sql
21d0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
21e0: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47  rse, .      "RIG
21f0: 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45  HT and FULL OUTE
2200: 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20  R JOINs are not 
2210: 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72  currently suppor
2220: 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74  ted");.    joint
2230: 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a  ype = JT_INNER;.
2240: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69    }.  return joi
2250: 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ntype;.}../*.** 
2260: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
2270: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
2280: 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  a table.  Return
2290: 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d   -1 if the colum
22a0: 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74  n.** is not cont
22b0: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62  ained in the tab
22c0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
22d0: 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61  t columnIndex(Ta
22e0: 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74  ble *pTab, const
22f0: 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20   char *zCol){.  
2300: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
2310: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
2320: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
2330: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61  lite3StrICmp(pTa
2340: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  b->aCol[i].zName
2350: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74  , zCol)==0 ) ret
2360: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
2370: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
2380: 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72 73   Search the firs
2390: 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53  t N tables in pS
23a0: 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  rc, from left to
23b0: 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20   right, looking 
23c0: 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74  for a.** table t
23d0: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e  hat has a column
23e0: 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a   named zCol.  .*
23f0: 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c  *.** When found,
2400: 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20   set *piTab and 
2410: 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61  *piCol to the ta
2420: 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f  ble index and co
2430: 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66  lumn index.** of
2440: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f   the matching co
2450: 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20  lumn and return 
2460: 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  TRUE..**.** If n
2470: 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ot found, return
2480: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
2490: 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f  c int tableAndCo
24a0: 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63  lumnIndex(.  Src
24b0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
24c0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61    /* Array of ta
24d0: 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a  bles to search *
24e0: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
24f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2500: 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
2510: 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61  pSrc->a[] to sea
2520: 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  rch */.  const c
2530: 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a  har *zCol,    /*
2540: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
2550: 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  umn we are looki
2560: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ng for */.  int 
2570: 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  *piTab,         
2580: 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20   /* Write index 
2590: 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72  of pSrc->a[] her
25a0: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f  e */.  int *piCo
25b0: 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l           /* W
25c0: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
25d0: 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54  rc->a[*piTab].pT
25e0: 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20  ab->aCol[] here 
25f0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2610: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
2620: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20   tables in pSrc 
2630: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
2640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2650: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74  ex of column mat
2660: 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20  ching zCol */.. 
2670: 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62 3d   assert( (piTab=
2680: 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20  =0)==(piCol==0) 
2690: 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e  );  /* Both or n
26a0: 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20  either are NULL 
26b0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
26c0: 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f  N; i++){.    iCo
26d0: 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  l = columnIndex(
26e0: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c  pSrc->a[i].pTab,
26f0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20   zCol);.    if( 
2700: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
2710: 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20   if( piTab ){.  
2720: 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69        *piTab = i
2730: 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c  ;.        *piCol
2740: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d   = iCol;.      }
2750: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2760: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2770: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2780: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2790: 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65 72   used to add ter
27a0: 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f  ms implied by JO
27b0: 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65  IN syntax to the
27c0: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
27d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61   expression of a
27e0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
27f0: 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c  t. The new term,
2800: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44   which.** is AND
2810: 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69 73  ed with the exis
2820: 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73  ting WHERE claus
2830: 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  e, is of the for
2840: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62  m:.**.**    (tab
2850: 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f  1.col1 = tab2.co
2860: 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  l2).**.** where 
2870: 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72 63  tab1 is the iSrc
2880: 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63  'th table in Src
2890: 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74 61  List pSrc and ta
28a0: 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69  b2 is the .** (i
28b0: 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d  Src+1)'th. Colum
28c0: 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e  n col1 is column
28d0: 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62   iColLeft of tab
28e0: 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a  1, and col2 is.*
28f0: 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67  * column iColRig
2900: 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73  ht of tab2..*/.s
2910: 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68  tatic void addWh
2920: 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ereTerm(.  Parse
2930: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2950: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2960: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
2970: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2980: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
2990: 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61  bles in FROM cla
29a0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
29b0: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
29c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
29d0: 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65  x of first table
29e0: 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63   to join in pSrc
29f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65   */.  int iColLe
2a00: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
2a10: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2a20: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73  f column in firs
2a30: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
2a40: 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20 20   iRight,        
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a60: 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20  Index of second 
2a70: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f  table in pSrc */
2a80: 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74  .  int iColRight
2a90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2aa0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
2ab0: 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20  olumn in second 
2ac0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
2ad0: 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20  sOuterJoin,     
2ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2af0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
2b00: 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20   OUTER join */. 
2b10: 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20   Expr **ppWhere 
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20   /* IN/OUT: The 
2b40: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
2b50: 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  add to */.){.  s
2b60: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
2b70: 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
2b80: 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45  *pE1;.  Expr *pE
2b90: 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a  2;.  Expr *pEq;.
2ba0: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66 74  .  assert( iLeft
2bb0: 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  <iRight );.  ass
2bc0: 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e  ert( pSrc->nSrc>
2bd0: 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65  iRight );.  asse
2be0: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66  rt( pSrc->a[iLef
2bf0: 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73  t].pTab );.  ass
2c00: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69  ert( pSrc->a[iRi
2c10: 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20  ght].pTab );..  
2c20: 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65  pE1 = sqlite3Cre
2c30: 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62  ateColumnExpr(db
2c40: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
2c50: 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20  ColLeft);.  pE2 
2c60: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43  = sqlite3CreateC
2c70: 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53  olumnExpr(db, pS
2c80: 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c  rc, iRight, iCol
2c90: 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d  Right);..  pEq =
2ca0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2cb0: 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31  arse, TK_EQ, pE1
2cc0: 2c 20 70 45 32 29 3b 0a 20 20 69 66 28 20 70 45  , pE2);.  if( pE
2cd0: 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e  q && isOuterJoin
2ce0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
2cf0: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
2d00: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
2d10: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2d20: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
2d30: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
2d40: 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70  uced) );.    Exp
2d50: 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
2d60: 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  pEq, EP_NoReduce
2d70: 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69 67  );.    pEq->iRig
2d80: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69  htJoinTable = (i
2d90: 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a  16)pE2->iTable;.
2da0: 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20 3d    }.  *ppWhere =
2db0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
2dc0: 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45  db, *ppWhere, pE
2dd0: 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  q);.}../*.** Set
2de0: 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   the EP_FromJoin
2df0: 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c   property on all
2e00: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69   terms of the gi
2e10: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ven expression..
2e20: 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45  ** And set the E
2e30: 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
2e40: 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f  ble to iTable fo
2e50: 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  r every term in 
2e60: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
2e70: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f  n..**.** The EP_
2e80: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
2e90: 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72  y is used on ter
2ea0: 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  ms of an express
2eb0: 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74  ion to tell.** t
2ec0: 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  he LEFT OUTER JO
2ed0: 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  IN processing lo
2ee0: 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65  gic that this te
2ef0: 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  rm is part of th
2f00: 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69  e.** join restri
2f10: 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20  ction specified 
2f20: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
2f30: 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f  NG clause and no
2f40: 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74  t a part.** of t
2f50: 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20  he more general 
2f60: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54  WHERE clause.  T
2f70: 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d  hese terms are m
2f80: 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65  oved over to the
2f90: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
2fa0: 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f   during join pro
2fb0: 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e  cessing but we n
2fc0: 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
2fd0: 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69  that they.** ori
2fe0: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
2ff0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
3000: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70  e..**.** The Exp
3010: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
3020: 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52  e tells the WHER
3030: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
3040: 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ing that the.** 
3050: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e  expression depen
3060: 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67  ds on table iRig
3070: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e  htJoinTable even
3080: 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69   if that table i
3090: 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69  s not.** explici
30a0: 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e  tly mentioned in
30b0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
30c0: 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69    That informati
30d0: 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20  on is needed.** 
30e0: 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74  for cases like t
30f0: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  his:.**.**    SE
3100: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
3110: 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
3120: 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e  1.a=t2.b AND t1.
3130: 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68  x=5.**.** The wh
3140: 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73  ere clause needs
3150: 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61   to defer the ha
3160: 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31  ndling of the t1
3170: 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74  .x=5.** term unt
3180: 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20  il after the t2 
3190: 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e  loop of the join
31a0: 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20  .  In that way, 
31b0: 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77  a.** NULL t2 row
31c0: 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65   will be inserte
31d0: 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21  d whenever t1.x!
31e0: 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f  =5.  If we do no
31f0: 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68  t.** defer the h
3200: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d  andling of t1.x=
3210: 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72  5, it will be pr
3220: 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74  ocessed immediat
3230: 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65  ely.** after the
3240: 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77   t1 loop and row
3250: 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77  s with t1.x!=5 w
3260: 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72  ill never appear
3270: 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75   in.** the outpu
3280: 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f  t, which is inco
3290: 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrect..*/.static
32a0: 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70   void setJoinExp
32b0: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  r(Expr *p, int i
32c0: 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28  Table){.  while(
32d0: 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65   p ){.    ExprSe
32e0: 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  tProperty(p, EP_
32f0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
3300: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
3310: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
3320: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
3330: 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53  ed) );.    ExprS
3340: 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c  etVVAProperty(p,
3350: 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
3360: 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e     p->iRightJoin
3370: 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61  Table = (i16)iTa
3380: 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ble;.    if( p->
3390: 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
33a0: 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  && p->x.pList ){
33b0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
33c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
33d0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
33e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
33f0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78  setJoinExpr(p->x
3400: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
3410: 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr, iTable);.   
3420: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
3430: 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c  etJoinExpr(p->pL
3440: 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  eft, iTable);.  
3450: 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b    p = p->pRight;
3460: 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 20 55 6e 64 6f  .  } .}../* Undo
3470: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 73 65 74   the work of set
3480: 4a 6f 69 6e 45 78 70 72 28 29 2e 20 20 49 6e 20  JoinExpr().  In 
3490: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
34a0: 72 65 65 20 70 2c 20 63 6f 6e 76 65 72 74 20 65  ree p, convert e
34b0: 76 65 72 79 0a 2a 2a 20 74 65 72 6d 20 74 68 61  very.** term tha
34c0: 74 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  t is marked with
34d0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 61 6e 64   EP_FromJoin and
34e0: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
34f0: 3d 3d 69 54 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a  ==iTable into.**
3500: 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 65 72   an ordinary ter
3510: 6d 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65  m that omits the
3520: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 6d 61 72   EP_FromJoin mar
3530: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 68 61  k..**.** This ha
3540: 70 70 65 6e 73 20 77 68 65 6e 20 61 20 4c 45 46  ppens when a LEF
3550: 54 20 4a 4f 49 4e 20 69 73 20 73 69 6d 70 6c 69  T JOIN is simpli
3560: 66 69 65 64 20 69 6e 74 6f 20 61 6e 20 6f 72 64  fied into an ord
3570: 69 6e 61 72 79 20 4a 4f 49 4e 2e 0a 2a 2f 0a 73  inary JOIN..*/.s
3580: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 73 65 74  tatic void unset
3590: 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70  JoinExpr(Expr *p
35a0: 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20  , int iTable){. 
35b0: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
35c0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
35d0: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
35e0: 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 28 69 54  oin).     && (iT
35f0: 61 62 6c 65 3c 30 20 7c 7c 20 70 2d 3e 69 52 69  able<0 || p->iRi
3600: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54  ghtJoinTable==iT
3610: 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 45  able) ){.      E
3620: 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79  xprClearProperty
3630: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
3640: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3650: 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  p->op==TK_FUNCTI
3660: 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74  ON && p->x.pList
3670: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
3680: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
3690: 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  i<p->x.pList->nE
36a0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
36b0: 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72     unsetJoinExpr
36c0: 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69  (p->x.pList->a[i
36d0: 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 29  ].pExpr, iTable)
36e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36f0: 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70      unsetJoinExp
3700: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  r(p->pLeft, iTab
3710: 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  le);.    p = p->
3720: 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a  pRight;.  } .}..
3730: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3740: 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65  ne processes the
3750: 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f   join informatio
3760: 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73  n for a SELECT s
3770: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20  tatement..** ON 
3780: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
3790: 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  s are converted 
37a0: 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73  into extra terms
37b0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
37c0: 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c  ause..** NATURAL
37d0: 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61   joins also crea
37e0: 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63  te extra WHERE c
37f0: 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a  lause terms..**.
3800: 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20  ** The terms of 
3810: 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72  a FROM clause ar
3820: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
3830: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73  he Select.pSrc s
3840: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65  tructure..** The
3850: 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65   left most table
3860: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e   is the first en
3870: 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53  try in Select.pS
3880: 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d  rc.  The right-m
3890: 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  ost.** table is 
38a0: 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20  the last entry. 
38b0: 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   The join operat
38c0: 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68  or is held in th
38d0: 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68  e entry to.** th
38e0: 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e  e left.  Thus en
38f0: 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74  try 0 contains t
3900: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
3910: 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65   for the join be
3920: 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73  tween.** entries
3930: 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f   0 and 1.  Any O
3940: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
3950: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
3960: 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a  th the join are.
3970: 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64  ** also attached
3980: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74   to the left ent
3990: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
39a0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
39b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
39c0: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  ors encountered.
39d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
39e0: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
39f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
3a00: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72  Select *p){.  Sr
3a10: 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3a30: 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   All tables in t
3a40: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
3a50: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
3a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a70: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
3a80: 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ters */.  struct
3a90: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
3aa0: 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66  Left;     /* Lef
3ab0: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
3ac0: 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ined */.  struct
3ad0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
3ae0: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67  Right;    /* Rig
3af0: 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ht table being j
3b00: 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63  oined */..  pSrc
3b10: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c   = p->pSrc;.  pL
3b20: 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30  eft = &pSrc->a[0
3b30: 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70  ];.  pRight = &p
3b40: 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69  Left[1];.  for(i
3b50: 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
3b60: 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b  -1; i++, pRight+
3b70: 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20  +, pLeft++){.   
3b80: 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54 61   Table *pRightTa
3b90: 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61 62  b = pRight->pTab
3ba0: 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74 65  ;.    int isOute
3bb0: 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56 45  r;..    if( NEVE
3bc0: 52 28 70 4c 65 66 74 2d 3e 70 54 61 62 3d 3d 30  R(pLeft->pTab==0
3bd0: 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30   || pRightTab==0
3be0: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
3bf0: 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69    isOuter = (pRi
3c00: 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  ght->fg.jointype
3c10: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b   & JT_OUTER)!=0;
3c20: 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68  ..    /* When th
3c30: 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
3c40: 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64  d is present, ad
3c50: 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  d WHERE clause t
3c60: 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20  erms for.    ** 
3c70: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61  every column tha
3c80: 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  t the two tables
3c90: 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e   have in common.
3ca0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
3cb0: 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74  pRight->fg.joint
3cc0: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
3cd0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52   ){.      if( pR
3ce0: 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69  ight->pOn || pRi
3cf0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
3d00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3d10: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3d20: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d  a NATURAL join m
3d30: 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20  ay not have ".  
3d40: 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20           "an ON 
3d50: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22  or USING clause"
3d60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
3d70: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
3d80: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
3d90: 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c  <pRightTab->nCol
3da0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
3db0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f  char *zName;   /
3dc0: 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e  * Name of column
3dd0: 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   in the right ta
3de0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ble */.        i
3df0: 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a  nt iLeft;     /*
3e00: 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74   Matching left t
3e10: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
3e20: 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f  int iLeftCol;  /
3e30: 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  * Matching colum
3e40: 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61  n in the left ta
3e50: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ble */..        
3e60: 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61  zName = pRightTa
3e70: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
3e80: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 61  ;.        if( ta
3e90: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
3ea0: 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61  x(pSrc, i+1, zNa
3eb0: 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65  me, &iLeft, &iLe
3ec0: 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  ftCol) ){.      
3ed0: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
3ee0: 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69  (pParse, pSrc, i
3ef0: 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20  Left, iLeftCol, 
3f00: 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20  i+1, j,.        
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
3f20: 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65  sOuter, &p->pWhe
3f30: 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  re);.        }. 
3f40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
3f50: 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f    /* Disallow bo
3f60: 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  th ON and USING 
3f70: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
3f80: 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a  ame join.    */.
3f90: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
3fa0: 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70  pOn && pRight->p
3fb0: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  Using ){.      s
3fc0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3fd0: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68  Parse, "cannot h
3fe0: 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  ave both ON and 
3ff0: 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20  USING ".        
4000: 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20  "clauses in the 
4010: 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20  same join");.   
4020: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
4030: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74   }..    /* Add t
4040: 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20  he ON clause to 
4050: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
4060: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e  HERE clause, con
4070: 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a  nected by.    **
4080: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
4090: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
40a0: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a   pRight->pOn ){.
40b0: 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74 65        if( isOute
40c0: 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  r ) setJoinExpr(
40d0: 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69  pRight->pOn, pRi
40e0: 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  ght->iCursor);. 
40f0: 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d       p->pWhere =
4100: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
4110: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
4120: 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70  Where, pRight->p
4130: 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68  On);.      pRigh
4140: 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20  t->pOn = 0;.    
4150: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
4160: 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20   extra terms on 
4170: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4180: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
4190: 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e   named.    ** in
41a0: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
41b0: 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20  e.  Example: If 
41c0: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74  the two tables t
41d0: 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20  o be joined are 
41e0: 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20  .    ** A and B 
41f0: 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c  and the USING cl
4200: 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c  ause names X, Y,
4210: 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64   and Z, then add
4220: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20   this.    ** to 
4230: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4240: 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44  :    A.X=B.X AND
4250: 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a   A.Y=B.Y AND A.Z
4260: 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f  =B.Z.    ** Repo
4270: 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61  rt an error if a
4280: 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f  ny column mentio
4290: 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47  ned in the USING
42a0: 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a   clause is.    *
42b0: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  * not contained 
42c0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74  in both tables t
42d0: 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20  o be joined..   
42e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
42f0: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
4300: 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73      IdList *pLis
4310: 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69  t = pRight->pUsi
4320: 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ng;.      for(j=
4330: 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; j<pList->nId;
4340: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
4350: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
4360: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
4370: 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47  erm in the USING
4380: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
4390: 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20     int iLeft;   
43a0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20      /* Table on 
43b0: 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61  the left with ma
43c0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61  tching column na
43d0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  me */.        in
43e0: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f  t iLeftCol;    /
43f0: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
4400: 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  of matching colu
4410: 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  mn on the left *
4420: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
4430: 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f  ightCol;   /* Co
4440: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d  lumn number of m
4450: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f  atching column o
4460: 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a  n the right */..
4470: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
4480: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  pList->a[j].zNam
4490: 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67 68  e;.        iRigh
44a0: 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64  tCol = columnInd
44b0: 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e  ex(pRightTab, zN
44c0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
44d0: 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20  ( iRightCol<0.  
44e0: 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65         || !table
44f0: 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
4500: 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c  Src, i+1, zName,
4510: 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43   &iLeft, &iLeftC
4520: 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ol).        ){. 
4530: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4540: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4550: 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73   "cannot join us
4560: 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20  ing column %s - 
4570: 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20  column ".       
4580: 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e       "not presen
4590: 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  t in both tables
45a0: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
45b0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
45c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
45d0: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50   addWhereTerm(pP
45e0: 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66  arse, pSrc, iLef
45f0: 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31  t, iLeftCol, i+1
4600: 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20  , iRightCol,.   
4610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4620: 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70    isOuter, &p->p
4630: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Where);.      }.
4640: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4650: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  rn 0;.}../* Forw
4660: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
4670: 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20  .static KeyInfo 
4680: 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  *keyInfoFromExpr
4690: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
46a0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
46b0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
46c0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
46d0: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72  List,     /* For
46e0: 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62  m the KeyInfo ob
46f0: 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45  ject from this E
4700: 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  xprList */.  int
4710: 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20   iStart,        
4720: 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20    /* Begin with 
4730: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70  this column of p
4740: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  List */.  int nE
4750: 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 2f  xtra           /
4760: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
4770: 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f  extra columns to
4780: 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a   the end */.);..
4790: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
47a0: 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
47b0: 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61 74 69   holds informati
47c0: 6f 6e 20 28 62 65 79 6f 6e 64 20 70 50 61 72 73  on (beyond pPars
47d0: 65 20 61 6e 64 20 70 53 65 6c 65 63 74 29 0a 2a  e and pSelect).*
47e0: 2a 20 6e 65 65 64 65 64 20 74 6f 20 6c 6f 61 64  * needed to load
47f0: 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74   the next result
4800: 20 72 6f 77 20 74 68 61 74 20 69 73 20 74 6f 20   row that is to 
4810: 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
4820: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74 79 70 65 64  sorter..*/.typed
4830: 65 66 20 73 74 72 75 63 74 20 52 6f 77 4c 6f 61  ef struct RowLoa
4840: 64 49 6e 66 6f 20 52 6f 77 4c 6f 61 64 49 6e 66  dInfo RowLoadInf
4850: 6f 3b 0a 73 74 72 75 63 74 20 52 6f 77 4c 6f 61  o;.struct RowLoa
4860: 64 49 6e 66 6f 20 7b 0a 20 20 69 6e 74 20 72 65  dInfo {.  int re
4870: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
4880: 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
4890: 72 65 73 75 6c 74 73 20 69 6e 20 61 72 72 61 79  results in array
48a0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 68 65   of registers he
48b0: 72 65 20 2a 2f 0a 20 20 75 38 20 65 63 65 6c 46  re */.  u8 ecelF
48c0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
48d0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 61 72 67       /* Flag arg
48e0: 75 6d 65 6e 74 20 74 6f 20 45 78 70 72 43 6f 64  ument to ExprCod
48f0: 65 45 78 70 72 4c 69 73 74 28 29 20 2a 2f 0a 23  eExprList() */.#
4900: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4910: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
4920: 45 4e 43 45 53 0a 20 20 45 78 70 72 4c 69 73 74  ENCES.  ExprList
4930: 20 2a 70 45 78 74 72 61 3b 20 20 20 20 20 20 20   *pExtra;       
4940: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 63 6f       /* Extra co
4950: 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 62 79 20  lumns needed by 
4960: 73 6f 72 74 65 72 20 72 65 66 73 20 2a 2f 0a 20  sorter refs */. 
4970: 20 69 6e 74 20 72 65 67 45 78 74 72 61 52 65 73   int regExtraRes
4980: 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ult;          /*
4990: 20 57 68 65 72 65 20 74 6f 20 6c 6f 61 64 20 74   Where to load t
49a0: 68 65 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73  he extra columns
49b0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
49c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
49d0: 65 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20  e does the work 
49e0: 6f 66 20 6c 6f 61 64 69 6e 67 20 71 75 65 72 79  of loading query
49f0: 20 64 61 74 61 20 69 6e 74 6f 20 61 6e 20 61 72   data into an ar
4a00: 72 61 79 20 6f 66 0a 2a 2a 20 72 65 67 69 73 74  ray of.** regist
4a10: 65 72 73 20 73 6f 20 74 68 61 74 20 69 74 20 63  ers so that it c
4a20: 61 6e 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  an be added to t
4a30: 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74  he sorter..*/.st
4a40: 61 74 69 63 20 76 6f 69 64 20 69 6e 6e 65 72 4c  atic void innerL
4a50: 6f 6f 70 4c 6f 61 64 52 6f 77 28 0a 20 20 50 61  oopLoadRow(.  Pa
4a60: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
4a80: 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
4a90: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  truction */.  Se
4aa0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
4ab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4ac0: 71 75 65 72 79 20 62 65 69 6e 67 20 63 6f 64 65  query being code
4ad0: 64 20 2a 2f 0a 20 20 52 6f 77 4c 6f 61 64 49 6e  d */.  RowLoadIn
4ae0: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
4af0: 20 20 2f 2a 20 49 6e 66 6f 20 6e 65 65 64 65 64    /* Info needed
4b00: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
4b10: 20 72 6f 77 20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a   row load */.){.
4b20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
4b30: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
4b40: 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  , pSelect->pELis
4b50: 74 2c 20 70 49 6e 66 6f 2d 3e 72 65 67 52 65 73  t, pInfo->regRes
4b60: 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ult,.           
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4b80: 2c 20 70 49 6e 66 6f 2d 3e 65 63 65 6c 46 6c 61  , pInfo->ecelFla
4b90: 67 73 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  gs);.#ifdef SQLI
4ba0: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
4bb0: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 69 66  _REFERENCES.  if
4bc0: 28 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72 61 20  ( pInfo->pExtra 
4bd0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
4be0: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
4bf0: 50 61 72 73 65 2c 20 70 49 6e 66 6f 2d 3e 70 45  Parse, pInfo->pE
4c00: 78 74 72 61 2c 20 70 49 6e 66 6f 2d 3e 72 65 67  xtra, pInfo->reg
4c10: 45 78 74 72 61 52 65 73 75 6c 74 2c 20 30 2c 20  ExtraResult, 0, 
4c20: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  0);.    sqlite3E
4c30: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
4c40: 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 66 6f 2d  arse->db, pInfo-
4c50: 3e 70 45 78 74 72 61 29 3b 0a 20 20 7d 0a 23 65  >pExtra);.  }.#e
4c60: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ndif.}../*.** Co
4c70: 64 65 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  de the OP_MakeRe
4c80: 63 6f 72 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  cord instruction
4c90: 20 74 68 61 74 20 67 65 6e 65 72 61 74 65 73 20   that generates 
4ca0: 74 68 65 20 65 6e 74 72 79 20 74 6f 20 62 65 0a  the entry to be.
4cb0: 2a 2a 20 61 64 64 65 64 20 69 6e 74 6f 20 74 68  ** added into th
4cc0: 65 20 73 6f 72 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  e sorter..**.** 
4cd0: 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
4ce0: 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  ter in which the
4cf0: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
4d00: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
4d10: 20 6d 61 6b 65 53 6f 72 74 65 72 52 65 63 6f 72   makeSorterRecor
4d20: 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  d(.  Parse *pPar
4d30: 73 65 2c 0a 20 20 53 6f 72 74 43 74 78 20 2a 70  se,.  SortCtx *p
4d40: 53 6f 72 74 2c 0a 20 20 53 65 6c 65 63 74 20 2a  Sort,.  Select *
4d50: 70 53 65 6c 65 63 74 2c 0a 20 20 69 6e 74 20 72  pSelect,.  int r
4d60: 65 67 42 61 73 65 2c 0a 20 20 69 6e 74 20 6e 42  egBase,.  int nB
4d70: 61 73 65 0a 29 7b 0a 20 20 69 6e 74 20 6e 4f 42  ase.){.  int nOB
4d80: 53 61 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42  Sat = pSort->nOB
4d90: 53 61 74 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Sat;.  Vdbe *v =
4da0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
4db0: 20 20 69 6e 74 20 72 65 67 4f 75 74 20 3d 20 2b    int regOut = +
4dc0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
4dd0: 20 69 66 28 20 70 53 6f 72 74 2d 3e 70 44 65 66   if( pSort->pDef
4de0: 65 72 72 65 64 52 6f 77 4c 6f 61 64 20 29 7b 0a  erredRowLoad ){.
4df0: 20 20 20 20 69 6e 6e 65 72 4c 6f 6f 70 4c 6f 61      innerLoopLoa
4e00: 64 52 6f 77 28 70 50 61 72 73 65 2c 20 70 53 65  dRow(pParse, pSe
4e10: 6c 65 63 74 2c 20 70 53 6f 72 74 2d 3e 70 44 65  lect, pSort->pDe
4e20: 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 29 3b 0a  ferredRowLoad);.
4e30: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
4e40: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
4e50: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73  keRecord, regBas
4e60: 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d  e+nOBSat, nBase-
4e70: 6e 4f 42 53 61 74 2c 20 72 65 67 4f 75 74 29 3b  nOBSat, regOut);
4e80: 0a 20 20 72 65 74 75 72 6e 20 72 65 67 4f 75 74  .  return regOut
4e90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
4ea0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
4eb0: 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65 63 6f  ll push the reco
4ec0: 72 64 20 69 6e 20 72 65 67 69 73 74 65 72 73 20  rd in registers 
4ed0: 72 65 67 44 61 74 61 0a 2a 2a 20 74 68 72 6f 75  regData.** throu
4ee0: 67 68 20 72 65 67 44 61 74 61 2b 6e 44 61 74 61  gh regData+nData
4ef0: 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73 6f 72 74  -1 onto the sort
4f00: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
4f10: 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65  id pushOntoSorte
4f20: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
4f30: 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  se,         /* P
4f40: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
4f50: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
4f60: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66  t,        /* Inf
4f70: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
4f80: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
4f90: 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  se */.  Select *
4fa0: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 2f  pSelect,       /
4fb0: 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45  * The whole SELE
4fc0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
4fd0: 20 20 69 6e 74 20 72 65 67 44 61 74 61 2c 20 20    int regData,  
4fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
4ff0: 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  t register holdi
5000: 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f  ng data to be so
5010: 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65  rted */.  int re
5020: 67 4f 72 69 67 44 61 74 61 2c 20 20 20 20 20 20  gOrigData,      
5030: 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73 74   /* First regist
5040: 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20  er holding data 
5050: 62 65 66 6f 72 65 20 70 61 63 6b 69 6e 67 20 2a  before packing *
5060: 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20  /.  int nData,  
5070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5080: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
5090: 20 69 6e 20 74 68 65 20 72 65 67 44 61 74 61 20   in the regData 
50a0: 64 61 74 61 20 61 72 72 61 79 20 2a 2f 0a 20 20  data array */.  
50b0: 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 20  int nPrefixReg  
50c0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66         /* No. of
50d0: 20 72 65 67 20 70 72 69 6f 72 20 74 6f 20 72 65   reg prior to re
50e0: 67 44 61 74 61 20 61 76 61 69 6c 61 62 6c 65 20  gData available 
50f0: 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20  for use */.){.  
5100: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
5110: 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20  ->pVdbe;        
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5130: 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65 72 20 63   /* Stmt under c
5140: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
5150: 20 69 6e 74 20 62 53 65 71 20 3d 20 28 28 70 53   int bSeq = ((pS
5160: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
5170: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
5180: 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69 6e 74 20  ter)==0);.  int 
5190: 6e 45 78 70 72 20 3d 20 70 53 6f 72 74 2d 3e 70  nExpr = pSort->p
51a0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
51c0: 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20 42 59 20  No. of ORDER BY 
51d0: 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  terms */.  int n
51e0: 42 61 73 65 20 3d 20 6e 45 78 70 72 20 2b 20 62  Base = nExpr + b
51f0: 53 65 71 20 2b 20 6e 44 61 74 61 3b 20 20 20 20  Seq + nData;    
5200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
5210: 69 65 6c 64 73 20 69 6e 20 73 6f 72 74 65 72 20  ields in sorter 
5220: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
5230: 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5260: 52 65 67 73 20 66 6f 72 20 73 6f 72 74 65 72 20  Regs for sorter 
5270: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
5280: 72 65 67 52 65 63 6f 72 64 20 3d 20 30 3b 20 20  regRecord = 0;  
5290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
52b0: 41 73 73 65 6d 62 6c 65 64 20 73 6f 72 74 65 72  Assembled sorter
52c0: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
52d0: 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72 74 2d   nOBSat = pSort-
52e0: 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20 20  >nOBSat;        
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5300: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
5310: 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 69 6e 74  to skip */.  int
5320: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5340: 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61 64 64  /* Opcode to add
5350: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 74   sorter record t
5360: 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e  o sorter */.  in
5370: 74 20 69 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  t iLimit;       
5380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5390: 20 2f 2a 20 4c 49 4d 49 54 20 63 6f 75 6e 74 65   /* LIMIT counte
53a0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6b 69 70  r */.  int iSkip
53b0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
53c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
53d0: 20 6f 66 20 74 68 65 20 73 6f 72 74 65 72 20 69   of the sorter i
53e0: 6e 73 65 72 74 20 6c 6f 6f 70 20 2a 2f 0a 0a 20  nsert loop */.. 
53f0: 20 61 73 73 65 72 74 28 20 62 53 65 71 3d 3d 30   assert( bSeq==0
5400: 20 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b 0a 0a   || bSeq==1 );..
5410: 20 20 2f 2a 20 54 68 72 65 65 20 63 61 73 65 73    /* Three cases
5420: 3a 0a 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65  :.  **   (1) The
5430: 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74   data to be sort
5440: 65 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ed has already b
5450: 65 65 6e 20 70 61 63 6b 65 64 20 69 6e 74 6f 20  een packed into 
5460: 61 20 52 65 63 6f 72 64 0a 20 20 2a 2a 20 20 20  a Record.  **   
5470: 20 20 20 20 62 79 20 61 20 70 72 69 6f 72 20 4f      by a prior O
5480: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 49  P_MakeRecord.  I
5490: 6e 20 74 68 69 73 20 63 61 73 65 20 6e 44 61 74  n this case nDat
54a0: 61 3d 3d 31 20 61 6e 64 20 72 65 67 44 61 74 61  a==1 and regData
54b0: 0a 20 20 2a 2a 20 20 20 20 20 20 20 77 69 6c 6c  .  **       will
54c0: 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75   be completely u
54d0: 6e 72 65 6c 61 74 65 64 20 74 6f 20 72 65 67 4f  nrelated to regO
54e0: 72 69 67 44 61 74 61 2e 0a 20 20 2a 2a 20 20 20  rigData..  **   
54f0: 28 32 29 20 41 6c 6c 20 6f 75 74 70 75 74 20 63  (2) All output c
5500: 6f 6c 75 6d 6e 73 20 61 72 65 20 69 6e 63 6c 75  olumns are inclu
5510: 64 65 64 20 69 6e 20 74 68 65 20 73 6f 72 74 20  ded in the sort 
5520: 72 65 63 6f 72 64 2e 20 20 49 6e 20 74 68 61 74  record.  In that
5530: 0a 20 20 2a 2a 20 20 20 20 20 20 20 63 61 73 65  .  **       case
5540: 20 72 65 67 44 61 74 61 3d 3d 72 65 67 4f 72 69   regData==regOri
5550: 67 44 61 74 61 2e 0a 20 20 2a 2a 20 20 20 28 33  gData..  **   (3
5560: 29 20 53 6f 6d 65 20 6f 75 74 70 75 74 20 63 6f  ) Some output co
5570: 6c 75 6d 6e 73 20 61 72 65 20 6f 6d 69 74 74 65  lumns are omitte
5580: 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 20  d from the sort 
5590: 72 65 63 6f 72 64 20 64 75 65 20 74 6f 0a 20 20  record due to.  
55a0: 2a 2a 20 20 20 20 20 20 20 74 68 65 20 53 51 4c  **       the SQL
55b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45  ITE_ENABLE_SORTE
55c0: 52 5f 52 45 46 45 52 45 4e 43 45 20 6f 70 74 69  R_REFERENCE opti
55d0: 6d 69 7a 61 74 69 6f 6e 2c 20 6f 72 20 64 75 65  mization, or due
55e0: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 20 20 20   to the.  **    
55f0: 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f     SQLITE_ECEL_O
5600: 4d 49 54 52 45 46 20 6f 70 74 69 6d 69 7a 61 74  MITREF optimizat
5610: 69 6f 6e 2e 20 20 49 6e 20 74 68 61 74 20 63 61  ion.  In that ca
5620: 73 65 2c 20 72 65 67 4f 72 69 67 44 61 74 61 3d  se, regOrigData=
5630: 3d 30 0a 20 20 2a 2a 20 20 20 20 20 20 20 74 6f  =0.  **       to
5640: 20 70 72 65 76 65 6e 74 20 74 68 69 73 20 72 6f   prevent this ro
5650: 75 74 69 6e 65 20 66 72 6f 6d 20 74 72 79 69 6e  utine from tryin
5660: 67 20 74 6f 20 63 6f 70 79 20 76 61 6c 75 65 73  g to copy values
5670: 20 74 68 61 74 20 6d 69 67 68 74 0a 20 20 2a 2a   that might.  **
5680: 20 20 20 20 20 20 20 6e 6f 74 20 65 78 69 73 74         not exist
5690: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
56a0: 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 72 65 67   nData==1 || reg
56b0: 44 61 74 61 3d 3d 72 65 67 4f 72 69 67 44 61 74  Data==regOrigDat
56c0: 61 20 7c 7c 20 72 65 67 4f 72 69 67 44 61 74 61  a || regOrigData
56d0: 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 6e 50  ==0 );..  if( nP
56e0: 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20 20 20  refixReg ){.    
56f0: 61 73 73 65 72 74 28 20 6e 50 72 65 66 69 78 52  assert( nPrefixR
5700: 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20 29  eg==nExpr+bSeq )
5710: 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  ;.    regBase = 
5720: 72 65 67 44 61 74 61 20 2d 20 6e 50 72 65 66 69  regData - nPrefi
5730: 78 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  xReg;.  }else{. 
5740: 20 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61     regBase = pPa
5750: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
5760: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
5770: 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a 20 20  += nBase;.  }.  
5780: 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 2d  assert( pSelect-
5790: 3e 69 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70  >iOffset==0 || p
57a0: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 21 3d  Select->iLimit!=
57b0: 30 20 29 3b 0a 20 20 69 4c 69 6d 69 74 20 3d 20  0 );.  iLimit = 
57c0: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
57d0: 20 3f 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   ? pSelect->iOff
57e0: 73 65 74 2b 31 20 3a 20 70 53 65 6c 65 63 74 2d  set+1 : pSelect-
57f0: 3e 69 4c 69 6d 69 74 3b 0a 20 20 70 53 6f 72 74  >iLimit;.  pSort
5800: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d 20 73 71  ->labelDone = sq
5810: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
5820: 65 6c 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  el(v);.  sqlite3
5830: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
5840: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e  (pParse, pSort->
5850: 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61 73  pOrderBy, regBas
5860: 65 2c 20 72 65 67 4f 72 69 67 44 61 74 61 2c 0a  e, regOrigData,.
5870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5880: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
5890: 5f 45 43 45 4c 5f 44 55 50 20 7c 20 28 72 65 67  _ECEL_DUP | (reg
58a0: 4f 72 69 67 44 61 74 61 3f 20 53 51 4c 49 54 45  OrigData? SQLITE
58b0: 5f 45 43 45 4c 5f 52 45 46 20 3a 20 30 29 29 3b  _ECEL_REF : 0));
58c0: 0a 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a 20  .  if( bSeq ){. 
58d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
58e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp2(v, OP_Seque
58f0: 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  nce, pSort->iECu
5900: 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e 45  rsor, regBase+nE
5910: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  xpr);.  }.  if( 
5920: 6e 50 72 65 66 69 78 52 65 67 3d 3d 30 20 26 26  nPrefixReg==0 &&
5930: 20 6e 44 61 74 61 3e 30 20 29 7b 0a 20 20 20 20   nData>0 ){.    
5940: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
5950: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 44  ove(pParse, regD
5960: 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78  ata, regBase+nEx
5970: 70 72 2b 62 53 65 71 2c 20 6e 44 61 74 61 29 3b  pr+bSeq, nData);
5980: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 42 53 61  .  }.  if( nOBSa
5990: 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  t>0 ){.    int r
59a0: 65 67 50 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20  egPrevKey;   /* 
59b0: 54 68 65 20 66 69 72 73 74 20 6e 4f 42 53 61 74  The first nOBSat
59c0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
59d0: 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a  previous row */.
59e0: 20 20 20 20 69 6e 74 20 61 64 64 72 46 69 72 73      int addrFirs
59f0: 74 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  t;    /* Address
5a00: 20 6f 66 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74   of the OP_IfNot
5a10: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69   opcode */.    i
5a20: 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20 20 20 20  nt addrJmp;     
5a30: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
5a40: 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64  he OP_Jump opcod
5a50: 65 20 2a 2f 0a 20 20 20 20 56 64 62 65 4f 70 20  e */.    VdbeOp 
5a60: 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70  *pOp;      /* Op
5a70: 63 6f 64 65 20 74 68 61 74 20 6f 70 65 6e 73 20  code that opens 
5a80: 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20  the sorter */.  
5a90: 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20    int nKey;     
5aa0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5ab0: 20 73 6f 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c   sorting key col
5ac0: 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20  umns, including 
5ad0: 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20  OP_Sequence */. 
5ae0: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b     KeyInfo *pKI;
5af0: 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
5b00: 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20   KeyInfo on the 
5b10: 73 6f 72 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  sorter table */.
5b20: 0a 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d  .    regRecord =
5b30: 20 6d 61 6b 65 53 6f 72 74 65 72 52 65 63 6f 72   makeSorterRecor
5b40: 64 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c  d(pParse, pSort,
5b50: 20 70 53 65 6c 65 63 74 2c 20 72 65 67 42 61 73   pSelect, regBas
5b60: 65 2c 20 6e 42 61 73 65 29 3b 0a 20 20 20 20 72  e, nBase);.    r
5b70: 65 67 50 72 65 76 4b 65 79 20 3d 20 70 50 61 72  egPrevKey = pPar
5b80: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
5b90: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
5ba0: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
5bb0: 20 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20     nKey = nExpr 
5bc0: 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20  - pSort->nOBSat 
5bd0: 2b 20 62 53 65 71 3b 0a 20 20 20 20 69 66 28 20  + bSeq;.    if( 
5be0: 62 53 65 71 20 29 7b 0a 20 20 20 20 20 20 61 64  bSeq ){.      ad
5bf0: 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
5c00: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
5c10: 50 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61 73 65  P_IfNot, regBase
5c20: 2b 6e 45 78 70 72 29 3b 20 0a 20 20 20 20 7d 65  +nExpr); .    }e
5c30: 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 46  lse{.      addrF
5c40: 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
5c50: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53  beAddOp1(v, OP_S
5c60: 65 71 75 65 6e 63 65 54 65 73 74 2c 20 70 53 6f  equenceTest, pSo
5c70: 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  rt->iECursor);. 
5c80: 20 20 20 7d 0a 20 20 20 20 56 64 62 65 43 6f 76     }.    VdbeCov
5c90: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
5ca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5cb0: 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
5cc0: 65 67 50 72 65 76 4b 65 79 2c 20 72 65 67 42 61  egPrevKey, regBa
5cd0: 73 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  se, pSort->nOBSa
5ce0: 74 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73 71  t);.    pOp = sq
5cf0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
5d00: 2c 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72  , pSort->addrSor
5d10: 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28  tIndex);.    if(
5d20: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
5d30: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
5d40: 72 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20  rn;.    pOp->p2 
5d50: 3d 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a  = nKey + nData;.
5d60: 20 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70      pKI = pOp->p
5d70: 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
5d80: 6d 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72  memset(pKI->aSor
5d90: 74 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e  tOrder, 0, pKI->
5da0: 6e 4b 65 79 46 69 65 6c 64 29 3b 20 2f 2a 20 4d  nKeyField); /* M
5db0: 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 74 65 73  akes OP_Jump tes
5dc0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c  table */.    sql
5dd0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
5de0: 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70  (v, -1, (char*)p
5df0: 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  KI, P4_KEYINFO);
5e00: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
5e10: 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 3e 20  KI->nAllField > 
5e20: 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64 2b 32  pKI->nKeyField+2
5e30: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   );.    pOp->p4.
5e40: 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
5e50: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
5e60: 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f  Parse, pSort->pO
5e70: 72 64 65 72 42 79 2c 20 6e 4f 42 53 61 74 2c 0a  rderBy, nOBSat,.
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ea0: 20 20 20 20 20 20 20 20 20 20 20 70 4b 49 2d 3e             pKI->
5eb0: 6e 41 6c 6c 46 69 65 6c 64 2d 70 4b 49 2d 3e 6e  nAllField-pKI->n
5ec0: 4b 65 79 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20  KeyField-1);.   
5ed0: 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74   addrJmp = sqlit
5ee0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
5ef0: 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
5f00: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5f10: 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b  P_Jump, addrJmp+
5f20: 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29  1, 0, addrJmp+1)
5f30: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
5f40: 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61  );.    pSort->la
5f50: 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74  belBkOut = sqlit
5f60: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
5f70: 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72  v);.    pSort->r
5f80: 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
5f90: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
5fa0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5fb0: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53  (v, OP_Gosub, pS
5fc0: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  ort->regReturn, 
5fd0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
5fe0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
5ff0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
6000: 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f  ResetSorter, pSo
6010: 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  rt->iECursor);. 
6020: 20 20 20 69 66 28 20 69 4c 69 6d 69 74 20 29 7b     if( iLimit ){
6030: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6040: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6050: 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 70 53  fNot, iLimit, pS
6060: 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 29 3b  ort->labelDone);
6070: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
6080: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
6090: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
60a0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 46 69 72  pHere(v, addrFir
60b0: 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
60c0: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
60d0: 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65  rse, regBase, re
60e0: 67 50 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d  gPrevKey, pSort-
60f0: 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71  >nOBSat);.    sq
6100: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
6110: 65 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20  e(v, addrJmp);. 
6120: 20 7d 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 20   }.  if( iLimit 
6130: 29 7b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  ){.    /* At thi
6140: 73 20 70 6f 69 6e 74 20 74 68 65 20 76 61 6c 75  s point the valu
6150: 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  es for the new s
6160: 6f 72 74 65 72 20 65 6e 74 72 79 20 61 72 65 20  orter entry are 
6170: 73 74 6f 72 65 64 0a 20 20 20 20 2a 2a 20 69 6e  stored.    ** in
6180: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
6190: 69 73 74 65 72 73 2e 20 54 68 65 79 20 6e 65 65  isters. They nee
61a0: 64 20 74 6f 20 62 65 20 63 6f 6d 70 6f 73 65 64  d to be composed
61b0: 20 69 6e 74 6f 20 61 20 72 65 63 6f 72 64 0a 20   into a record. 
61c0: 20 20 20 2a 2a 20 61 6e 64 20 69 6e 73 65 72 74     ** and insert
61d0: 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ed into the sort
61e0: 65 72 20 69 66 20 65 69 74 68 65 72 20 28 61 29  er if either (a)
61f0: 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65   there are curre
6200: 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6c 65 73 73  ntly.    ** less
6210: 20 74 68 61 6e 20 4c 49 4d 49 54 2b 4f 46 46 53   than LIMIT+OFFS
6220: 45 54 20 69 74 65 6d 73 20 6f 72 20 28 62 29 20  ET items or (b) 
6230: 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 69  the new record i
6240: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
6250: 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 72 67 65      ** the large
6260: 73 74 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e  st record curren
6270: 74 6c 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65  tly in the sorte
6280: 72 2e 20 49 66 20 28 62 29 20 69 73 20 74 72 75  r. If (b) is tru
6290: 65 20 61 6e 64 20 74 68 65 72 65 0a 20 20 20 20  e and there.    
62a0: 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20 4c  ** are already L
62b0: 49 4d 49 54 2b 4f 46 46 53 45 54 20 69 74 65 6d  IMIT+OFFSET item
62c0: 73 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2c  s in the sorter,
62d0: 20 64 65 6c 65 74 65 20 74 68 65 20 6c 61 72 67   delete the larg
62e0: 65 73 74 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79  est.    ** entry
62f0: 20 62 65 66 6f 72 65 20 69 6e 73 65 72 74 69 6e   before insertin
6300: 67 20 74 68 65 20 6e 65 77 20 6f 6e 65 2e 20 54  g the new one. T
6310: 68 69 73 20 77 61 79 20 74 68 65 72 65 20 61 72  his way there ar
6320: 65 20 6e 65 76 65 72 20 6d 6f 72 65 20 0a 20 20  e never more .  
6330: 20 20 2a 2a 20 74 68 61 6e 20 4c 49 4d 49 54 2b    ** than LIMIT+
6340: 4f 46 46 53 45 54 20 69 74 65 6d 73 20 69 6e 20  OFFSET items in 
6350: 74 68 65 20 73 6f 72 74 65 72 2e 0a 20 20 20 20  the sorter..    
6360: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
6370: 20 6e 65 77 20 72 65 63 6f 72 64 20 64 6f 65 73   new record does
6380: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
6390: 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
63a0: 65 20 73 6f 72 74 65 72 2c 0a 20 20 20 20 2a 2a  e sorter,.    **
63b0: 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78   jump to the nex
63c0: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
63d0: 68 65 20 6c 6f 6f 70 2e 20 4f 72 2c 20 69 66 20  he loop. Or, if 
63e0: 74 68 65 0a 20 20 20 20 2a 2a 20 70 53 6f 72 74  the.    ** pSort
63f0: 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ->bOrderedInnerL
6400: 6f 6f 70 20 66 6c 61 67 20 69 73 20 73 65 74 20  oop flag is set 
6410: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
6420: 20 74 68 65 20 69 6e 6e 65 72 0a 20 20 20 20 2a   the inner.    *
6430: 2a 20 6c 6f 6f 70 20 64 65 6c 69 76 65 72 73 20  * loop delivers 
6440: 69 74 65 6d 73 20 69 6e 20 73 6f 72 74 65 64 20  items in sorted 
6450: 6f 72 64 65 72 2c 20 6a 75 6d 70 20 74 6f 20 74  order, jump to t
6460: 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
6470: 6e 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  n.    ** of the 
6480: 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 20 20  outer loop..    
6490: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 73 72 20  */.    int iCsr 
64a0: 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  = pSort->iECurso
64b0: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  r;.    sqlite3Vd
64c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
64d0: 66 4e 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74  fNotZero, iLimit
64e0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
64f0: 72 65 6e 74 41 64 64 72 28 76 29 2b 34 29 3b 0a  rentAddr(v)+4);.
6500: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
6510: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
6520: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6530: 5f 4c 61 73 74 2c 20 69 43 73 72 2c 20 30 29 3b  _Last, iCsr, 0);
6540: 0a 20 20 20 20 69 53 6b 69 70 20 3d 20 73 71 6c  .    iSkip = sql
6550: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
6560: 74 28 76 2c 20 4f 50 5f 49 64 78 4c 45 2c 0a 20  t(v, OP_IdxLE,. 
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6590: 69 43 73 72 2c 20 30 2c 20 72 65 67 42 61 73 65  iCsr, 0, regBase
65a0: 2b 6e 4f 42 53 61 74 2c 20 6e 45 78 70 72 2d 6e  +nOBSat, nExpr-n
65b0: 4f 42 53 61 74 29 3b 0a 20 20 20 20 56 64 62 65  OBSat);.    Vdbe
65c0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
65d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
65e0: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
65f0: 20 69 43 73 72 29 3b 0a 20 20 7d 0a 20 20 69 66   iCsr);.  }.  if
6600: 28 20 72 65 67 52 65 63 6f 72 64 3d 3d 30 20 29  ( regRecord==0 )
6610: 7b 0a 20 20 20 20 72 65 67 52 65 63 6f 72 64 20  {.    regRecord 
6620: 3d 20 6d 61 6b 65 53 6f 72 74 65 72 52 65 63 6f  = makeSorterReco
6630: 72 64 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  rd(pParse, pSort
6640: 2c 20 70 53 65 6c 65 63 74 2c 20 72 65 67 42 61  , pSelect, regBa
6650: 73 65 2c 20 6e 42 61 73 65 29 3b 0a 20 20 7d 0a  se, nBase);.  }.
6660: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72    if( pSort->sor
6670: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
6680: 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  G_UseSorter ){. 
6690: 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65     op = OP_Sorte
66a0: 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65  rInsert;.  }else
66b0: 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64  {.    op = OP_Id
66c0: 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73  xInsert;.  }.  s
66d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
66e0: 49 6e 74 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74  Int(v, op, pSort
66f0: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52  ->iECursor, regR
6700: 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20  ecord,.         
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
6720: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
6730: 61 73 65 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 69  ase-nOBSat);.  i
6740: 66 28 20 69 53 6b 69 70 20 29 7b 0a 20 20 20 20  f( iSkip ){.    
6750: 61 73 73 65 72 74 28 20 70 53 6f 72 74 2d 3e 62  assert( pSort->b
6760: 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70  OrderedInnerLoop
6770: 3d 3d 30 20 7c 7c 20 70 53 6f 72 74 2d 3e 62 4f  ==0 || pSort->bO
6780: 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3d  rderedInnerLoop=
6790: 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =1 );.    sqlite
67a0: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
67b0: 20 69 53 6b 69 70 2c 0a 20 20 20 20 20 20 20 20   iSkip,.        
67c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
67d0: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 70 53 6f  entAddr(v) + pSo
67e0: 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65  rt->bOrderedInne
67f0: 72 4c 6f 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  rLoop);.  }.}../
6800: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f  *.** Add code to
6810: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f   implement the O
6820: 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20  FFSET.*/.static 
6830: 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28  void codeOffset(
6840: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
6850: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
6860: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
6870: 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66  VM */.  int iOff
6880: 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65 67  set,      /* Reg
6890: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  ister holding th
68a0: 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72  e offset counter
68b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
68c0: 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  nue     /* Jump 
68d0: 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65  here to skip the
68e0: 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20   current record 
68f0: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66 66  */.){.  if( iOff
6900: 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  set>0 ){.    sql
6910: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6920: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66  , OP_IfPos, iOff
6930: 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  set, iContinue, 
6940: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
6950: 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  (v);.    VdbeCom
6960: 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54  ment((v, "OFFSET
6970: 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  "));.  }.}../*.*
6980: 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20  * Add code that 
6990: 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61  will check to ma
69a0: 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65  ke sure the N re
69b0: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
69c0: 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d   at iMem.** form
69d0: 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72   a distinct entr
69e0: 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f  y.  iTab is a so
69f0: 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
6a00: 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c   holds previousl
6a10: 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e  y.** seen combin
6a20: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20  ations of the N 
6a30: 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65  values.  A new e
6a40: 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20  ntry is made in 
6a50: 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63  iTab.** if the c
6a60: 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20  urrent N values 
6a70: 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41  are new..**.** A
6a80: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70   jump to addrRep
6a90: 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20  eat is made and 
6aa0: 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61  the N+1 values a
6ab0: 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  re popped from t
6ac0: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74  he.** stack if t
6ad0: 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74  he top N element
6ae0: 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e  s are not distin
6af0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
6b00: 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28  id codeDistinct(
6b10: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6b20: 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
6b30: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
6b40: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
6b50: 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20    int iTab,     
6b60: 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e       /* A sortin
6b70: 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20  g index used to 
6b80: 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63  test for distinc
6b90: 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61  tness */.  int a
6ba0: 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a  ddrRepeat,    /*
6bb0: 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66   Jump to here if
6bc0: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f   not distinct */
6bd0: 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
6be0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6bf0: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  of elements */. 
6c00: 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20   int iMem       
6c10: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65      /* First ele
6c20: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  ment */.){.  Vdb
6c30: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a  e *v;.  int r1;.
6c40: 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
6c50: 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c  Vdbe;.  r1 = sql
6c60: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
6c70: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
6c80: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
6c90: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62  , OP_Found, iTab
6ca0: 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d  , addrRepeat, iM
6cb0: 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76 65  em, N); VdbeCove
6cc0: 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
6cd0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6ce0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69  OP_MakeRecord, i
6cf0: 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73  Mem, N, r1);.  s
6d00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
6d10: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
6d20: 65 72 74 2c 20 69 54 61 62 2c 20 72 31 2c 20 69  ert, iTab, r1, i
6d30: 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74  Mem, N);.  sqlit
6d40: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
6d50: 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
6d60: 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74  RESULT);.  sqlit
6d70: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
6d80: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
6d90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6da0: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
6db0: 45 52 45 4e 43 45 53 0a 2f 2a 0a 2a 2a 20 54 68  ERENCES./*.** Th
6dc0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
6dd0: 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
6de0: 20 69 6e 6e 65 72 2d 6c 6f 6f 70 20 67 65 6e 65   inner-loop gene
6df0: 72 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c  ration for a SEL
6e00: 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
6e10: 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
6e20: 59 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6f 70  Y that is not op
6e30: 74 69 6d 69 7a 65 64 20 62 79 20 61 6e 20 69 6e  timized by an in
6e40: 64 65 78 2e 20 49 74 20 0a 2a 2a 20 64 65 74 65  dex. It .** dete
6e50: 72 6d 69 6e 65 73 20 74 68 65 20 65 78 70 72 65  rmines the expre
6e60: 73 73 69 6f 6e 73 2c 20 69 66 20 61 6e 79 2c 20  ssions, if any, 
6e70: 74 68 61 74 20 74 68 65 20 73 6f 72 74 65 72 2d  that the sorter-
6e80: 72 65 66 65 72 65 6e 63 65 20 0a 2a 2a 20 6f 70  reference .** op
6e90: 74 69 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c  timization shoul
6ea0: 64 20 62 65 20 75 73 65 64 20 66 6f 72 2e 20 54  d be used for. T
6eb0: 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65  he sorter-refere
6ec0: 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  nce optimization
6ed0: 0a 2a 2a 20 69 73 20 75 73 65 64 20 66 6f 72 20  .** is used for 
6ee0: 53 45 4c 45 43 54 20 71 75 65 72 69 65 73 20 6c  SELECT queries l
6ef0: 69 6b 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ike:.**.**   SEL
6f00: 45 43 54 20 61 2c 20 62 69 67 62 6c 6f 62 20 46  ECT a, bigblob F
6f10: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
6f20: 61 20 4c 49 4d 49 54 20 31 30 0a 2a 2a 0a 2a 2a  a LIMIT 10.**.**
6f30: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
6f40: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
6f50: 20 65 78 70 72 65 73 73 69 6f 6e 20 22 62 69 67   expression "big
6f60: 62 6c 6f 62 22 2c 20 74 68 65 6e 20 69 6e 73 74  blob", then inst
6f70: 65 61 64 20 6f 66 0a 2a 2a 20 73 74 6f 72 69 6e  ead of.** storin
6f80: 67 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  g values read fr
6f90: 6f 6d 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  om that column i
6fa0: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 72 65 63  n the sorter rec
6fb0: 6f 72 64 73 2c 20 74 68 65 20 50 4b 20 6f 66 0a  ords, the PK of.
6fc0: 2a 2a 20 74 68 65 20 72 6f 77 20 66 72 6f 6d 20  ** the row from 
6fd0: 74 61 62 6c 65 20 74 31 20 69 73 20 73 74 6f 72  table t1 is stor
6fe0: 65 64 20 69 6e 73 74 65 61 64 2e 20 54 68 65 6e  ed instead. Then
6ff0: 2c 20 61 73 20 72 65 63 6f 72 64 73 20 61 72 65  , as records are
7000: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 0a   extracted from.
7010: 2a 2a 20 74 68 65 20 73 6f 72 74 65 72 20 74 6f  ** the sorter to
7020: 20 72 65 74 75 72 6e 20 74 6f 20 74 68 65 20 75   return to the u
7030: 73 65 72 2c 20 74 68 65 20 72 65 71 75 69 72 65  ser, the require
7040: 64 20 76 61 6c 75 65 20 6f 66 20 62 69 67 62 6c  d value of bigbl
7050: 6f 62 20 69 73 0a 2a 2a 20 72 65 74 72 69 65 76  ob is.** retriev
7060: 65 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  ed directly from
7070: 20 74 61 62 6c 65 20 74 31 2e 20 49 66 20 74 68   table t1. If th
7080: 65 20 76 61 6c 75 65 73 20 61 72 65 20 76 65 72  e values are ver
7090: 79 20 6c 61 72 67 65 2c 20 74 68 69 73 20 0a 2a  y large, this .*
70a0: 2a 20 63 61 6e 20 62 65 20 6d 6f 72 65 20 65 66  * can be more ef
70b0: 66 69 63 69 65 6e 74 20 74 68 61 6e 20 73 74 6f  ficient than sto
70c0: 72 69 6e 67 20 74 68 65 6d 20 64 69 72 65 63 74  ring them direct
70d0: 6c 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72  ly in the sorter
70e0: 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20   records..**.** 
70f0: 54 68 65 20 45 78 70 72 4c 69 73 74 5f 69 74 65  The ExprList_ite
7100: 6d 2e 62 53 6f 72 74 65 72 52 65 66 20 66 6c 61  m.bSorterRef fla
7110: 67 20 69 73 20 73 65 74 20 66 6f 72 20 65 61 63  g is set for eac
7120: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
7130: 70 45 4c 69 73 74 20 0a 2a 2a 20 66 6f 72 20 77  pEList .** for w
7140: 68 69 63 68 20 74 68 65 20 73 6f 72 74 65 72 2d  hich the sorter-
7150: 72 65 66 65 72 65 6e 63 65 20 6f 70 74 69 6d 69  reference optimi
7160: 7a 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  zation should be
7170: 20 65 6e 61 62 6c 65 64 2e 20 0a 2a 2a 20 41 64   enabled. .** Ad
7180: 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20  ditionally, the 
7190: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 5d 20  pSort->aDefer[] 
71a0: 61 72 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74  array is populat
71b0: 65 64 20 77 69 74 68 20 65 6e 74 72 69 65 73 0a  ed with entries.
71c0: 2a 2a 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  ** for all curso
71d0: 72 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  rs required to e
71e0: 76 61 6c 75 61 74 65 20 61 6c 6c 20 73 65 6c 65  valuate all sele
71f0: 63 74 65 64 20 65 78 70 72 65 73 73 69 6f 6e 73  cted expressions
7200: 2e 20 46 69 6e 61 6c 6c 79 2e 0a 2a 2a 20 6f 75  . Finally..** ou
7210: 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 28 2a  tput variable (*
7220: 70 70 45 78 74 72 61 29 20 69 73 20 73 65 74 20  ppExtra) is set 
7230: 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  to an expression
7240: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
7250: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
7260: 66 6f 72 20 61 6c 6c 20 65 78 74 72 61 20 50 4b  for all extra PK
7270: 20 76 61 6c 75 65 73 20 74 68 61 74 20 73 68 6f   values that sho
7280: 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e  uld be stored in
7290: 20 74 68 65 0a 2a 2a 20 73 6f 72 74 65 72 20 72   the.** sorter r
72a0: 65 63 6f 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  ecords..*/.stati
72b0: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 45 78 70  c void selectExp
72c0: 72 44 65 66 65 72 28 0a 20 20 50 61 72 73 65 20  rDefer(.  Parse 
72d0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
72e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61            /* Lea
72f0: 76 65 20 61 6e 79 20 65 72 72 6f 72 20 68 65 72  ve any error her
7300: 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  e */.  SortCtx *
7310: 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 20  pSort,          
7320: 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72         /* Sorter
7330: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
7340: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7360: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 73   Expressions des
7370: 74 69 6e 65 64 20 66 6f 72 20 73 6f 72 74 65 72  tined for sorter
7380: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
7390: 2a 70 70 45 78 74 72 61 20 20 20 20 20 20 20 20  *ppExtra        
73a0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
73b0: 69 6f 6e 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ions to append t
73c0: 6f 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  o sorter record 
73d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
73e0: 20 69 6e 74 20 6e 44 65 66 65 72 20 3d 20 30 3b   int nDefer = 0;
73f0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78  .  ExprList *pEx
7400: 74 72 61 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  tra = 0;.  for(i
7410: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
7420: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
7430: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
7440: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 45  tem *pItem = &pE
7450: 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
7460: 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  if( pItem->u.x.i
7470: 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 7b  OrderByCol==0 ){
7480: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
7490: 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  pr = pItem->pExp
74a0: 72 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  r;.      Table *
74b0: 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
74c0: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  ab;.      if( pE
74d0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
74e0: 4d 4e 20 26 26 20 70 54 61 62 20 26 26 20 21 49  MN && pTab && !I
74f0: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 0a 20  sVirtual(pTab). 
7500: 20 20 20 20 20 20 26 26 20 28 70 54 61 62 2d 3e        && (pTab->
7510: 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  aCol[pExpr->iCol
7520: 75 6d 6e 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20  umn].colFlags & 
7530: 43 4f 4c 46 4c 41 47 5f 53 4f 52 54 45 52 52 45  COLFLAG_SORTERRE
7540: 46 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  F).      ){.    
7550: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
7560: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 44     for(j=0; j<nD
7570: 65 66 65 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  efer; j++){.    
7580: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d        if( pSort-
7590: 3e 61 44 65 66 65 72 5b 6a 5d 2e 69 43 73 72 3d  >aDefer[j].iCsr=
75a0: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
75b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
75c0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  }.        if( j=
75d0: 3d 6e 44 65 66 65 72 20 29 7b 0a 20 20 20 20 20  =nDefer ){.     
75e0: 20 20 20 20 20 69 66 28 20 6e 44 65 66 65 72 3d       if( nDefer=
75f0: 3d 41 72 72 61 79 53 69 7a 65 28 70 53 6f 72 74  =ArraySize(pSort
7600: 2d 3e 61 44 65 66 65 72 29 20 29 7b 0a 20 20 20  ->aDefer) ){.   
7610: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
7620: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  e;.          }el
7630: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
7640: 69 6e 74 20 6e 4b 65 79 20 3d 20 31 3b 0a 20 20  int nKey = 1;.  
7650: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
7660: 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 64  .            Ind
7670: 65 78 20 2a 70 50 6b 20 3d 20 30 3b 0a 20 20 20  ex *pPk = 0;.   
7680: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61           if( !Ha
7690: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
76a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
76b0: 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
76c0: 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
76d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
76e0: 6e 4b 65 79 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79  nKey = pPk->nKey
76f0: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
7700: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66   }.            f
7710: 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20  or(k=0; k<nKey; 
7720: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
7730: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
7740: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
7750: 61 72 73 65 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c  arse, TK_COLUMN,
7760: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
7770: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
7780: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7790: 20 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 20 3d    pNew->iTable =
77a0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77c0: 70 4e 65 77 2d 3e 70 54 61 62 20 3d 20 70 45 78  pNew->pTab = pEx
77d0: 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
77e0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
77f0: 69 43 6f 6c 75 6d 6e 20 3d 20 70 50 6b 20 3f 20  iColumn = pPk ? 
7800: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  pPk->aiColumn[k]
7810: 20 3a 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   : -1;.         
7820: 20 20 20 20 20 20 20 70 45 78 74 72 61 20 3d 20         pExtra = 
7830: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
7840: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 45  ppend(pParse, pE
7850: 78 74 72 61 2c 20 70 4e 65 77 29 3b 0a 20 20 20  xtra, pNew);.   
7860: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
7870: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7880: 20 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61 44         pSort->aD
7890: 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e 70 54 61  efer[nDefer].pTa
78a0: 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
78b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 6f  .            pSo
78c0: 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44 65 66 65  rt->aDefer[nDefe
78d0: 72 5d 2e 69 43 73 72 20 3d 20 70 45 78 70 72 2d  r].iCsr = pExpr-
78e0: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
78f0: 20 20 20 20 20 70 53 6f 72 74 2d 3e 61 44 65 66       pSort->aDef
7900: 65 72 5b 6e 44 65 66 65 72 5d 2e 6e 4b 65 79 20  er[nDefer].nKey 
7910: 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  = nKey;.        
7920: 20 20 20 20 6e 44 65 66 65 72 2b 2b 3b 0a 20 20      nDefer++;.  
7930: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7940: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 49 74 65    }.        pIte
7950: 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 20 3d 20  m->bSorterRef = 
7960: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
7970: 0a 20 20 7d 0a 20 20 70 53 6f 72 74 2d 3e 6e 44  .  }.  pSort->nD
7980: 65 66 65 72 20 3d 20 28 75 38 29 6e 44 65 66 65  efer = (u8)nDefe
7990: 72 3b 0a 20 20 2a 70 70 45 78 74 72 61 20 3d 20  r;.  *ppExtra = 
79a0: 70 45 78 74 72 61 3b 0a 7d 0a 23 65 6e 64 69 66  pExtra;.}.#endif
79b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
79c0: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
79d0: 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  he code for the 
79e0: 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e  inside of the in
79f0: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61  ner loop.** of a
7a00: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49   SELECT..**.** I
7a10: 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67 61  f srcTab is nega
7a20: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70  tive, then the p
7a30: 2d 3e 70 45 4c 69 73 74 20 65 78 70 72 65 73 73  ->pEList express
7a40: 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c  ions.** are eval
7a50: 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uated in order t
7a60: 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66  o get the data f
7a70: 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66  or this row.  If
7a80: 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65   srcTab is.** ze
7a90: 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e  ro or more, then
7aa0: 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20   data is pulled 
7ab0: 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20  from srcTab and 
7ac0: 70 2d 3e 70 45 4c 69 73 74 20 69 73 20 75 73 65  p->pEList is use
7ad0: 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65  d only .** to ge
7ae0: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
7af0: 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20  columns and the 
7b00: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
7b10: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
7b20: 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mn..*/.static vo
7b30: 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  id selectInnerLo
7b40: 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  op(.  Parse *pPa
7b50: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
7b60: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
7b70: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
7b80: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
7b90: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65   /* The complete
7ba0: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
7bb0: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
7bc0: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20  .  int srcTab,  
7bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
7be0: 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  ll data from thi
7bf0: 73 20 74 61 62 6c 65 20 69 66 20 6e 6f 6e 2d 6e  s table if non-n
7c00: 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 53 6f 72  egative */.  Sor
7c10: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
7c20: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
7c30: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
7c40: 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44 45   to process ORDE
7c50: 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e  R BY */.  Distin
7c60: 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63 74  ctCtx *pDistinct
7c70: 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  , /* If not NULL
7c80: 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  , info on how to
7c90: 20 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e 43   process DISTINC
7ca0: 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  T */.  SelectDes
7cb0: 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
7cc0: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
7cd0: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
7ce0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
7cf0: 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ue,          /* 
7d00: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
7d10: 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
7d20: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  row */.  int iBr
7d30: 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
7d40: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
7d50: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
7d60: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  e inner loop */.
7d70: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
7d80: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
7d90: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73  int i;.  int has
7da0: 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
7db0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
7dc0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
7dd0: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
7de0: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
7df0: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20   pDest->eDest;  
7e00: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
7e10: 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f  se of results */
7e20: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
7e30: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f  Dest->iSDParm; /
7e40: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
7e50: 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74   to disposal met
7e60: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  hod */.  int nRe
7e70: 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  sultCol;        
7e80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7e90: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
7ea0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69   */.  int nPrefi
7eb0: 78 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  xReg = 0;       
7ec0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
7ed0: 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 62  xtra registers b
7ee0: 65 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74 20  efore regResult 
7ef0: 2a 2f 0a 20 20 52 6f 77 4c 6f 61 64 49 6e 66 6f  */.  RowLoadInfo
7f00: 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 20 20   sRowLoadInfo;  
7f10: 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 64 65 66   /* Info for def
7f20: 65 72 72 65 64 20 72 6f 77 20 6c 6f 61 64 69 6e  erred row loadin
7f30: 67 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 75 61 6c  g */..  /* Usual
7f40: 6c 79 2c 20 72 65 67 52 65 73 75 6c 74 20 69 73  ly, regResult is
7f50: 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
7f60: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6d  in an array of m
7f70: 65 6d 6f 72 79 20 63 65 6c 6c 73 0a 20 20 2a 2a  emory cells.  **
7f80: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
7f90: 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 20 72  current result r
7fa0: 6f 77 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ow. In this case
7fb0: 20 72 65 67 4f 72 69 67 20 69 73 20 73 65 74 20   regOrig is set 
7fc0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  to the.  ** same
7fd0: 20 76 61 6c 75 65 2e 20 48 6f 77 65 76 65 72 2c   value. However,
7fe0: 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   if the results 
7ff0: 61 72 65 20 62 65 69 6e 67 20 73 65 6e 74 20 74  are being sent t
8000: 6f 20 74 68 65 20 73 6f 72 74 65 72 2c 20 74 68  o the sorter, th
8010: 65 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 66 6f  e.  ** values fo
8020: 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  r any expression
8030: 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20  s that are also 
8040: 70 61 72 74 20 6f 66 20 74 68 65 20 73 6f 72 74  part of the sort
8050: 2d 6b 65 79 20 61 72 65 20 6f 6d 69 74 74 65 64  -key are omitted
8060: 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20  .  ** from this 
8070: 61 72 72 61 79 2e 20 49 6e 20 74 68 69 73 20 63  array. In this c
8080: 61 73 65 20 72 65 67 4f 72 69 67 20 69 73 20 73  ase regOrig is s
8090: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 2a 2f 0a  et to zero.  */.
80a0: 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b    int regResult;
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
80c0: 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79   Start of memory
80d0: 20 68 6f 6c 64 69 6e 67 20 63 75 72 72 65 6e 74   holding current
80e0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
80f0: 74 20 72 65 67 4f 72 69 67 3b 20 20 20 20 20 20  t regOrig;      
8100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
8110: 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c  rt of memory hol
8120: 64 69 6e 67 20 66 75 6c 6c 20 72 65 73 75 6c 74  ding full result
8130: 20 28 6f 72 20 30 29 20 2a 2f 0a 0a 20 20 61 73   (or 0) */..  as
8140: 73 65 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73  sert( v );.  ass
8150: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d  ert( p->pEList!=
8160: 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e  0 );.  hasDistin
8170: 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f  ct = pDistinct ?
8180: 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63   pDistinct->eTnc
8190: 74 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49  tType : WHERE_DI
81a0: 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69  STINCT_NOOP;.  i
81b0: 66 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f 72  f( pSort && pSor
81c0: 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t->pOrderBy==0 )
81d0: 20 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66   pSort = 0;.  if
81e0: 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21 68  ( pSort==0 && !h
81f0: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
8200: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74 69    assert( iConti
8210: 6e 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f  nue!=0 );.    co
8220: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
8230: 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75  Offset, iContinu
8240: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75  e);.  }..  /* Pu
8250: 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ll the requested
8260: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20   columns..  */. 
8270: 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 2d   nResultCol = p-
8280: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
8290: 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53  .  if( pDest->iS
82a0: 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  dst==0 ){.    if
82b0: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
82c0: 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20 70 53   nPrefixReg = pS
82d0: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  ort->pOrderBy->n
82e0: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
82f0: 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  !(pSort->sortFla
8300: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
8310: 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72 65 66  eSorter) ) nPref
8320: 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20 70  ixReg++;.      p
8330: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
8340: 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20 20 7d  PrefixReg;.    }
8350: 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73  .    pDest->iSds
8360: 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  t = pParse->nMem
8370: 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
8380: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
8390: 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ol;.  }else if( 
83a0: 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52 65  pDest->iSdst+nRe
83b0: 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73 65  sultCol > pParse
83c0: 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f 2a  ->nMem ){.    /*
83d0: 20 54 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f   This is an erro
83e0: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61 74  r condition that
83f0: 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f 72   can result, for
8400: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61   example, when a
8410: 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 6f   SELECT.    ** o
8420: 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  n the right-hand
8430: 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e 53 45   side of an INSE
8440: 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65  RT contains more
8450: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
8460: 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72  than.    ** ther
8470: 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  e are columns in
8480: 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68   the table on th
8490: 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65 72 72  e left.  The err
84a0: 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67 68  or will be caugh
84b0: 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 70  t.    ** and rep
84c0: 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20 42 75  orted later.  Bu
84d0: 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b  t we need to mak
84e0: 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20 6d 65  e sure enough me
84f0: 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65  mory is allocate
8500: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69  d.    ** to avoi
8510: 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f 75 73  d other spurious
8520: 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20 6d   errors in the m
8530: 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20  eantime. */.    
8540: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
8550: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a  nResultCol;.  }.
8560: 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
8570: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 72   nResultCol;.  r
8580: 65 67 4f 72 69 67 20 3d 20 72 65 67 52 65 73 75  egOrig = regResu
8590: 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73  lt = pDest->iSds
85a0: 74 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e  t;.  if( srcTab>
85b0: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 ){.    for(i=
85c0: 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b  0; i<nResultCol;
85d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
85e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
85f0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63  , OP_Column, src
8600: 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c  Tab, i, regResul
8610: 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65  t+i);.      Vdbe
8620: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
8630: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  , p->pEList->a[i
8640: 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  ].zName));.    }
8650: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65  .  }else if( eDe
8660: 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29  st!=SRT_Exists )
8670: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
8680: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
8690: 46 45 52 45 4e 43 45 53 0a 20 20 20 20 45 78 70  FERENCES.    Exp
86a0: 72 4c 69 73 74 20 2a 70 45 78 74 72 61 20 3d 20  rList *pExtra = 
86b0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a  0;.#endif.    /*
86c0: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
86d0: 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53  ion is an EXISTS
86e0: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
86f0: 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20  , the actual.   
8700: 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72   ** values retur
8710: 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
8720: 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72  T are not requir
8730: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ed..    */.    u
8740: 38 20 65 63 65 6c 46 6c 61 67 73 3b 20 20 20 20  8 ecelFlags;    
8750: 2f 2a 20 22 65 63 65 6c 22 20 69 73 20 61 6e 20  /* "ecel" is an 
8760: 61 62 62 72 65 76 69 61 74 69 6f 6e 20 6f 66 20  abbreviation of 
8770: 22 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  "ExprCodeExprLis
8780: 74 22 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69  t" */.    ExprLi
8790: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
87a0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d  if( eDest==SRT_M
87b0: 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
87c0: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
87d0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
87e0: 29 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61  ){.      ecelFla
87f0: 67 73 20 3d 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs = SQLITE_ECEL
8800: 5f 44 55 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  _DUP;.    }else{
8810: 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73  .      ecelFlags
8820: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
8830: 69 66 28 20 70 53 6f 72 74 20 26 26 20 68 61 73  if( pSort && has
8840: 44 69 73 74 69 6e 63 74 3d 3d 30 20 26 26 20 65  Distinct==0 && e
8850: 44 65 73 74 21 3d 53 52 54 5f 45 70 68 65 6d 54  Dest!=SRT_EphemT
8860: 61 62 20 26 26 20 65 44 65 73 74 21 3d 53 52 54  ab && eDest!=SRT
8870: 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  _Table ){.      
8880: 2f 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  /* For each expr
8890: 65 73 73 69 6f 6e 20 69 6e 20 70 2d 3e 70 45 4c  ession in p->pEL
88a0: 69 73 74 20 74 68 61 74 20 69 73 20 61 20 63 6f  ist that is a co
88b0: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
88c0: 69 6f 6e 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ion in.      ** 
88d0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
88e0: 75 73 65 20 28 70 53 6f 72 74 2d 3e 70 4f 72 64  use (pSort->pOrd
88f0: 65 72 42 79 29 2c 20 73 65 74 20 74 68 65 20 61  erBy), set the a
8900: 73 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20 20  ssociated .     
8910: 20 2a 2a 20 69 4f 72 64 65 72 42 79 43 6f 6c 20   ** iOrderByCol 
8920: 76 61 6c 75 65 20 74 6f 20 6f 6e 65 20 6d 6f 72  value to one mor
8930: 65 20 74 68 61 6e 20 74 68 65 20 69 6e 64 65 78  e than the index
8940: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
8950: 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65   .      ** expre
8960: 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74 68 65  ssion within the
8970: 20 73 6f 72 74 2d 6b 65 79 20 74 68 61 74 20 70   sort-key that p
8980: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20  ushOntoSorter() 
8990: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20  will generate.. 
89a0: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 61 6c 6c       ** This all
89b0: 6f 77 73 20 74 68 65 20 70 2d 3e 70 45 4c 69 73  ows the p->pELis
89c0: 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 6f 6d  t field to be om
89d0: 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  itted from the s
89e0: 6f 72 74 65 64 20 72 65 63 6f 72 64 2c 0a 20 20  orted record,.  
89f0: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 73 70      ** saving sp
8a00: 61 63 65 20 61 6e 64 20 43 50 55 20 63 79 63 6c  ace and CPU cycl
8a10: 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65 63  es.  */.      ec
8a20: 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49  elFlags |= (SQLI
8a30: 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 7c  TE_ECEL_OMITREF|
8a40: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29  SQLITE_ECEL_REF)
8a50: 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  ;..      for(i=p
8a60: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69 3c  Sort->nOBSat; i<
8a70: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d  pSort->pOrderBy-
8a80: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
8a90: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
8aa0: 20 20 20 20 20 69 66 28 20 28 6a 20 3d 20 70 53       if( (j = pS
8ab0: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  ort->pOrderBy->a
8ac0: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
8ad0: 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  Col)>0 ){.      
8ae0: 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61      p->pEList->a
8af0: 5b 6a 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  [j-1].u.x.iOrder
8b00: 42 79 43 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f 72  ByCol = i+1-pSor
8b10: 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 20  t->nOBSat;.     
8b20: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
8b30: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
8b40: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
8b50: 43 45 53 0a 20 20 20 20 20 20 73 65 6c 65 63 74  CES.      select
8b60: 45 78 70 72 44 65 66 65 72 28 70 50 61 72 73 65  ExprDefer(pParse
8b70: 2c 20 70 53 6f 72 74 2c 20 70 2d 3e 70 45 4c 69  , pSort, p->pELi
8b80: 73 74 2c 20 26 70 45 78 74 72 61 29 3b 0a 20 20  st, &pExtra);.  
8b90: 20 20 20 20 69 66 28 20 70 45 78 74 72 61 20 26      if( pExtra &
8ba0: 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  & pParse->db->ma
8bb0: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
8bc0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
8bd0: 68 65 72 65 20 61 72 65 20 61 6e 79 20 65 78 74  here are any ext
8be0: 72 61 20 50 4b 20 63 6f 6c 75 6d 6e 73 20 74 6f  ra PK columns to
8bf0: 20 61 64 64 20 74 6f 20 74 68 65 20 73 6f 72 74   add to the sort
8c00: 65 72 20 72 65 63 6f 72 64 73 2c 0a 20 20 20 20  er records,.    
8c10: 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20      ** allocate 
8c20: 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 63 65 6c  extra memory cel
8c30: 6c 73 20 61 6e 64 20 61 64 6a 75 73 74 20 74 68  ls and adjust th
8c40: 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  e OpenEphemeral 
8c50: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 74  .        ** inst
8c60: 72 75 63 74 69 6f 6e 20 74 6f 20 61 63 63 6f 75  ruction to accou
8c70: 6e 74 20 66 6f 72 20 74 68 65 20 6c 61 72 67 65  nt for the large
8c80: 72 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  r records. This 
8c90: 69 73 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20 20  is only.        
8ca0: 2a 2a 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ** required if t
8cb0: 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
8cc0: 6d 6f 72 65 20 57 49 54 48 4f 55 54 20 52 4f 57  more WITHOUT ROW
8cd0: 49 44 20 74 61 62 6c 65 73 20 77 69 74 68 0a 20  ID tables with. 
8ce0: 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6f 73         ** compos
8cf0: 69 74 65 20 70 72 69 6d 61 72 79 20 6b 65 79 73  ite primary keys
8d00: 20 69 6e 20 74 68 65 20 53 6f 72 74 43 74 78 2e   in the SortCtx.
8d10: 61 44 65 66 65 72 5b 5d 20 61 72 72 61 79 2e 20  aDefer[] array. 
8d20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 56 64 62 65   */.        Vdbe
8d30: 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65  Op *pOp = sqlite
8d40: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 53  3VdbeGetOp(v, pS
8d50: 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64  ort->addrSortInd
8d60: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ex);.        pOp
8d70: 2d 3e 70 32 20 2b 3d 20 28 70 45 78 74 72 61 2d  ->p2 += (pExtra-
8d80: 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e  >nExpr - pSort->
8d90: 6e 44 65 66 65 72 29 3b 0a 20 20 20 20 20 20 20  nDefer);.       
8da0: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
8db0: 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 2b 3d 20  o->nAllField += 
8dc0: 28 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 20 2d  (pExtra->nExpr -
8dd0: 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 29 3b   pSort->nDefer);
8de0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
8df0: 3e 6e 4d 65 6d 20 2b 3d 20 70 45 78 74 72 61 2d  >nMem += pExtra-
8e00: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a  >nExpr;.      }.
8e10: 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a  #endif..      /*
8e20: 20 41 64 6a 75 73 74 20 6e 52 65 73 75 6c 74 43   Adjust nResultC
8e30: 6f 6c 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  ol to account fo
8e40: 72 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  r columns that a
8e50: 72 65 20 6f 6d 69 74 74 65 64 0a 20 20 20 20 20  re omitted.     
8e60: 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 6f 72   ** from the sor
8e70: 74 65 72 20 62 79 20 74 68 65 20 6f 70 74 69 6d  ter by the optim
8e80: 69 7a 61 74 69 6f 6e 73 20 69 6e 20 74 68 69 73  izations in this
8e90: 20 62 72 61 6e 63 68 20 2a 2f 0a 20 20 20 20 20   branch */.     
8ea0: 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
8eb0: 69 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ist;.      for(i
8ec0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
8ed0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
8ee0: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
8ef0: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
8f00: 43 6f 6c 3e 30 0a 23 69 66 64 65 66 20 53 51 4c  Col>0.#ifdef SQL
8f10: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45  ITE_ENABLE_SORTE
8f20: 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20  R_REFERENCES.   
8f30: 20 20 20 20 20 20 7c 7c 20 70 45 4c 69 73 74 2d        || pEList-
8f40: 3e 61 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65 66  >a[i].bSorterRef
8f50: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
8f60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 52 65  ){.          nRe
8f70: 73 75 6c 74 43 6f 6c 2d 2d 3b 0a 20 20 20 20 20  sultCol--;.     
8f80: 20 20 20 20 20 72 65 67 4f 72 69 67 20 3d 20 30       regOrig = 0
8f90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8fa0: 20 20 7d 0a 0a 20 20 20 20 20 20 74 65 73 74 63    }..      testc
8fb0: 61 73 65 28 20 72 65 67 4f 72 69 67 20 29 3b 0a  ase( regOrig );.
8fc0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8fd0: 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 29  eDest==SRT_Set )
8fe0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8ff0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  ( eDest==SRT_Mem
9000: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
9010: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  se( eDest==SRT_C
9020: 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20  oroutine );.    
9030: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
9040: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
9050: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
9060: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 7c 7c  Dest==SRT_Set ||
9070: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20   eDest==SRT_Mem 
9080: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65  .           || e
9090: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
90a0: 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  ine || eDest==SR
90b0: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
90c0: 7d 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64 49 6e  }.    sRowLoadIn
90d0: 66 6f 2e 72 65 67 52 65 73 75 6c 74 20 3d 20 72  fo.regResult = r
90e0: 65 67 52 65 73 75 6c 74 3b 0a 20 20 20 20 73 52  egResult;.    sR
90f0: 6f 77 4c 6f 61 64 49 6e 66 6f 2e 65 63 65 6c 46  owLoadInfo.ecelF
9100: 6c 61 67 73 20 3d 20 65 63 65 6c 46 6c 61 67 73  lags = ecelFlags
9110: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
9120: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
9130: 46 45 52 45 4e 43 45 53 0a 20 20 20 20 73 52 6f  FERENCES.    sRo
9140: 77 4c 6f 61 64 49 6e 66 6f 2e 70 45 78 74 72 61  wLoadInfo.pExtra
9150: 20 3d 20 70 45 78 74 72 61 3b 0a 20 20 20 20 73   = pExtra;.    s
9160: 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 72 65 67 45  RowLoadInfo.regE
9170: 78 74 72 61 52 65 73 75 6c 74 20 3d 20 72 65 67  xtraResult = reg
9180: 52 65 73 75 6c 74 20 2b 20 6e 52 65 73 75 6c 74  Result + nResult
9190: 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 70 45 78  Col;.    if( pEx
91a0: 74 72 61 20 29 20 6e 52 65 73 75 6c 74 43 6f 6c  tra ) nResultCol
91b0: 20 2b 3d 20 70 45 78 74 72 61 2d 3e 6e 45 78 70   += pExtra->nExp
91c0: 72 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  r;.#endif.    if
91d0: 28 20 70 2d 3e 69 4c 69 6d 69 74 0a 20 20 20 20  ( p->iLimit.    
91e0: 20 26 26 20 28 65 63 65 6c 46 6c 61 67 73 20 26   && (ecelFlags &
91f0: 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49   SQLITE_ECEL_OMI
9200: 54 52 45 46 29 21 3d 30 20 0a 20 20 20 20 20 26  TREF)!=0 .     &
9210: 26 20 6e 50 72 65 66 69 78 52 65 67 3e 30 0a 20  & nPrefixReg>0. 
9220: 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
9230: 72 74 28 20 70 53 6f 72 74 21 3d 30 20 29 3b 0a  rt( pSort!=0 );.
9240: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 68 61        assert( ha
9250: 73 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a  sDistinct==0 );.
9260: 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 70 44 65        pSort->pDe
9270: 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 20 3d 20  ferredRowLoad = 
9280: 26 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 0a 20  &sRowLoadInfo;. 
9290: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
92a0: 69 6e 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77  innerLoopLoadRow
92b0: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73 52 6f  (pParse, p, &sRo
92c0: 77 4c 6f 61 64 49 6e 66 6f 29 3b 0a 20 20 20 20  wLoadInfo);.    
92d0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
92e0: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
92f0: 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20  ord was present 
9300: 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  on the SELECT st
9310: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64  atement.  ** and
9320: 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65   this row has be
9330: 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20  en seen before, 
9340: 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65  then do not make
9350: 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70   this row.  ** p
9360: 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c  art of the resul
9370: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61  t..  */.  if( ha
9380: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
9390: 20 73 77 69 74 63 68 28 20 70 44 69 73 74 69 6e   switch( pDistin
93a0: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b  ct->eTnctType ){
93b0: 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
93c0: 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
93d0: 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64  ED: {.        Vd
93e0: 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20  beOp *pOp;      
93f0: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67        /* No long
9400: 65 72 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e  er required Open
9410: 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e  Ephemeral instr.
9420: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
9430: 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20  iJump;          
9440: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74      /* Jump dest
9450: 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ination */.     
9460: 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20     int regPrev; 
9470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
9480: 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65  evious row conte
9490: 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  nt */..        /
94a0: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
94b0: 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
94c0: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20  s row */.       
94d0: 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73   regPrev = pPars
94e0: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
94f0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
9500: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a  += nResultCol;..
9510: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
9520: 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
9530: 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72  emeral coded ear
9540: 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75  lier to an OP_Nu
9550: 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  ll.        ** se
9560: 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72  ts the MEM_Clear
9570: 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69  ed bit on the fi
9580: 72 73 74 20 72 65 67 69 73 74 65 72 20 6f 66 20  rst register of 
9590: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
95a0: 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20  revious value.  
95b0: 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
95c0: 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20  the OP_Ne below 
95d0: 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20  to always.      
95e0: 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65    ** fail on the
95f0: 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
9600: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65   of the loop eve
9610: 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  n if the first. 
9620: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73         ** row is
9630: 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20   all NULLs..    
9640: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
9650: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
9660: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
9670: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
9680: 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71          pOp = sq
9690: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
96a0: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
96b0: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
96c0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
96d0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  _Null;.        p
96e0: 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20  Op->p1 = 1;.    
96f0: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65      pOp->p2 = re
9700: 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20  gPrev;..        
9710: 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  iJump = sqlite3V
9720: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
9730: 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  ) + nResultCol;.
9740: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
9750: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
9760: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43  ++){.          C
9770: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
9780: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
9790: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  eq(pParse, p->pE
97a0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
97b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
97c0: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20   i<nResultCol-1 
97d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
97e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
97f0: 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65  (v, OP_Ne, regRe
9800: 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72  sult+i, iJump, r
9810: 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20  egPrev+i);.     
9820: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
9830: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
9840: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9850: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9860: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c  AddOp3(v, OP_Eq,
9870: 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43   regResult+i, iC
9880: 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76  ontinue, regPrev
9890: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
98a0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
98b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ;.           }. 
98c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
98d0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
98e0: 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  -1, (const char 
98f0: 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
9900: 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20  SEQ);.          
9910: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
9920: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55  eP5(v, SQLITE_NU
9930: 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d  LLEQ);.        }
9940: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9950: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
9960: 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d  entAddr(v)==iJum
9970: 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  p || pParse->db-
9980: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
9990: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
99a0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
99b0: 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74  _Copy, regResult
99c0: 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75  , regPrev, nResu
99d0: 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20  ltCol-1);.      
99e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
99f0: 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  ..      case WHE
9a00: 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
9a10: 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  UE: {.        sq
9a20: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
9a30: 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e  oNoop(v, pDistin
9a40: 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20  ct->addrTnct);. 
9a50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9a60: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66      }..      def
9a70: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
9a80: 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e 63  assert( pDistinc
9a90: 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48  t->eTnctType==WH
9aa0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
9ab0: 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20  RDERED );.      
9ac0: 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
9ad0: 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74  Parse, pDistinct
9ae0: 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74  ->tabTnct, iCont
9af0: 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  inue, nResultCol
9b00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9b10: 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74         regResult
9b20: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
9b30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9b40: 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30      if( pSort==0
9b50: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
9b60: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
9b70: 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  et, iContinue);.
9b80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69      }.  }..  swi
9b90: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
9ba0: 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64    /* In this mod
9bb0: 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75  e, write each qu
9bc0: 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68  ery result to th
9bd0: 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d  e key of the tem
9be0: 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61  porary.    ** ta
9bf0: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
9c00: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
9c10: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
9c20: 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20 53  ELECT.    case S
9c30: 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20  RT_Union: {.    
9c40: 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20    int r1;.      
9c50: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
9c60: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
9c70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9c80: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
9c90: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
9ca0: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  ult, nResultCol,
9cb0: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
9cc0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
9cd0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
9ce0: 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67  , iParm, r1, reg
9cf0: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
9d00: 6f 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ol);.      sqlit
9d10: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
9d20: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
9d30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9d40: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75  ..    /* Constru
9d50: 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d  ct a record from
9d60: 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
9d70: 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f  t, but instead o
9d80: 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20  f.    ** saving 
9d90: 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65  that record, use
9da0: 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20   it as a key to 
9db0: 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20  delete elements 
9dc0: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
9dd0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
9de0: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  iParm..    */.  
9df0: 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70    case SRT_Excep
9e00: 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t: {.      sqlit
9e10: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
9e20: 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50  OP_IdxDelete, iP
9e30: 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  arm, regResult, 
9e40: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
9e50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9e60: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9e70: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
9e80: 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a  ELECT */..    /*
9e90: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
9ea0: 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
9eb0: 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
9ec0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
9ed0: 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65  T_Fifo:.    case
9ee0: 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20   SRT_DistFifo:. 
9ef0: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
9f00: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
9f10: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
9f20: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
9f30: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
9f40: 50 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52 65  Parse, nPrefixRe
9f50: 67 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  g+1);.      test
9f60: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
9f70: 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
9f80: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
9f90: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b  =SRT_EphemTab );
9fa0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9fb0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f   eDest==SRT_Fifo
9fc0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
9fd0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  se( eDest==SRT_D
9fe0: 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 20 20 20  istFifo );.     
9ff0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a000: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
a010: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
a020: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e  nResultCol, r1+n
a030: 50 72 65 66 69 78 52 65 67 29 3b 0a 23 69 66 6e  PrefixReg);.#ifn
a040: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a050: 43 54 45 0a 20 20 20 20 20 20 69 66 28 20 65 44  CTE.      if( eD
a060: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66  est==SRT_DistFif
a070: 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  o ){.        /* 
a080: 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
a090: 6f 6e 20 69 73 20 44 69 73 74 46 69 66 6f 2c 20  on is DistFifo, 
a0a0: 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61  then cursor (iPa
a0b0: 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20  rm+1) is open.  
a0c0: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20 65        ** on an e
a0d0: 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e 20  phemeral index. 
a0e0: 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  If the current r
a0f0: 6f 77 20 69 73 20 61 6c 72 65 61 64 79 20 70 72  ow is already pr
a100: 65 73 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  esent.        **
a110: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 64   in the index, d
a120: 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20 74  o not write it t
a130: 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 49 66  o the output. If
a140: 20 6e 6f 74 2c 20 61 64 64 20 74 68 65 0a 20 20   not, add the.  
a150: 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
a160: 20 72 6f 77 20 74 6f 20 74 68 65 20 69 6e 64 65   row to the inde
a170: 78 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69  x and proceed wi
a180: 74 68 20 77 72 69 74 69 6e 67 20 69 74 20 74 6f  th writing it to
a190: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
a1a0: 6f 75 74 70 75 74 20 74 61 62 6c 65 20 61 73 20  output table as 
a1b0: 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20  well.  */.      
a1c0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
a1d0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
a1e0: 64 64 72 28 76 29 20 2b 20 34 3b 0a 20 20 20 20  ddr(v) + 4;.    
a1f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a200: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
a210: 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 61  ound, iParm+1, a
a220: 64 64 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20  ddr, r1, 0);.   
a230: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
a240: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
a250: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
a260: 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
a270: 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31 2c  rt, iParm+1, r1,
a280: 72 65 67 52 65 73 75 6c 74 2c 6e 52 65 73 75 6c  regResult,nResul
a290: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 61  tCol);.        a
a2a0: 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20  ssert( pSort==0 
a2b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
a2c0: 66 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  f.      if( pSor
a2d0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  t ){.        ass
a2e0: 65 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d  ert( regResult==
a2f0: 72 65 67 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  regOrig );.     
a300: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
a310: 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c  r(pParse, pSort,
a320: 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65   p, r1+nPrefixRe
a330: 67 2c 20 72 65 67 4f 72 69 67 2c 20 31 2c 20 6e  g, regOrig, 1, n
a340: 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20  PrefixReg);.    
a350: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a360: 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
a370: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
a380: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
a390: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a3a0: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
a3b0: 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20  Parm, r2);.     
a3c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a3d0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
a3e0: 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32  t, iParm, r1, r2
a3f0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a400: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
a410: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
a420: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a430: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
a440: 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
a450: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
a460: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
a470: 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e  ge(pParse, r1, n
a480: 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20  PrefixReg+1);.  
a490: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a4a0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
a4b0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
a4c0: 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
a4d0: 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66  creating a set f
a4e0: 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28  or an "expr IN (
a4f0: 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e  SELECT ...)" con
a500: 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74  struct,.    ** t
a510: 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64  hen there should
a520: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65   be a single ite
a530: 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  m on the stack. 
a540: 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20   Write this.    
a550: 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65  ** item into the
a560: 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20   set table with 
a570: 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20  bogus data..    
a580: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
a590: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  Set: {.      if(
a5a0: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
a5b0: 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c    /* At first gl
a5c0: 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74  ance you would t
a5d0: 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70  hink we could op
a5e0: 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20  timize out the. 
a5f0: 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20         ** ORDER 
a600: 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  BY in this case 
a610: 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20  since the order 
a620: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
a630: 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a  e set.        **
a640: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
a650: 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67  .  But there mig
a660: 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c  ht be a LIMIT cl
a670: 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20  ause, in which. 
a680: 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
a690: 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61  he order does ma
a6a0: 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  tter */.        
a6b0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a  pushOntoSorter(.
a6c0: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
a6d0: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65  se, pSort, p, re
a6e0: 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67  gResult, regOrig
a6f0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50  , nResultCol, nP
a700: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
a710: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a720: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
a730: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
a740: 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  e);.        asse
a750: 72 74 28 20 73 71 6c 69 74 65 33 53 74 72 6c 65  rt( sqlite3Strle
a760: 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66 53  n30(pDest->zAffS
a770: 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c  dst)==nResultCol
a780: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
a790: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
a7a0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
a7b0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
a7c0: 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20 20 20 20  ltCol, .        
a7d0: 20 20 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a      r1, pDest->z
a7e0: 41 66 66 53 64 73 74 2c 20 6e 52 65 73 75 6c 74  AffSdst, nResult
a7f0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
a800: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
a810: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
a820: 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  rse, regResult, 
a830: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
a840: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a850: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
a860: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
a870: 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74 2c  , r1, regResult,
a880: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
a890: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
a8a0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
a8b0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d  se, r1);.      }
a8c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a8d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
a8e0: 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20  ny row exist in 
a8f0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
a900: 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74  record that fact
a910: 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20   and abort..    
a920: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
a930: 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20  Exists: {.      
a940: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a950: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
a960: 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20   1, iParm);.    
a970: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
a980: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
a990: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
a9a0: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
a9b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
a9c0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
a9d0: 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
a9e0: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
a9f0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
aa00: 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
aa10: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
aa20: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
aa30: 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20 61 72 72  mory cell or arr
aa40: 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a 20 6d 65  ay of .    ** me
aa50: 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20 62  mory cells and b
aa60: 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
aa70: 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
aa80: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  /.    case SRT_M
aa90: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  em: {.      if( 
aaa0: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  pSort ){.       
aab0: 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74   assert( nResult
aac0: 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e 53 64 73  Col<=pDest->nSds
aad0: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73  t );.        pus
aae0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 20  hOntoSorter(.   
aaf0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
ab00: 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65   pSort, p, regRe
ab10: 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e  sult, regOrig, n
ab20: 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66  ResultCol, nPref
ab30: 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65  ixReg);.      }e
ab40: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
ab50: 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d  ert( nResultCol=
ab60: 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29 3b  =pDest->nSdst );
ab70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
ab80: 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61 72   regResult==iPar
ab90: 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  m );.        /* 
aba0: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
abb0: 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f   will jump out o
abc0: 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  f the loop for u
abd0: 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  s */.      }.   
abe0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
abf0: 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
ac00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
ac10: 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63  BQUERY */..    c
ac20: 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  ase SRT_Coroutin
ac30: 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e 64  e:       /* Send
ac40: 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f   data to a co-ro
ac50: 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73  utine */.    cas
ac60: 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20  e SRT_Output: { 
ac70: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
ac80: 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
ac90: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
aca0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
acb0: 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  tine );.      te
acc0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
acd0: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
ace0: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
acf0: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
ad00: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
ad10: 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75  Sort, p, regResu
ad20: 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52 65  lt, regOrig, nRe
ad30: 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20  sultCol,.       
ad40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad50: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
ad60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65     }else if( eDe
ad70: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
ad80: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
ad90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
ada0: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
adb0: 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
adc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
add0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ade0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
adf0: 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  Row, regResult, 
ae00: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
ae10: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ae20: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
ae30: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
ae40: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
ae50: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
ae60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
ae70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ae80: 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57  MIT_CTE.    /* W
ae90: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
aea0: 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79   into a priority
aeb0: 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20 6f   queue that is o
aec0: 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  rder according t
aed0: 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e  o.    ** pDest->
aee0: 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f  pOrderBy (in pSO
aef0: 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ).  pDest->iSDPa
af00: 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73  rm (in iParm) is
af10: 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   the cursor for 
af20: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  an.    ** index 
af30: 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b  with pSO->nExpr+
af40: 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c  2 columns.  Buil
af50: 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53  d a key using pS
af60: 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a  O for the first.
af70: 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70      ** pSO->nExp
af80: 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  r columns, then 
af90: 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65  make sure all ke
afa0: 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62 79  ys are unique by
afb0: 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a   adding a.    **
afc0: 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e   final OP_Sequen
afd0: 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  ce column.  The 
afe0: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74  last column is t
aff0: 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20 62  he record as a b
b000: 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lob..    */.    
b010: 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75 65  case SRT_DistQue
b020: 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ue:.    case SRT
b030: 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20  _Queue: {.      
b040: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20  int nKey;.      
b050: 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
b060: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 65        int addrTe
b070: 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78  st = 0;.      Ex
b080: 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20  prList *pSO;.   
b090: 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e     pSO = pDest->
b0a0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
b0b0: 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20  assert( pSO );. 
b0c0: 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d       nKey = pSO-
b0d0: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31  >nExpr;.      r1
b0e0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
b0f0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
b100: 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
b110: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
b120: 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20  rse, nKey+2);.  
b130: 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79      r3 = r2+nKey
b140: 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  +1;.      if( eD
b150: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
b160: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ue ){.        /*
b170: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
b180: 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75 65  ion is DistQueue
b190: 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69  , then cursor (i
b1a0: 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a  Parm+1) is open.
b1b0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20          ** on a 
b1c0: 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c  second ephemeral
b1d0: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
b1e0: 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65  s all values eve
b1f0: 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  ry previously.  
b200: 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
b210: 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a  o the queue. */.
b220: 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73 74          addrTest
b230: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
b240: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
b250: 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c  und, iParm+1, 0,
b260: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
b270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b280: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
b290: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
b2a0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
b2b0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
b2c0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
b2d0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b2e0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
b2f0: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
b300: 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69  ol, r3);.      i
b310: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  f( eDest==SRT_Di
b320: 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20  stQueue ){.     
b330: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b340: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
b350: 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72  sert, iParm+1, r
b360: 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  3);.        sqli
b370: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
b380: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
b390: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20  KRESULT);.      
b3a0: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
b3b0: 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20   i<nKey; i++){. 
b3c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b3d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
b3e0: 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20  Copy,.          
b3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b400: 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d  regResult + pSO-
b410: 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
b420: 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20  ByCol - 1,.     
b430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b440: 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20       r2+i);.    
b450: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
b460: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b470: 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72  P_Sequence, iPar
b480: 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20  m, r2+nKey);.   
b490: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b4a0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
b4b0: 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b  ecord, r2, nKey+
b4c0: 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  2, r1);.      sq
b4d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
b4e0: 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
b4f0: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
b500: 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20  2, nKey+2);.    
b510: 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20 29    if( addrTest )
b520: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
b530: 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73 74  Here(v, addrTest
b540: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b550: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
b560: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
b570: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
b580: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
b590: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  , r2, nKey+2);. 
b5a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b5b0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b5c0: 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
b5d0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
b5e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
b5f0: 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  ER).    /* Disca
b600: 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  rd the results. 
b610: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
b620: 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
b630: 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a  nts inside.    *
b640: 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  * the body of a 
b650: 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75  TRIGGER.  The pu
b660: 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65  rpose of such se
b670: 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c  lects is to call
b680: 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66  .    ** user-def
b690: 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74  ined functions t
b6a0: 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66  hat have side ef
b6b0: 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f  fects.  We do no
b6c0: 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62  t care.    ** ab
b6d0: 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72  out the actual r
b6e0: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
b6f0: 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lect..    */.   
b700: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
b710: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
b720: 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a  =SRT_Discard );.
b730: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b740: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
b750: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
b760: 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
b770: 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
b780: 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70 74  reached.  Except
b790: 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20  , if.  ** there 
b7a0: 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20  is a sorter, in 
b7b0: 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 73  which case the s
b7c0: 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61 64  orter has alread
b7d0: 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74  y limited.  ** t
b7e0: 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73  he output for us
b7f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 6f  ..  */.  if( pSo
b800: 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d  rt==0 && p->iLim
b810: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
b820: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b830: 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20  P_DecrJumpZero, 
b840: 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
b850: 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
b860: 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (v);.  }.}../*.*
b870: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79  * Allocate a Key
b880: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66 66  Info object suff
b890: 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e  icient for an in
b8a0: 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c  dex of N key col
b8b0: 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78  umns and.** X ex
b8c0: 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a  tra columns..*/.
b8d0: 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
b8e0: 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c  KeyInfoAlloc(sql
b8f0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c  ite3 *db, int N,
b900: 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20 6e   int X){.  int n
b910: 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28 73  Extra = (N+X)*(s
b920: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
b930: 31 29 20 2d 20 73 69 7a 65 6f 66 28 43 6f 6c 6c  1) - sizeof(Coll
b940: 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49 6e 66 6f  Seq*);.  KeyInfo
b950: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d   *p = sqlite3DbM
b960: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
b970: 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b  izeof(KeyInfo) +
b980: 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20   nExtra);.  if( 
b990: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72  p ){.    p->aSor
b9a0: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
b9b0: 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20  ->aColl[N+X];.  
b9c0: 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 3d    p->nKeyField =
b9d0: 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e   (u16)N;.    p->
b9e0: 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28 75 31 36  nAllField = (u16
b9f0: 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70 2d 3e 65  )(N+X);.    p->e
ba00: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
ba10: 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20    p->db = db;.  
ba20: 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20    p->nRef = 1;. 
ba30: 20 20 20 6d 65 6d 73 65 74 28 26 70 5b 31 5d 2c     memset(&p[1],
ba40: 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 7d   0, nExtra);.  }
ba50: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
ba60: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
ba70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
ba80: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
ba90: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  te a KeyInfo obj
baa0: 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ect.*/.void sqli
bab0: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
bac0: 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  KeyInfo *p){.  i
bad0: 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65  f( p ){.    asse
bae0: 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b  rt( p->nRef>0 );
baf0: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a  .    p->nRef--;.
bb00: 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d      if( p->nRef=
bb10: 3d 30 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  =0 ) sqlite3DbFr
bb20: 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70 29 3b 0a  eeNN(p->db, p);.
bb30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
bb40: 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20  e a new pointer 
bb50: 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  to a KeyInfo obj
bb60: 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a  ect.*/.KeyInfo *
bb70: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
bb80: 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20  f(KeyInfo *p){. 
bb90: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73   if( p ){.    as
bba0: 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20  sert( p->nRef>0 
bbb0: 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b  );.    p->nRef++
bbc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
bbd0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
bbe0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  TE_DEBUG./*.** R
bbf0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20  eturn TRUE if a 
bc00: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63  KeyInfo object c
bc10: 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20 54  an be change.  T
bc20: 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63  he KeyInfo objec
bc30: 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65  t.** can only be
bc40: 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 69 73   changed if this
bc50: 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c   is just a singl
bc60: 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
bc70: 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  he object..**.**
bc80: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
bc90: 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64   used only insid
bca0: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
bcb0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74  atements..*/.int
bcc0: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
bcd0: 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49 6e  sWriteable(KeyIn
bce0: 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20 70  fo *p){ return p
bcf0: 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e  ->nRef==1; }.#en
bd00: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
bd10: 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69  BUG */../*.** Gi
bd20: 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ven an expressio
bd30: 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65  n list, generate
bd40: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
bd50: 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72 64  ture that record
bd60: 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69  s.** the collati
bd70: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
bd80: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
bd90: 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69  in that expressi
bda0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  on list..**.** I
bdb0: 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69  f the ExprList i
bdc0: 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  s an ORDER BY or
bdd0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
bde0: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
bdf0: 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73  ing.** KeyInfo s
be00: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
be10: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
be20: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
be30: 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69  al index to.** i
be40: 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c  mplement that cl
be50: 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45 78  ause.  If the Ex
be60: 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72 65  prList is the re
be70: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
be80: 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65  LECT.** then the
be90: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
bea0: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
beb0: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
bec0: 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20  ng a virtual.** 
bed0: 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65  index to impleme
bee0: 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74 65  nt a DISTINCT te
bef0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  st..**.** Space 
bf00: 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49  to hold the KeyI
bf10: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
bf20: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
bf30: 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c  alloc.  The call
bf40: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
bf50: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
bf60: 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74  or seeing that t
bf70: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
bf80: 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
bf90: 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reed..*/.static 
bfa0: 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f  KeyInfo *keyInfo
bfb0: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
bfc0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
bfd0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
bfe0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
bff0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
c000: 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65    /* Form the Ke
c010: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f  yInfo object fro
c020: 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74 20  m this ExprList 
c030: 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c  */.  int iStart,
c040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
c050: 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c  in with this col
c060: 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a  umn of pList */.
c070: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20    int nExtra    
c080: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
c090: 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f  is many extra co
c0a0: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64  lumns to the end
c0b0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78   */.){.  int nEx
c0c0: 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  pr;.  KeyInfo *p
c0d0: 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45  Info;.  struct E
c0e0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
c0f0: 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tem;.  sqlite3 *
c100: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
c110: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78  .  int i;..  nEx
c120: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  pr = pList->nExp
c130: 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c  r;.  pInfo = sql
c140: 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
c150: 28 64 62 2c 20 6e 45 78 70 72 2d 69 53 74 61 72  (db, nExpr-iStar
c160: 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20 20  t, nExtra+1);.  
c170: 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
c180: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c190: 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
c1a0: 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20  le(pInfo) );.   
c1b0: 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20 70   for(i=iStart, p
c1c0: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53  Item=pList->a+iS
c1d0: 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69  tart; i<nExpr; i
c1e0: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
c1f0: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c      pInfo->aColl
c200: 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 73 71 6c  [i-iStart] = sql
c210: 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65  ite3ExprNNCollSe
c220: 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
c230: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70  >pExpr);.      p
c240: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
c250: 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74  [i-iStart] = pIt
c260: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
c270: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
c280: 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pInfo;.}../*.*
c290: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
c2a0: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
c2b0: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
c2c0: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
c2d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c2e0: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
c2f0: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
c300: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
c310: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
c320: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
c330: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
c340: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
c350: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
c360: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
c370: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
c380: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
c390: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
c3a0: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
c3b0: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
c3c0: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
c3d0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
c3e0: 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn z;.}..#ifnde
c3f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
c400: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65  PLAIN./*.** Unle
c410: 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51  ss an "EXPLAIN Q
c420: 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61  UERY PLAN" comma
c430: 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63  nd is being proc
c440: 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63  essed, this func
c450: 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  tion.** is a no-
c460: 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  op. Otherwise, i
c470: 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20  t adds a single 
c480: 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f  row of output to
c490: 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c   the EQP result,
c4a0: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61  .** where the ca
c4b0: 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ption is of the 
c4c0: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55  form:.**.**   "U
c4d0: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
c4e0: 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68  OR xxx".**.** wh
c4f0: 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f  ere xxx is one o
c500: 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f  f "DISTINCT", "O
c510: 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f  RDER BY" or "GRO
c520: 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20  UP BY". Exactly 
c530: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65  which.** is dete
c540: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55  rmined by the zU
c550: 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  sage argument..*
c560: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
c570: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50  plainTempTable(P
c580: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
c590: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65  nst char *zUsage
c5a0: 29 7b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72  ){.  ExplainQuer
c5b0: 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30  yPlan((pParse, 0
c5c0: 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52  , "USE TEMP B-TR
c5d0: 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61  EE FOR %s", zUsa
c5e0: 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ge));.}../*.** A
c5f0: 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e  ssign expression
c600: 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20   b to lvalue a. 
c610: 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c  A second, no-op,
c620: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73   version of this
c630: 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f   macro.** is pro
c640: 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54  vided when SQLIT
c650: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
c660: 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20  s defined. This 
c670: 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a  allows the code.
c680: 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ** in sqlite3Sel
c690: 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20  ect() to assign 
c6a0: 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74  values to struct
c6b0: 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61  ure member varia
c6c0: 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c  bles that.** onl
c6d0: 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54  y exist if SQLIT
c6e0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
c6f0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69  s not defined wi
c700: 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20  thout polluting 
c710: 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68  the.** code with
c720: 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69   #ifndef directi
c730: 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65  ves..*/.# define
c740: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
c750: 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a  er(a, b) a = b..
c760: 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76  #else./* No-op v
c770: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65  ersions of the e
c780: 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63  xplainXXX() func
c790: 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73  tions and macros
c7a0: 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  . */.# define ex
c7b0: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79  plainTempTable(y
c7c0: 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70  ,z).# define exp
c7d0: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79  lainSetInteger(y
c7e0: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ,z).#endif.../*.
c7f0: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
c800: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
c810: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
c820: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
c830: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
c840: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
c850: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
c860: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
c870: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
c880: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
c890: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
c8a0: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
c8b0: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
c8c0: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
c8d0: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
c8e0: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
c8f0: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
c900: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
c910: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
c920: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
c930: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
c940: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
c950: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
c960: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
c970: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
c980: 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74  t,   /* Informat
c990: 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52  ion on the ORDER
c9a0: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
c9b0: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
c9c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
c9d0: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
c9e0: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
c9f0: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
ca00: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
ca10: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56  s here */.){.  V
ca20: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
ca30: 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20  >pVdbe;         
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ca50: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
ca60: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61  ement */.  int a
ca70: 64 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72 74  ddrBreak = pSort
ca80: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20  ->labelDone;    
ca90: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
caa0: 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f  here to exit loo
cab0: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
cac0: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
cad0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
cae0: 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  );  /* Jump here
caf0: 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20   for next cycle 
cb00: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20  */.  int addr;  
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb20: 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6f       /* Top of o
cb30: 75 74 70 75 74 20 6c 6f 6f 70 2e 20 4a 75 6d 70  utput loop. Jump
cb40: 20 66 6f 72 20 4e 65 78 74 2e 20 2a 2f 0a 20 20   for Next. */.  
cb50: 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30  int addrOnce = 0
cb60: 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
cb70: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
cb80: 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  By = pSort->pOrd
cb90: 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65 73  erBy;.  int eDes
cba0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
cbb0: 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  ;.  int iParm = 
cbc0: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a  pDest->iSDParm;.
cbd0: 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20    int regRow;.  
cbe0: 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20 20  int regRowid;.  
cbf0: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20  int iCol;.  int 
cc00: 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  nKey;           
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
cc20: 75 6d 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c  umber of key col
cc30: 75 6d 6e 73 20 69 6e 20 73 6f 72 74 65 72 20 72  umns in sorter r
cc40: 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ecord */.  int i
cc50: 53 6f 72 74 54 61 62 3b 20 20 20 20 20 20 20 20  SortTab;        
cc60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
cc70: 72 74 65 72 20 63 75 72 73 6f 72 20 74 6f 20 72  rter cursor to r
cc80: 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ead from */.  in
cc90: 74 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b  t i;.  int bSeq;
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccb0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
ccc0: 66 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  f sorter record 
ccd0: 69 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f  includes seq. no
cce0: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 4b  . */.  int nRefK
ccf0: 65 79 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  ey = 0;.  struct
cd00: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
cd10: 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69  aOutEx = p->pELi
cd20: 73 74 2d 3e 61 3b 0a 0a 20 20 61 73 73 65 72 74  st->a;..  assert
cd30: 28 20 61 64 64 72 42 72 65 61 6b 3c 30 20 29 3b  ( addrBreak<0 );
cd40: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61  .  if( pSort->la
cd50: 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20  belBkOut ){.    
cd60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cd70: 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
cd80: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c  Sort->regReturn,
cd90: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
cda0: 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
cdb0: 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
cdc0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69  Break);.    sqli
cdd0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
cde0: 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61  bel(v, pSort->la
cdf0: 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 0a  belBkOut);.  }..
ce00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
ce10: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
ce20: 52 45 4e 43 45 53 0a 20 20 2f 2a 20 4f 70 65 6e  RENCES.  /* Open
ce30: 20 61 6e 79 20 63 75 72 73 6f 72 73 20 6e 65 65   any cursors nee
ce40: 64 65 64 20 66 6f 72 20 73 6f 72 74 65 72 2d 72  ded for sorter-r
ce50: 65 66 65 72 65 6e 63 65 20 65 78 70 72 65 73 73  eference express
ce60: 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ions */.  for(i=
ce70: 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e 44 65 66  0; i<pSort->nDef
ce80: 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 61  er; i++){.    Ta
ce90: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 6f 72  ble *pTab = pSor
cea0: 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 70 54 61  t->aDefer[i].pTa
ceb0: 62 3b 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d  b;.    int iDb =
cec0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
ced0: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
cee0: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
cef0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  ;.    sqlite3Ope
cf00: 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  nTable(pParse, p
cf10: 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e  Sort->aDefer[i].
cf20: 69 43 73 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  iCsr, iDb, pTab,
cf30: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
cf40: 20 20 20 6e 52 65 66 4b 65 79 20 3d 20 4d 41 58     nRefKey = MAX
cf50: 28 6e 52 65 66 4b 65 79 2c 20 70 53 6f 72 74 2d  (nRefKey, pSort-
cf60: 3e 61 44 65 66 65 72 5b 69 5d 2e 6e 4b 65 79 29  >aDefer[i].nKey)
cf70: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
cf80: 69 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45  iTab = pSort->iE
cf90: 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44  Cursor;.  if( eD
cfa0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
cfb0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
cfc0: 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65 73 74  routine || eDest
cfd0: 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20  ==SRT_Mem ){.   
cfe0: 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20   regRowid = 0;. 
cff0: 20 20 20 72 65 67 52 6f 77 20 3d 20 70 44 65 73     regRow = pDes
d000: 74 2d 3e 69 53 64 73 74 3b 0a 20 20 7d 65 6c 73  t->iSdst;.  }els
d010: 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20  e{.    regRowid 
d020: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
d030: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
d040: 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65   regRow = sqlite
d050: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
d060: 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  arse, nColumn);.
d070: 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72    }.  nKey = pOr
d080: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70  derBy->nExpr - p
d090: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20  Sort->nOBSat;.  
d0a0: 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46  if( pSort->sortF
d0b0: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
d0c0: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
d0d0: 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20   int regSortOut 
d0e0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
d0f0: 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d  ;.    iSortTab =
d100: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
d110: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  .    if( pSort->
d120: 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20  labelBkOut ){.  
d130: 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73      addrOnce = s
d140: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
d150: 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
d160: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
d170: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
d180: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d190: 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f  _OpenPseudo, iSo
d1a0: 72 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75  rtTab, regSortOu
d1b0: 74 2c 20 0a 20 20 20 20 20 20 20 20 6e 4b 65 79  t, .        nKey
d1c0: 2b 31 2b 6e 43 6f 6c 75 6d 6e 2b 6e 52 65 66 4b  +1+nColumn+nRefK
d1d0: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  ey);.    if( add
d1e0: 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33 56  rOnce ) sqlite3V
d1f0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
d200: 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64  ddrOnce);.    ad
d210: 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  dr = 1 + sqlite3
d220: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d230: 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61  _SorterSort, iTa
d240: 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  b, addrBreak);. 
d250: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
d260: 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73  v);.    codeOffs
d270: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
d280: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
d290: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d2a0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  AddOp3(v, OP_Sor
d2b0: 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72  terData, iTab, r
d2c0: 65 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72 74  egSortOut, iSort
d2d0: 54 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20 3d  Tab);.    bSeq =
d2e0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
d2f0: 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69   addr = 1 + sqli
d300: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d310: 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20   OP_Sort, iTab, 
d320: 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65  addrBreak); Vdbe
d330: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
d340: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
d350: 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43  ->iOffset, addrC
d360: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69 53  ontinue);.    iS
d370: 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a 20  ortTab = iTab;. 
d380: 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d     bSeq = 1;.  }
d390: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f 6c  .  for(i=0, iCol
d3a0: 3d 6e 4b 65 79 2b 62 53 65 71 2d 31 3b 20 69 3c  =nKey+bSeq-1; i<
d3b0: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 23  nColumn; i++){.#
d3c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d3d0: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
d3e0: 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20 61 4f  ENCES.    if( aO
d3f0: 75 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65 72 52  utEx[i].bSorterR
d400: 65 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23  ef ) continue;.#
d410: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 61 4f  endif.    if( aO
d420: 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  utEx[i].u.x.iOrd
d430: 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 69 43 6f  erByCol==0 ) iCo
d440: 6c 2b 2b 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  l++;.  }.#ifdef 
d450: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
d460: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
d470: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6e 44 65    if( pSort->nDe
d480: 66 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  fer ){.    int i
d490: 4b 65 79 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20  Key = iCol+1;.  
d4a0: 20 20 69 6e 74 20 72 65 67 4b 65 79 20 3d 20 73    int regKey = s
d4b0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
d4c0: 67 65 28 70 50 61 72 73 65 2c 20 6e 52 65 66 4b  ge(pParse, nRefK
d4d0: 65 79 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ey);..    for(i=
d4e0: 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e 44 65 66  0; i<pSort->nDef
d4f0: 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  er; i++){.      
d500: 69 6e 74 20 69 43 73 72 20 3d 20 70 53 6f 72 74  int iCsr = pSort
d510: 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 69 43 73 72  ->aDefer[i].iCsr
d520: 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  ;.      Table *p
d530: 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65  Tab = pSort->aDe
d540: 66 65 72 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20  fer[i].pTab;.   
d550: 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 53     int nKey = pS
d560: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e  ort->aDefer[i].n
d570: 4b 65 79 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  Key;..      sqli
d580: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
d590: 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 73   OP_NullRow, iCs
d5a0: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 48 61  r);.      if( Ha
d5b0: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
d5c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d5d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d5e0: 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62  Column, iSortTab
d5f0: 2c 20 69 4b 65 79 2b 2b 2c 20 72 65 67 4b 65 79  , iKey++, regKey
d600: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d610: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d620: 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 69 43  OP_SeekRowid, iC
d630: 73 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  sr, .           
d640: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
d650: 65 6e 74 41 64 64 72 28 76 29 2b 31 2c 20 72 65  entAddr(v)+1, re
d660: 67 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  gKey);.      }el
d670: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
d680: 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  k;.        int i
d690: 4a 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Jmp;.        ass
d6a0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 72 69 6d  ert( sqlite3Prim
d6b0: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
d6c0: 29 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 4b 65 79  )->nKeyCol==nKey
d6d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
d6e0: 6b 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b  k=0; k<nKey; k++
d6f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
d700: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
d710: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f  , OP_Column, iSo
d720: 72 74 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20 72  rtTab, iKey++, r
d730: 65 67 4b 65 79 2b 6b 29 3b 0a 20 20 20 20 20 20  egKey+k);.      
d740: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 4a 6d 70    }.        iJmp
d750: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
d760: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
d770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d780: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
d790: 5f 53 65 65 6b 47 45 2c 20 69 43 73 72 2c 20 69  _SeekGE, iCsr, i
d7a0: 4a 6d 70 2b 32 2c 20 72 65 67 4b 65 79 2c 20 6e  Jmp+2, regKey, n
d7b0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Key);.        sq
d7c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
d7d0: 6e 74 28 76 2c 20 4f 50 5f 49 64 78 4c 45 2c 20  nt(v, OP_IdxLE, 
d7e0: 69 43 73 72 2c 20 69 4a 6d 70 2b 33 2c 20 72 65  iCsr, iJmp+3, re
d7f0: 67 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20  gKey, nKey);.   
d800: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d810: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
d820: 6c 52 6f 77 2c 20 69 43 73 72 29 3b 0a 20 20 20  lRow, iCsr);.   
d830: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
d840: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
d850: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
d860: 65 67 4b 65 79 2c 20 6e 52 65 66 4b 65 79 29 3b  egKey, nRefKey);
d870: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f  .  }.#endif.  fo
d880: 72 28 69 3d 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 69  r(i=nColumn-1; i
d890: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 23 69 66 64 65  >=0; i--){.#ifde
d8a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d8b0: 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
d8c0: 53 0a 20 20 20 20 69 66 28 20 61 4f 75 74 45 78  S.    if( aOutEx
d8d0: 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65 66 20 29  [i].bSorterRef )
d8e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
d8f0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
d900: 61 4f 75 74 45 78 5b 69 5d 2e 70 45 78 70 72 2c  aOutEx[i].pExpr,
d910: 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20   regRow+i);.    
d920: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
d930: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 52 65   {.      int iRe
d940: 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4f  ad;.      if( aO
d950: 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  utEx[i].u.x.iOrd
d960: 65 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20  erByCol ){.     
d970: 20 20 20 69 52 65 61 64 20 3d 20 61 4f 75 74 45     iRead = aOutE
d980: 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  x[i].u.x.iOrderB
d990: 79 43 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 7d 65  yCol-1;.      }e
d9a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 52 65  lse{.        iRe
d9b0: 61 64 20 3d 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20  ad = iCol--;.   
d9c0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
d9d0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d9e0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74  OP_Column, iSort
d9f0: 54 61 62 2c 20 69 52 65 61 64 2c 20 72 65 67 52  Tab, iRead, regR
da00: 6f 77 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62  ow+i);.      Vdb
da10: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
da20: 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61  ", aOutEx[i].zNa
da30: 6d 65 3f 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61  me?aOutEx[i].zNa
da40: 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a  me : aOutEx[i].z
da50: 53 70 61 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Span));.    }.  
da60: 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  }.  switch( eDes
da70: 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52  t ){.    case SR
da80: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
da90: 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
daa0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
dab0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
dac0: 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c  NewRowid, iParm,
dad0: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
dae0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
daf0: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
db00: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c  , iParm, regRow,
db10: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
db20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
db30: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
db40: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62  APPEND);.      b
db50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
db60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
db70: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
db80: 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
db90: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
dba0: 6d 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65  mn==sqlite3Strle
dbb0: 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66 53  n30(pDest->zAffS
dbc0: 64 73 74 29 20 29 3b 0a 20 20 20 20 20 20 73 71  dst) );.      sq
dbd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
dbe0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
dbf0: 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d  , regRow, nColum
dc00: 6e 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20  n, regRowid,.   
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc20: 20 20 20 20 20 70 44 65 73 74 2d 3e 7a 41 66 66       pDest->zAff
dc30: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
dc40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
dc50: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
dc60: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
dc70: 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Row, nColumn);. 
dc80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dc90: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
dca0: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
dcb0: 2c 20 72 65 67 52 6f 77 69 64 2c 20 72 65 67 52  , regRowid, regR
dcc0: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ow, nColumn);.  
dcd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
dce0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
dcf0: 6d 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  m: {.      /* Th
dd00: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
dd10: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
dd20: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
dd30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
dd40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
dd50: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
dd60: 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53  assert( eDest==S
dd70: 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65  RT_Output || eDe
dd80: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
dd90: 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74  e ); .      test
dda0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
ddb0: 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
ddc0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
ddd0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
dde0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
ddf0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
de00: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
de10: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
de20: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65  P_ResultRow, pDe
de30: 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75  st->iSdst, nColu
de40: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mn);.        sql
de50: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
de60: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
de70: 73 65 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  se, pDest->iSdst
de80: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
de90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
dea0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
deb0: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
dec0: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
ded0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
dee0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
def0: 20 20 69 66 28 20 72 65 67 52 6f 77 69 64 20 29    if( regRowid )
df00: 7b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d  {.    if( eDest=
df10: 3d 53 52 54 5f 53 65 74 20 29 7b 0a 20 20 20 20  =SRT_Set ){.    
df20: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
df30: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
df40: 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d  , regRow, nColum
df50: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
df60: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
df70: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
df80: 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20  e, regRow);.    
df90: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  }.    sqlite3Rel
dfa0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
dfb0: 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  se, regRowid);. 
dfc0: 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74   }.  /* The bott
dfd0: 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  om of the loop. 
dfe0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
dff0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
e000: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
e010: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72    if( pSort->sor
e020: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
e030: 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  G_UseSorter ){. 
e040: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e050: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
e060: 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  rNext, iTab, add
e070: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
e080: 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  (v);.  }else{.  
e090: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e0a0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
e0b0: 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62  iTab, addr); Vdb
e0c0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
e0d0: 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72  }.  if( pSort->r
e0e0: 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74  egReturn ) sqlit
e0f0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
e100: 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  OP_Return, pSort
e110: 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
e120: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
e130: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42  veLabel(v, addrB
e140: 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  reak);.}../*.** 
e150: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
e160: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e   to a string con
e170: 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63  taining the 'dec
e180: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f  laration type' o
e190: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
e1a0: 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73  ion pExpr. The s
e1b0: 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65  tring may be tre
e1c0: 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62  ated as static b
e1d0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  y the caller..**
e1e0: 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20  .** Also try to 
e1f0: 65 73 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a  estimate the siz
e200: 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  e of the returne
e210: 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75  d value and retu
e220: 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c  rn that.** resul
e230: 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e  t in *pEstWidth.
e240: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  .**.** The decla
e250: 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74  ration type is t
e260: 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70  he exact datatyp
e270: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74  e definition ext
e280: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a  racted from the.
e290: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41  ** original CREA
e2a0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
e2b0: 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73  nt if the expres
e2c0: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
e2d0: 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61  . The.** declara
e2e0: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20  tion type for a 
e2f0: 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49  ROWID field is I
e300: 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20  NTEGER. Exactly 
e310: 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  when an expressi
e320: 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  on.** is conside
e330: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e  red a column can
e340: 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74   be complex in t
e350: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73  he presence of s
e360: 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a  ubqueries. The.*
e370: 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70  * result-set exp
e380: 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f  ression in all o
e390: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
e3a0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
e3b0: 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65  s is .** conside
e3c0: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20  red a column by 
e3d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
e3e0: 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f  *.**   SELECT co
e3f0: 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20  l FROM tbl;.**  
e400: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
e410: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
e420: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
e430: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b  T col FROM tbl);
e440: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63  .**   SELECT abc
e450: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f   FROM (SELECT co
e460: 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62  l AS abc FROM tb
e470: 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64  l);.** .** The d
e480: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
e490: 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69  for any expressi
e4a0: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  on other than a 
e4b0: 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a  column is NULL..
e4c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
e4d0: 6e 65 20 68 61 73 20 65 69 74 68 65 72 20 33 20  ne has either 3 
e4e0: 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72 73 20  or 6 parameters 
e4f0: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
e500: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
e510: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
e520: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
e530: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
e540: 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f  tion is used..*/
e550: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e560: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
e570: 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63  ADATA.# define c
e580: 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c  olumnType(A,B,C,
e590: 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49  D,E) columnTypeI
e5a0: 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 29 0a 23  mpl(A,B,C,D,E).#
e5b0: 65 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69  else /* if !defi
e5c0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
e5d0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
e5e0: 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63  A) */.# define c
e5f0: 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c  olumnType(A,B,C,
e600: 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49  D,E) columnTypeI
e610: 6d 70 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 0a  mpl(A,B).#endif.
e620: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
e630: 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  r *columnTypeImp
e640: 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  l(.  NameContext
e650: 20 2a 70 4e 43 2c 20 0a 23 69 66 6e 64 65 66 20   *pNC, .#ifndef 
e660: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
e670: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
e680: 45 78 70 72 20 2a 70 45 78 70 72 0a 23 65 6c 73  Expr *pExpr.#els
e690: 65 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  e.  Expr *pExpr,
e6a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
e6b0: 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73  pzOrigDb,.  cons
e6c0: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54  t char **pzOrigT
e6d0: 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ab,.  const char
e6e0: 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 0a 23 65 6e   **pzOrigCol.#en
e6f0: 64 69 66 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  dif.){.  char co
e700: 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  nst *zType = 0;.
e710: 20 20 69 6e 74 20 6a 3b 0a 23 69 66 64 65 66 20    int j;.#ifdef 
e720: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
e730: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
e740: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
e750: 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  gDb = 0;.  char 
e760: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20  const *zOrigTab 
e770: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
e780: 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  t *zOrigCol = 0;
e790: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
e7a0: 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  t( pExpr!=0 );. 
e7b0: 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53   assert( pNC->pS
e7c0: 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61  rcList!=0 );.  a
e7d0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
e7e0: 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
e7f0: 29 3b 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  );  /* This rout
e800: 69 6e 65 20 72 75 6e 65 73 20 62 65 66 6f 72 65  ine runes before
e810: 20 61 67 67 72 65 67 61 74 65 73 0a 20 20 20 20   aggregates.    
e820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e840: 20 20 20 2a 2a 20 61 72 65 20 70 72 6f 63 65 73     ** are proces
e850: 73 65 64 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  sed */.  switch(
e860: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
e870: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
e880: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
e890: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
e8a0: 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20   column. Locate 
e8b0: 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f  the table the co
e8c0: 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  lumn is being.  
e8d0: 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64      ** extracted
e8e0: 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e   from in NameCon
e8f0: 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54  text.pSrcList. T
e900: 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65  his table may be
e910: 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64   real.      ** d
e920: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
e930: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20   a subquery..   
e940: 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
e950: 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
e960: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
e970: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d   structure colum
e980: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
e990: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  rom */.      Sel
e9a0: 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20  ect *pS = 0;    
e9b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
e9c0: 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  ct the column is
e9d0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
e9e0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  */.      int iCo
e9f0: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
ea00: 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  mn;  /* Index of
ea10: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20   column in pTab 
ea20: 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
ea30: 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a  pNC && !pTab ){.
ea40: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
ea50: 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d  *pTabList = pNC-
ea60: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20  >pSrcList;.     
ea70: 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61     for(j=0;j<pTa
ea80: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
ea90: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
eaa0: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
eab0: 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20  able;j++);.     
eac0: 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73     if( j<pTabLis
ead0: 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20  t->nSrc ){.     
eae0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
eaf0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
eb00: 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20  .          pS = 
eb10: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
eb20: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
eb30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
eb40: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
eb50: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
eb60: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
eb70: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
eb80: 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d     /* At one tim
eb90: 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20  e, code such as 
eba0: 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77  "SELECT new.x" w
ebb0: 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20  ithin a trigger 
ebc0: 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
ebd0: 20 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64   cause this cond
ebe0: 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53  ition to run.  S
ebf0: 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61  ince then, we ha
ec00: 76 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20  ve restructured 
ec10: 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  how.        ** t
ec20: 72 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67  rigger code is g
ec30: 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20  enerated and so 
ec40: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  this condition i
ec50: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20  s no longer .   
ec60: 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65       ** possible
ec70: 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61  . However, it ca
ec80: 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20  n still be true 
ec90: 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c  for statements l
eca0: 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ike.        ** t
ecb0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
ecc0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
ecd0: 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
ece0: 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45  LE t1(col INTEGE
ecf0: 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  R);.        **  
ed00: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
ed10: 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f  t1.col) FROM FRO
ed20: 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a  M t1;.        **
ed30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  .        ** when
ed40: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
ed50: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
ed60: 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f  xpression "t1.co
ed70: 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20  l" in the .     
ed80: 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74     ** sub-select
ed90: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
eda0: 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  set the column t
edb0: 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65  ype to NULL, eve
edc0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f  n.        ** tho
edd0: 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65  ugh it should re
ede0: 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52  ally be "INTEGER
edf0: 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  "..        **.  
ee00: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
ee10: 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20   not a problem, 
ee20: 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  as the column ty
ee30: 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69  pe of "t1.col" i
ee40: 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20  s never.        
ee50: 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f  ** used. When co
ee60: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
ee70: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
ee80: 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20  ession .        
ee90: 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63  ** "(SELECT t1.c
eea0: 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63  ol)", the correc
eeb0: 74 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e  t type is return
eec0: 65 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53  ed (see the TK_S
eed0: 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a  ELECT.        **
eee0: 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20   branch below.  
eef0: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
ef00: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
ef10: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
ef20: 20 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54   pExpr->pTab==pT
ef30: 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ab );.      if( 
ef40: 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pS ){.        /*
ef50: 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20   The "table" is 
ef60: 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73  actually a sub-s
ef70: 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20  elect or a view 
ef80: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
ef90: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  se.        ** of
efa0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
efb0: 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68  ement. Return th
efc0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
efd0: 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20  pe and origin.  
efe0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f        ** data fo
eff0: 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  r the result-set
f000: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73   column of the s
f010: 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20  ub-select..     
f020: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
f030: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
f040: 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  l<pS->pEList->nE
f050: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
f060: 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c   /* If iCol is l
f070: 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
f080: 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
f090: 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a  on requests the.
f0a0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77            ** row
f0b0: 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  id of the sub-se
f0c0: 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68  lect or view. Th
f0d0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
f0e0: 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20   legal (see .   
f0f0: 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63         ** test c
f100: 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d  ase misc2.2.2) -
f110: 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75   it always evalu
f120: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20  ates to NULL..  
f130: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
f140: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
f150: 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20   sNC;.          
f160: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
f170: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
f180: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  xpr;.          s
f190: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
f1a0: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20  ->pSrc;.        
f1b0: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
f1c0: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  C;.          sNC
f1d0: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
f1e0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
f1f0: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
f200: 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72  ype(&sNC, p,&zOr
f210: 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26  igDb,&zOrigTab,&
f220: 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20 20  zOrigCol); .    
f230: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
f240: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  e{.        /* A 
f250: 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 61 20  real table or a 
f260: 43 54 45 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  CTE table */.   
f270: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
f280: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
f290: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
f2a0: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 20 20  METADATA.       
f2b0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
f2c0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
f2d0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
f2e0: 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44  ( iCol==XN_ROWID
f2f0: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
f300: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
f310: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
f320: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
f330: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
f340: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20  EGER";.         
f350: 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77   zOrigCol = "row
f360: 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  id";.        }el
f370: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  se{.          zO
f380: 72 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61  rigCol = pTab->a
f390: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
f3a0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
f3b0: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
f3c0: 54 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c  Type(&pTab->aCol
f3d0: 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20  [iCol],0);.     
f3e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72     }.        zOr
f3f0: 69 67 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e  igTab = pTab->zN
f400: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
f410: 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 26 26 20   pNC->pParse && 
f420: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
f430: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
f440: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
f450: 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70  maToIndex(pNC->p
f460: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
f470: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
f480: 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20 70       zOrigDb = p
f490: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e  NC->pParse->db->
f4a0: 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
f4b0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c  e;.        }.#el
f4c0: 73 65 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  se.        asser
f4d0: 74 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49  t( iCol==XN_ROWI
f4e0: 44 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  D || (iCol>=0 &&
f4f0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
f500: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ) );.        if(
f510: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
f520: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
f530: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
f540: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
f550: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   zType = sqlite3
f560: 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62  ColumnType(&pTab
f570: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b  ->aCol[iCol],0);
f580: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
f590: 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
f5a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
f5b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f5c0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
f5d0: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
f5e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
f5f0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62  ression is a sub
f600: 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20  -select. Return 
f610: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
f620: 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  type and.      *
f630: 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f  * origin info fo
f640: 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c  r the single col
f650: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
f660: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
f670: 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ECT.      ** sta
f680: 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  tement..      */
f690: 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  .      NameConte
f6a0: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65  xt sNC;.      Se
f6b0: 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72  lect *pS = pExpr
f6c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
f6d0: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
f6e0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
f6f0: 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
f700: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
f710: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
f720: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
f730: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
f740: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
f750: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
f760: 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73  .      sNC.pPars
f770: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
f780: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63  .      zType = c
f790: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
f7a0: 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f  p, &zOrigDb, &zO
f7b0: 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f  rigTab, &zOrigCo
f7c0: 6c 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  l); .      break
f7d0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
f7e0: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
f7f0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
f800: 4d 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28  METADATA  .  if(
f810: 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20   pzOrigDb ){.   
f820: 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54   assert( pzOrigT
f830: 61 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20  ab && pzOrigCol 
f840: 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62  );.    *pzOrigDb
f850: 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20   = zOrigDb;.    
f860: 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72  *pzOrigTab = zOr
f870: 69 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  igTab;.    *pzOr
f880: 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c  igCol = zOrigCol
f890: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
f8a0: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
f8b0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
f8c0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
f8d0: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
f8e0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
f8f0: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
f900: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
f910: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
f920: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
f930: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
f940: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
f950: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
f960: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
f970: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
f980: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
f990: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
f9a0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
f9b0: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
f9c0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
f9d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f9e0: 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56  MIT_DECLTYPE.  V
f9f0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
fa00: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
fa10: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
fa20: 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  NC;.  sNC.pSrcLi
fa30: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
fa40: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
fa50: 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e 65 78  arse;.  sNC.pNex
fa60: 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  t = 0;.  for(i=0
fa70: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
fa80: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
fa90: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
faa0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
fab0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
fac0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
fad0: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
fae0: 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74  TADATA.    const
faf0: 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d   char *zOrigDb =
fb00: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
fb10: 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30  ar *zOrigTab = 0
fb20: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
fb30: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
fb40: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
fb50: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
fb60: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
fb70: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b  Tab, &zOrigCol);
fb80: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62  ..    /* The vdb
fb90: 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20  e must make its 
fba0: 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20  own copy of the 
fbb0: 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20  column-type and 
fbc0: 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f  other .    ** co
fbd0: 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74  lumn specific st
fbe0: 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74  rings, in case t
fbf0: 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73  he schema is res
fc00: 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20  et before this. 
fc10: 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61     ** virtual ma
fc20: 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64  chine is deleted
fc30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
fc40: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
fc50: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
fc60: 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67  _DATABASE, zOrig
fc70: 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  Db, SQLITE_TRANS
fc80: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
fc90: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
fca0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54  (v, i, COLNAME_T
fcb0: 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20  ABLE, zOrigTab, 
fcc0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
fcd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
fce0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
fcf0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d  i, COLNAME_COLUM
fd00: 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c  N, zOrigCol, SQL
fd10: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
fd20: 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20  #else.    zType 
fd30: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
fd40: 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  C, p, 0, 0, 0);.
fd50: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
fd60: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
fd70: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44  (v, i, COLNAME_D
fd80: 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20  ECLTYPE, zType, 
fd90: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
fda0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
fdb0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
fdc0: 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20  _OMIT_DECLTYPE) 
fdd0: 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  */.}.../*.** Com
fde0: 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pute the column 
fdf0: 6e 61 6d 65 73 20 66 6f 72 20 61 20 53 45 4c 45  names for a SELE
fe00: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
fe10: 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67 75 61  .** The only gua
fe20: 72 61 6e 74 65 65 20 74 68 61 74 20 53 51 4c 69  rantee that SQLi
fe30: 74 65 20 6d 61 6b 65 73 20 61 62 6f 75 74 20 63  te makes about c
fe40: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74  olumn names is t
fe50: 68 61 74 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f  hat if the.** co
fe60: 6c 75 6d 6e 20 68 61 73 20 61 6e 20 41 53 20 63  lumn has an AS c
fe70: 6c 61 75 73 65 20 61 73 73 69 67 6e 69 6e 67 20  lause assigning 
fe80: 69 74 20 61 20 6e 61 6d 65 2c 20 74 68 61 74 20  it a name, that 
fe90: 77 69 6c 6c 20 62 65 20 74 68 65 20 6e 61 6d 65  will be the name
fea0: 20 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69   used..** That i
feb0: 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d  s the only docum
fec0: 65 6e 74 65 64 20 67 75 61 72 61 6e 74 65 65 2e  ented guarantee.
fed0: 20 20 48 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74    However, count
fee0: 6c 65 73 73 20 61 70 70 6c 69 63 61 74 69 6f 6e  less application
fef0: 73 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f  s.** developed o
ff00: 76 65 72 20 74 68 65 20 79 65 61 72 73 20 68 61  ver the years ha
ff10: 76 65 20 6d 61 64 65 20 62 61 73 65 6c 65 73 73  ve made baseless
ff20: 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f   assumptions abo
ff30: 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a  ut column names.
ff40: 2a 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72 65 61  ** and will brea
ff50: 6b 20 69 66 20 74 68 6f 73 65 20 61 73 73 75 6d  k if those assum
ff60: 70 74 69 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20  ptions changes. 
ff70: 20 48 65 6e 63 65 2c 20 75 73 65 20 65 78 74 72   Hence, use extr
ff80: 65 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77  eme caution.** w
ff90: 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  hen modifying th
ffa0: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 61 76  is routine to av
ffb0: 6f 69 64 20 62 72 65 61 6b 69 6e 67 20 6c 65 67  oid breaking leg
ffc0: 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41  acy..**.** See A
ffd0: 6c 73 6f 3a 20 73 71 6c 69 74 65 33 43 6f 6c 75  lso: sqlite3Colu
ffe0: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
fff0: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 52 41 47  ).**.** The PRAG
10000 4d 41 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f  MA short_column_
10010 6e 61 6d 65 73 20 61 6e 64 20 50 52 41 47 4d 41  names and PRAGMA
10020 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d   full_column_nam
10030 65 73 20 73 65 74 74 69 6e 67 73 20 61 72 65 0a  es settings are.
10040 2a 2a 20 64 65 70 72 65 63 61 74 65 64 2e 20 20  ** deprecated.  
10050 54 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74  The default sett
10060 69 6e 67 20 69 73 20 73 68 6f 72 74 3d 4f 4e 2c  ing is short=ON,
10070 20 66 75 6c 6c 3d 4f 46 46 2e 20 20 39 39 2e 39   full=OFF.  99.9
10080 25 20 6f 66 20 61 6c 6c 0a 2a 2a 20 61 70 70 6c  % of all.** appl
10090 69 63 61 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20  ications should 
100a0 6f 70 65 72 61 74 65 20 74 68 69 73 20 77 61 79  operate this way
100b0 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
100c0 20 77 65 20 6e 65 65 64 20 74 6f 20 73 75 70 70   we need to supp
100d0 6f 72 74 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72  ort the.** other
100e0 20 6d 6f 64 65 73 20 66 6f 72 20 6c 65 67 61 63   modes for legac
100f0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72  y:.**.**    shor
10100 74 3d 4f 46 46 2c 20 66 75 6c 6c 3d 4f 46 46 3a  t=OFF, full=OFF:
10110 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d        Column nam
10120 65 20 69 73 20 74 68 65 20 74 65 78 74 20 6f 66  e is the text of
10130 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10140 68 61 73 20 69 74 0a 2a 2a 20 20 20 20 20 20 20  has it.**       
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10160 20 20 20 20 20 20 20 6f 72 69 67 69 6e 61 6c 6c         originall
10170 79 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  y appears in the
10180 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10190 74 2e 20 20 49 6e 0a 2a 2a 20 20 20 20 20 20 20  t.  In.**       
101a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101b0 20 20 20 20 20 20 20 6f 74 68 65 72 20 77 6f 72         other wor
101c0 64 73 2c 20 74 68 65 20 7a 53 70 61 6e 20 6f 66  ds, the zSpan of
101d0 20 74 68 65 20 72 65 73 75 6c 74 20 65 78 70 72   the result expr
101e0 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ession..**.**   
101f0 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d   short=ON, full=
10200 4f 46 46 3a 20 20 20 20 20 20 20 28 54 68 69 73  OFF:       (This
10210 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
10220 73 65 74 74 69 6e 67 29 2e 20 20 49 66 20 74 68  setting).  If th
10230 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20  e result.**     
10240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10250 20 20 20 20 20 20 20 20 20 72 65 66 65 72 73 20           refers 
10260 64 69 72 65 63 74 6c 79 20 74 6f 20 61 20 74 61  directly to a ta
10270 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  ble column, then
10280 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
10290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102a0 20 20 20 20 20 72 65 73 75 6c 74 20 63 6f 6c 75       result colu
102b0 6d 6e 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20  mn name is just 
102c0 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
102d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
102e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102f0 20 6e 61 6d 65 3a 20 43 4f 4c 55 4d 4e 2e 20 20   name: COLUMN.  
10300 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 7a 53  Otherwise use zS
10310 70 61 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 66 75  pan..**.**    fu
10320 6c 6c 3d 4f 4e 2c 20 73 68 6f 72 74 3d 41 4e 59  ll=ON, short=ANY
10330 3a 20 20 20 20 20 20 20 49 66 20 74 68 65 20 72  :       If the r
10340 65 73 75 6c 74 20 72 65 66 65 72 73 20 64 69 72  esult refers dir
10350 65 63 74 6c 79 20 74 6f 20 61 20 74 61 62 6c 65  ectly to a table
10360 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 20 20 20 20   column,.**     
10370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10380 20 20 20 20 20 20 20 20 20 74 68 65 6e 20 74 68           then th
10390 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
103a0 6e 61 6d 65 20 77 69 74 68 20 74 68 65 20 74 61  name with the ta
103b0 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 20 20  ble name.**     
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103d0 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78 2c           prefix,
103e0 20 65 78 3a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d   ex: TABLE.COLUM
103f0 4e 2e 20 20 4f 74 68 65 72 77 69 73 65 20 75 73  N.  Otherwise us
10400 65 20 7a 53 70 61 6e 2e 0a 2a 2f 0a 73 74 61 74  e zSpan..*/.stat
10410 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
10420 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50  ColumnNames(.  P
10430 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10440 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
10450 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
10460 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 2f 2a   *pSelect     /*
10470 20 47 65 6e 65 72 61 74 65 20 63 6f 6c 75 6d 6e   Generate column
10480 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20   names for this 
10490 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
104a0 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
104b0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
104c0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 61 62  ;.  int i;.  Tab
104d0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 53 72 63 4c  le *pTab;.  SrcL
104e0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
104f0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
10500 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
10510 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
10520 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 3b 20 20   int fullName;  
10530 20 20 2f 2a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d    /* TABLE.COLUM
10540 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73  N if no AS claus
10550 65 20 61 6e 64 20 69 73 20 61 20 64 69 72 65 63  e and is a direc
10560 74 20 74 61 62 6c 65 20 72 65 66 20 2a 2f 0a 20  t table ref */. 
10570 20 69 6e 74 20 73 72 63 4e 61 6d 65 3b 20 20 20   int srcName;   
10580 20 20 2f 2a 20 43 4f 4c 55 4d 4e 20 6f 72 20 54    /* COLUMN or T
10590 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e  ABLE.COLUMN if n
105a0 6f 20 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20  o AS clause and 
105b0 69 73 20 64 69 72 65 63 74 20 2a 2f 0a 0a 23 69  is direct */..#i
105c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
105d0 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49  T_EXPLAIN.  /* I
105e0 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50  f this is an EXP
105f0 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20  LAIN, skip this 
10600 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50  step */.  if( pP
10610 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
10620 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
10630 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
10640 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
10650 65 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f  et ) return;.  /
10660 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  * Column names a
10670 72 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  re determined by
10680 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74   the left-most t
10690 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  erm of a compoun
106a0 64 20 73 65 6c 65 63 74 20 2a 2f 0a 20 20 77 68  d select */.  wh
106b0 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50  ile( pSelect->pP
106c0 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d  rior ) pSelect =
106d0 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
106e0 3b 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  ;.  SELECTTRACE(
106f0 31 2c 70 50 61 72 73 65 2c 70 53 65 6c 65 63 74  1,pParse,pSelect
10700 2c 28 22 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  ,("generating co
10710 6c 75 6d 6e 20 6e 61 6d 65 73 5c 6e 22 29 29 3b  lumn names\n"));
10720 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 53  .  pTabList = pS
10730 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 70  elect->pSrc;.  p
10740 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
10750 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  >pEList;.  asser
10760 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
10770 65 72 74 28 20 70 54 61 62 4c 69 73 74 21 3d 30  ert( pTabList!=0
10780 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   );.  pParse->co
10790 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
107a0 20 66 75 6c 6c 4e 61 6d 65 20 3d 20 28 64 62 2d   fullName = (db-
107b0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
107c0 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
107d0 3b 0a 20 20 73 72 63 4e 61 6d 65 20 3d 20 28 64  ;.  srcName = (d
107e0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
107f0 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
10800 21 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b  !=0 || fullName;
10810 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
10820 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69  tNumCols(v, pELi
10830 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f  st->nExpr);.  fo
10840 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
10850 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
10860 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
10870 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
10880 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 21 3d  .    assert( p!=
10890 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
108a0 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43   p->op!=TK_AGG_C
108b0 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 41 67 67  OLUMN );  /* Agg
108c0 20 70 72 6f 63 65 73 73 69 6e 67 20 68 61 73 20   processing has 
108d0 6e 6f 74 20 72 75 6e 20 79 65 74 20 2a 2f 0a 20  not run yet */. 
108e0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
108f0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  !=TK_COLUMN || p
10900 2d 3e 70 54 61 62 21 3d 30 20 29 3b 20 2f 2a 20  ->pTab!=0 ); /* 
10910 43 6f 76 65 72 69 6e 67 20 69 64 78 20 6e 6f 74  Covering idx not
10920 20 79 65 74 20 63 6f 64 65 64 20 2a 2f 0a 20 20   yet coded */.  
10930 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
10940 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
10950 20 20 2f 2a 20 41 6e 20 41 53 20 63 6c 61 75 73    /* An AS claus
10960 65 20 61 6c 77 61 79 73 20 74 61 6b 65 73 20 66  e always takes f
10970 69 72 73 74 20 70 72 69 6f 72 69 74 79 20 2a 2f  irst priority */
10980 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  .      char *zNa
10990 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
109a0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73  ].zName;.      s
109b0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
109c0 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
109d0 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
109e0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
109f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
10a00 20 73 72 63 4e 61 6d 65 20 26 26 20 70 2d 3e 6f   srcName && p->o
10a10 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
10a20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
10a30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  ;.      int iCol
10a40 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
10a50 20 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70       pTab = p->p
10a60 54 61 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Tab;.      asser
10a70 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
10a80 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
10a90 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
10aa0 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
10ab0 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
10ac0 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
10ad0 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
10ae0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
10af0 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
10b00 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
10b10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10b20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
10b30 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
10b40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10b50 20 66 75 6c 6c 4e 61 6d 65 20 29 7b 0a 20 20 20   fullName ){.   
10b60 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
10b70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e   = 0;.        zN
10b80 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
10b90 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
10ba0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
10bb0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
10bc0 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
10bd0 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
10be0 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
10bf0 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
10c00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10c10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10c20 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
10c30 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
10c40 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
10c50 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a  SIENT);.      }.
10c60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10c70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
10c80 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
10c90 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a  pan;.      z = z
10ca0 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72  ==0 ? sqlite3MPr
10cb0 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e  intf(db, "column
10cc0 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69  %d", i+1) : sqli
10cd0 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
10ce0 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
10cf0 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
10d00 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
10d10 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59  ME, z, SQLITE_DY
10d20 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  NAMIC);.    }.  
10d30 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  }.  generateColu
10d40 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20  mnTypes(pParse, 
10d50 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
10d60 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  );.}../*.** Give
10d70 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
10d80 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72  list (which is r
10d90 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f  eally the list o
10da0 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  f expressions.**
10db0 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72   that form the r
10dc0 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
10dd0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29  ELECT statement)
10de0 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72   compute appropr
10df0 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  iate.** column n
10e00 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ames for a table
10e10 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64   that would hold
10e20 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10e30 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  list..**.** All 
10e40 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c  column names wil
10e50 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a  l be unique..**.
10e60 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  ** Only the colu
10e70 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d  mn names are com
10e80 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a  puted.  Column.z
10e90 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  Type, Column.zCo
10ea0 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  ll,.** and other
10eb0 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d   fields of Colum
10ec0 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  n are zeroed..**
10ed0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
10ee0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
10ef0 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
10f00 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
10f10 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20  ccurs,.** store 
10f20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61  NULL in *paCol a
10f30 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61  nd 0 in *pnCol a
10f40 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
10f50 5f 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68  _NOMEM..**.** Th
10f60 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65  e only guarantee
10f70 20 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b   that SQLite mak
10f80 65 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  es about column 
10f90 6e 61 6d 65 73 20 69 73 20 74 68 61 74 20 69 66  names is that if
10fa0 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68   the.** column h
10fb0 61 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20  as an AS clause 
10fc0 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e  assigning it a n
10fd0 61 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62  ame, that will b
10fe0 65 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e  e the name used.
10ff0 0a 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65 20  .** That is the 
11000 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20  only documented 
11010 67 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65  guarantee.  Howe
11020 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61  ver, countless a
11030 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64  pplications.** d
11040 65 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68  eveloped over th
11050 65 20 79 65 61 72 73 20 68 61 76 65 20 6d 61 64  e years have mad
11060 65 20 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d  e baseless assum
11070 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c  ptions about col
11080 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64  umn names.** and
11090 20 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74   will break if t
110a0 68 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73  hose assumptions
110b0 20 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65   changes.  Hence
110c0 2c 20 75 73 65 20 65 78 74 72 65 6d 65 20 63 61  , use extreme ca
110d0 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f  ution.** when mo
110e0 64 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75  difying this rou
110f0 74 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72  tine to avoid br
11100 65 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a  eaking legacy..*
11110 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 67  *.** See Also: g
11120 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
11130 65 73 28 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  es().*/.int sqli
11140 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
11150 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
11160 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
11170 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
11180 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
11190 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
111a0 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66    /* Expr list f
111b0 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72  rom which to der
111c0 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ive column names
111d0 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c   */.  i16 *pnCol
111e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
111f0 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
11200 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72  r of columns her
11210 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a  e */.  Column **
11220 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f  paCol          /
11230 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20  * Write the new 
11240 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65  column list here
11250 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
11260 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
11270 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  b;   /* Database
11280 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
11290 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
112a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
112b0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
112c0 0a 20 20 75 33 32 20 63 6e 74 3b 20 20 20 20 20  .  u32 cnt;     
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
112e0 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f  * Index added to
112f0 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75   make the name u
11300 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d  nique */.  Colum
11310 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20  n *aCol, *pCol; 
11320 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
11330 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c  oping over resul
11340 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
11350 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
11360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
11370 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
11380 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
11390 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  t */.  char *zNa
113a0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
113b0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d     /* Column nam
113c0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  e */.  int nName
113d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
113e0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61     /* Size of na
113f0 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f  me in zName[] */
11400 0a 20 20 48 61 73 68 20 68 74 3b 20 20 20 20 20  .  Hash ht;     
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11420 2a 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20  * Hash table of 
11430 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
11440 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
11450 69 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20 70  it(&ht);.  if( p
11460 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f  EList ){.    nCo
11470 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
11480 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71  r;.    aCol = sq
11490 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
114a0 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f  o(db, sizeof(aCo
114b0 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20  l[0])*nCol);.   
114c0 20 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d   testcase( aCol=
114d0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 43  =0 );.    if( nC
114e0 6f 6c 3e 33 32 37 36 37 20 29 20 6e 43 6f 6c 20  ol>32767 ) nCol 
114f0 3d 20 33 32 37 36 37 3b 0a 20 20 7d 65 6c 73 65  = 32767;.  }else
11500 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a  {.    nCol = 0;.
11510 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20      aCol = 0;.  
11520 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c  }.  assert( nCol
11530 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20  ==(i16)nCol );. 
11540 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a   *pnCol = nCol;.
11550 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b    *paCol = aCol;
11560 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ..  for(i=0, pCo
11570 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26  l=aCol; i<nCol &
11580 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
11590 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  led; i++, pCol++
115a0 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  ){.    /* Get an
115b0 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d   appropriate nam
115c0 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
115d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
115e0 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  (zName = pEList-
115f0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20  >a[i].zName)!=0 
11600 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
11610 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  he column contai
11620 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e  ns an "AS <name>
11630 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e  " phrase, use <n
11640 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65  ame> as the name
11650 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
11660 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45       Expr *pColE
11670 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
11680 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c  rSkipCollate(pEL
11690 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
116a0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
116b0 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ColExpr->op==TK_
116c0 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70  DOT ){.        p
116d0 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78  ColExpr = pColEx
116e0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
116f0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
11700 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
11710 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
11720 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 21 3d 54   pColExpr->op!=T
11730 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
11740 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78        if( pColEx
11750 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
11760 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  N ){.        /* 
11770 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20  For columns use 
11780 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
11790 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
117a0 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45  int iCol = pColE
117b0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
117c0 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
117d0 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54  b = pColExpr->pT
117e0 61 62 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ab;.        asse
117f0 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
11800 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
11810 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
11820 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
11830 7a 4e 61 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30 20  zName = iCol>=0 
11840 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ? pTab->aCol[iCo
11850 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69  l].zName : "rowi
11860 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  d";.      }else 
11870 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
11880 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20  ==TK_ID ){.     
11890 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
118a0 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c  HasProperty(pCol
118b0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
118c0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e  e) );.        zN
118d0 61 6d 65 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  ame = pColExpr->
118e0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
118f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
11900 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e  * Use the origin
11910 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  al text of the c
11920 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
11930 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a   as its name */.
11940 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
11950 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
11960 61 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  an;.      }.    
11970 7d 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20  }.    if( zName 
11980 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ){.      zName =
11990 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
119a0 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  (db, zName);.   
119b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e   }else{.      zN
119c0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
119d0 69 6e 74 66 28 64 62 2c 22 63 6f 6c 75 6d 6e 25  intf(db,"column%
119e0 64 22 2c 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a  d",i+1);.    }..
119f0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
11a00 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
11a10 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20   is unique.  If 
11a20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  the name is not 
11a30 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61  unique,.    ** a
11a40 70 70 65 6e 64 20 61 6e 20 69 6e 74 65 67 65 72  ppend an integer
11a50 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20   to the name so 
11a60 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20  that it becomes 
11a70 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20  unique..    */. 
11a80 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20     cnt = 0;.    
11a90 77 68 69 6c 65 28 20 7a 4e 61 6d 65 20 26 26 20  while( zName && 
11aa0 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
11ab0 26 68 74 2c 20 7a 4e 61 6d 65 29 21 3d 30 20 29  &ht, zName)!=0 )
11ac0 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20  {.      nName = 
11ad0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
11ae0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  zName);.      if
11af0 28 20 6e 4e 61 6d 65 3e 30 20 29 7b 0a 20 20 20  ( nName>0 ){.   
11b00 20 20 20 20 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65       for(j=nName
11b10 2d 31 3b 20 6a 3e 30 20 26 26 20 73 71 6c 69 74  -1; j>0 && sqlit
11b20 65 33 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b  e3Isdigit(zName[
11b30 6a 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20  j]); j--){}.    
11b40 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d      if( zName[j]
11b50 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20  ==':' ) nName = 
11b60 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  j;.      }.     
11b70 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
11b80 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 2e 2a  MPrintf(db, "%.*
11b90 7a 3a 25 75 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e  z:%u", nName, zN
11ba0 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20  ame, ++cnt);.   
11bb0 20 20 20 69 66 28 20 63 6e 74 3e 33 20 29 20 73     if( cnt>3 ) s
11bc0 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
11bd0 73 28 73 69 7a 65 6f 66 28 63 6e 74 29 2c 20 26  s(sizeof(cnt), &
11be0 63 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  cnt);.    }.    
11bf0 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e  pCol->zName = zN
11c00 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ame;.    sqlite3
11c10 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73  ColumnProperties
11c20 46 72 6f 6d 4e 61 6d 65 28 30 2c 20 70 43 6f 6c  FromName(0, pCol
11c30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
11c40 20 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 49   && sqlite3HashI
11c50 6e 73 65 72 74 28 26 68 74 2c 20 7a 4e 61 6d 65  nsert(&ht, zName
11c60 2c 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b  , pCol)==pCol ){
11c70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  .      sqlite3Oo
11c80 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
11c90 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  }.  }.  sqlite3H
11ca0 61 73 68 43 6c 65 61 72 28 26 68 74 29 3b 0a 20  ashClear(&ht);. 
11cb0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
11cc0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72  ailed ){.    for
11cd0 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  (j=0; j<i; j++){
11ce0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
11cf0 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d  Free(db, aCol[j]
11d00 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
11d10 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11d20 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20  (db, aCol);.    
11d30 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *paCol = 0;.    
11d40 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *pnCol = 0;.    
11d50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
11d60 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
11d70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11d80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
11d90 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  ype and collatio
11da0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  n information to
11db0 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62   a column list b
11dc0 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c  ased on.** a SEL
11dd0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
11de0 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  * .** The column
11df0 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79   list presumably
11e00 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63   came from selec
11e10 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d  tColumnNamesFrom
11e20 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54  ExprList()..** T
11e30 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  he column list h
11e40 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e  as only names, n
11e50 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c  ot types or coll
11e60 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a  ations.  This.**
11e70 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68   routine goes th
11e80 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74  rough and adds t
11e90 68 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c  he types and col
11ea0 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  lations..**.** T
11eb0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75  his routine requ
11ec0 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64  ires that all id
11ed0 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65  entifiers in the
11ee0 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
11ef0 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64  ment be resolved
11f00 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
11f10 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e  3SelectAddColumn
11f20 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
11f30 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
11f40 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
11f50 73 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f  sing contexts */
11f60 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
11f70 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
11f80 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f  column type info
11f90 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
11fa0 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63  table */.  Selec
11fb0 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
11fc0 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20   /* SELECT used 
11fd0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70  to determine typ
11fe0 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
11ff0 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
12000 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
12010 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  db;.  NameContex
12020 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20  t sNC;.  Column 
12030 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71  *pCol;.  CollSeq
12040 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pColl;.  int i
12050 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73  ;.  Expr *p;.  s
12060 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
12070 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72  tem *a;..  asser
12080 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b  t( pSelect!=0 );
12090 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c  .  assert( (pSel
120a0 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ect->selFlags & 
120b0 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20  SF_Resolved)!=0 
120c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  );.  assert( pTa
120d0 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74  b->nCol==pSelect
120e0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
120f0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
12100 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  led );.  if( db-
12110 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
12120 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74  return;.  memset
12130 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
12140 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53  (sNC));.  sNC.pS
12150 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  rcList = pSelect
12160 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53  ->pSrc;.  a = pS
12170 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
12180 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ;.  for(i=0, pCo
12190 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c  l=pTab->aCol; i<
121a0 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  pTab->nCol; i++,
121b0 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f   pCol++){.    co
121c0 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
121d0 0a 20 20 20 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20  .    int n, m;. 
121e0 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70     p = a[i].pExp
121f0 72 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63  r;.    zType = c
12200 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
12210 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  p, 0, 0, 0);.   
12220 20 2f 2a 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20   /* pCol->szEst 
12230 3d 20 2e 2e 2e 20 2f 2f 20 43 6f 6c 75 6d 6e 20  = ... // Column 
12240 73 69 7a 65 20 65 73 74 20 66 6f 72 20 53 45 4c  size est for SEL
12250 45 43 54 20 74 61 62 6c 65 73 20 6e 65 76 65 72  ECT tables never
12260 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 70 43 6f   used */.    pCo
12270 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
12280 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
12290 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  y(p);.    if( zT
122a0 79 70 65 20 29 7b 0a 20 20 20 20 20 20 6d 20 3d  ype ){.      m =
122b0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
122c0 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20 6e  (zType);.      n
122d0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
122e0 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  30(pCol->zName);
122f0 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61  .      pCol->zNa
12300 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  me = sqlite3DbRe
12310 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c 20  allocOrFree(db, 
12320 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d  pCol->zName, n+m
12330 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  +2);.      if( p
12340 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  Col->zName ){.  
12350 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 43        memcpy(&pC
12360 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20  ol->zName[n+1], 
12370 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20 20  zType, m+1);.   
12380 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c       pCol->colFl
12390 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48  ags |= COLFLAG_H
123a0 41 53 54 59 50 45 3b 0a 20 20 20 20 20 20 7d 0a  ASTYPE;.      }.
123b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
123c0 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20  ol->affinity==0 
123d0 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ) pCol->affinity
123e0 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
123f0 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  OB;.    pColl = 
12400 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
12410 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  eq(pParse, p);. 
12420 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20     if( pColl && 
12430 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29  pCol->zColl==0 )
12440 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43  {.      pCol->zC
12450 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53  oll = sqlite3DbS
12460 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d  trDup(db, pColl-
12470 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
12480 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62   }.  pTab->szTab
12490 52 6f 77 20 3d 20 31 3b 20 2f 2a 20 41 6e 79 20  Row = 1; /* Any 
124a0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 77  non-zero value w
124b0 6f 72 6b 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  orks */.}../*.**
124c0 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20   Given a SELECT 
124d0 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72  statement, gener
124e0 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75  ate a Table stru
124f0 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
12500 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  ibes.** the resu
12510 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53  lt set of that S
12520 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ELECT..*/.Table 
12530 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65  *sqlite3ResultSe
12540 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20  tOfSelect(Parse 
12550 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
12560 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62  *pSelect){.  Tab
12570 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69  le *pTab;.  sqli
12580 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
12590 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65  ->db;.  int save
125a0 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64  dFlags;..  saved
125b0 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67  Flags = db->flag
125c0 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  s;.  db->flags &
125d0 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f  = ~SQLITE_FullCo
125e0 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c  lNames;.  db->fl
125f0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
12600 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73  ortColNames;.  s
12610 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
12620 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
12630 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , 0);.  if( pPar
12640 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
12650 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  n 0;.  while( pS
12660 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20  elect->pPrior ) 
12670 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
12680 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d  t->pPrior;.  db-
12690 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c  >flags = savedFl
126a0 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ags;.  pTab = sq
126b0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
126c0 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
126d0 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
126e0 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  b==0 ){.    retu
126f0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  rn 0;.  }.  /* T
12700 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  he sqlite3Result
12710 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73  SetOfSelect() is
12720 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e   only used n con
12730 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b  texts where look
12740 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69  aside.  ** is di
12750 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65  sabled */.  asse
12760 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  rt( db->lookasid
12770 65 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20 20  e.bDisable );.  
12780 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20  pTab->nTabRef = 
12790 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  1;.  pTab->zName
127a0 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52   = 0;.  pTab->nR
127b0 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
127c0 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
127d0 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
127e0 37 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  76) );.  sqlite3
127f0 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
12800 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
12810 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54  ect->pEList, &pT
12820 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
12830 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  >aCol);.  sqlite
12840 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e  3SelectAddColumn
12850 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
12860 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
12870 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d  Select);.  pTab-
12880 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69  >iPKey = -1;.  i
12890 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
128a0 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
128b0 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
128c0 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74  , pTab);.    ret
128d0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
128e0 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
128f0 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f  ** Get a VDBE fo
12900 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73  r the given pars
12910 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65  er context.  Cre
12920 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
12930 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49   necessary..** I
12940 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
12950 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  s, return NULL a
12960 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61  nd leave a messa
12970 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
12980 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65  .Vdbe *sqlite3Ge
12990 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61  tVdbe(Parse *pPa
129a0 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72  rse){.  if( pPar
129b0 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20  se->pVdbe ){.   
129c0 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
129d0 70 56 64 62 65 3b 0a 20 20 7d 0a 20 20 69 66 28  pVdbe;.  }.  if(
129e0 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76   pParse->pToplev
129f0 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74 69  el==0.   && Opti
12a00 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
12a10 70 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54  pParse->db,SQLIT
12a20 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74  E_FactorOutConst
12a30 29 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ).  ){.    pPars
12a40 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
12a50 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
12a60 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43 72  rn sqlite3VdbeCr
12a70 65 61 74 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a  eate(pParse);.}.
12a80 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
12a90 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  the iLimit and i
12aa0 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66  Offset fields of
12ab0 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65   the SELECT base
12ac0 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d  d on the.** pLim
12ad0 69 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  it expressions. 
12ae0 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61   pLimit->pLeft a
12af0 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68  nd pLimit->pRigh
12b00 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  t hold the expre
12b10 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61  ssions.** that a
12b20 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69  ppear in the ori
12b30 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
12b40 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49  ent after the LI
12b50 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a  MIT and OFFSET.*
12b60 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20  * keywords.  Or 
12b70 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65  NULL if those ke
12b80 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74  ywords are omitt
12b90 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  ed. iLimit and i
12ba0 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74  Offset .** are t
12bb0 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72  he integer memor
12bc0 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  y register numbe
12bd0 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20  rs for counters 
12be0 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
12bf0 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e  .** the limit an
12c00 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68  d offset.  If th
12c10 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20  ere is no limit 
12c20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74  and/or offset, t
12c30 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61  hen .** iLimit a
12c40 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e  nd iOffset are n
12c50 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  egative..**.** T
12c60 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e  his routine chan
12c70 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ges the values o
12c80 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  f iLimit and iOf
12c90 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20  fset only if.** 
12ca0 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65  a limit or offse
12cb0 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
12cc0 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e  pLimit->pLeft an
12cd0 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74  d pLimit->pRight
12ce0 2e 20 20 69 4c 69 6d 69 74 0a 2a 2a 20 61 6e 64  .  iLimit.** and
12cf0 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20   iOffset should 
12d00 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74  have been preset
12d10 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   to appropriate 
12d20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28  default values (
12d30 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74  zero).** prior t
12d40 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
12d50 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
12d60 65 20 69 4f 66 66 73 65 74 20 72 65 67 69 73 74  e iOffset regist
12d70 65 72 20 28 69 66 20 69 74 20 65 78 69 73 74 73  er (if it exists
12d80 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ) is initialized
12d90 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a   to the value.**
12da0 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20   of the OFFSET. 
12db0 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69   The iLimit regi
12dc0 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  ster is initiali
12dd0 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52  zed to LIMIT.  R
12de0 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73  egister.** iOffs
12df0 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69  et+1 is initiali
12e00 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46  zed to LIMIT+OFF
12e10 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  SET..**.** Only 
12e20 69 66 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  if pLimit->pLeft
12e30 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  !=0 do the limit
12e40 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
12e50 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
12e60 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
12e70 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
12e80 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
12e90 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
12ea0 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
12eb0 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
12ec0 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
12ed0 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
12ee0 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
12ef0 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
12f00 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
12f10 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
12f20 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42  elect *p, int iB
12f30 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76  reak){.  Vdbe *v
12f40 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d   = 0;.  int iLim
12f50 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  it = 0;.  int iO
12f60 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a  ffset;.  int n;.
12f70 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d    Expr *pLimit =
12f80 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 0a 20 20 69   p->pLimit;..  i
12f90 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72  f( p->iLimit ) r
12fa0 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20  eturn;..  /* .  
12fb0 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c  ** "LIMIT -1" al
12fc0 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72  ways shows all r
12fd0 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73  ows.  There is s
12fe0 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76  ome.  ** controv
12ff0 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20  ersy about what 
13000 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
13010 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a  vior should be..
13020 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74    ** The current
13030 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
13040 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49  interprets "LIMI
13050 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a  T 0" to mean.  *
13060 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a  * no rows..  */.
13070 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
13080 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
13090 0a 20 20 69 66 28 20 70 4c 69 6d 69 74 20 29 7b  .  if( pLimit ){
130a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
130b0 6d 69 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d 49  mit->op==TK_LIMI
130c0 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
130d0 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d   pLimit->pLeft!=
130e0 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d  0 );.    p->iLim
130f0 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b  it = iLimit = ++
13100 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
13110 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
13120 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
13130 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
13140 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
13150 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
13160 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e  Limit->pLeft, &n
13170 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
13180 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13190 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69  OP_Integer, n, i
131a0 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64  Limit);.      Vd
131b0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
131c0 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
131d0 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
131e0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
131f0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42  e3VdbeGoto(v, iB
13200 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c  reak);.      }el
13210 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70  se if( n>=0 && p
13220 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c  ->nSelectRow>sql
13230 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29  ite3LogEst((u64)
13240 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  n) ){.        p-
13250 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
13260 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
13270 29 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  )n);.        p->
13280 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46  selFlags |= SF_F
13290 69 78 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20  ixedLimit;.     
132a0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
132b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
132c0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d  ode(pParse, pLim
132d0 69 74 2d 3e 70 4c 65 66 74 2c 20 69 4c 69 6d 69  it->pLeft, iLimi
132e0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
132f0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
13300 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69  P_MustBeInt, iLi
13310 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  mit); VdbeCovera
13320 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62  ge(v);.      Vdb
13330 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
13340 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
13350 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13360 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
13370 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72  Not, iLimit, iBr
13380 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
13390 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ge(v);.    }.   
133a0 20 69 66 28 20 70 4c 69 6d 69 74 2d 3e 70 52 69   if( pLimit->pRi
133b0 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ght ){.      p->
133c0 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65  iOffset = iOffse
133d0 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
133e0 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  em;.      pParse
133f0 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41  ->nMem++;   /* A
13400 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61  llocate an extra
13410 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69   register for li
13420 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20  mit+offset */.  
13430 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
13440 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d  ode(pParse, pLim
13450 69 74 2d 3e 70 52 69 67 68 74 2c 20 69 4f 66 66  it->pRight, iOff
13460 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  set);.      sqli
13470 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
13480 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
13490 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76  Offset); VdbeCov
134a0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
134b0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
134c0 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22  "OFFSET counter"
134d0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
134e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
134f0 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20 69  P_OffsetLimit, i
13500 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b 31  Limit, iOffset+1
13510 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
13520 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
13530 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22  , "LIMIT+OFFSET"
13540 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ));.    }.  }.}.
13550 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13560 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
13570 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  LECT./*.** Retur
13580 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
13590 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
135a0 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f  ence for the iCo
135b0 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  l-th column of.*
135c0 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
135d0 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
135e0 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d-select stateme
135f0 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20  nt "p".  Return 
13600 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63  NULL if.** the c
13610 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66  olumn has no def
13620 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ault collating s
13630 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  equence..**.** T
13640 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
13650 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f  uence for the co
13660 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73  mpound select is
13670 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a   taken from the.
13680 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  ** left-most ter
13690 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  m of the select 
136a0 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61  that has a colla
136b0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
136c0 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  /.static CollSeq
136d0 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c   *multiSelectCol
136e0 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
136f0 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
13700 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c  nt iCol){.  Coll
13710 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  Seq *pRet;.  if(
13720 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
13730 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65    pRet = multiSe
13740 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
13750 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69  se, p->pPrior, i
13760 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Col);.  }else{. 
13770 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d     pRet = 0;.  }
13780 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
13790 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20  =0 );.  /* iCol 
137a0 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74 68 61  must be less tha
137b0 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  n p->pEList->nEx
137c0 70 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61  pr.  Otherwise a
137d0 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20  n error would.  
137e0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68 72  ** have been thr
137f0 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65 20  own during name 
13800 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77  resolution and w
13810 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65  e would not have
13820 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69   gotten.  ** thi
13830 73 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20 70  s far */.  if( p
13840 52 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59 53  Ret==0 && ALWAYS
13850 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d  (iCol<p->pEList-
13860 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 70  >nExpr) ){.    p
13870 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
13880 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
13890 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43   p->pEList->a[iC
138a0 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  ol].pExpr);.  }.
138b0 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
138c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
138d0 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
138e0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
138f0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  d parameter is a
13900 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
13910 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45  .** with an ORDE
13920 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69  R BY clause. Thi
13930 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
13940 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ates and returns
13950 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74   a KeyInfo.** st
13960 72 75 63 74 75 72 65 20 73 75 69 74 61 62 6c 65  ructure suitable
13970 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e   for implementin
13980 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a  g the ORDER BY..
13990 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
139a0 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
139b0 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
139c0 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
139d0 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  c. The calling.*
139e0 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  * function is re
139f0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e  sponsible for en
13a00 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 69 73  suring that this
13a10 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76   structure is ev
13a20 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65  entually.** free
13a30 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  d..*/.static Key
13a40 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63  Info *multiSelec
13a50 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28  tOrderByKeyInfo(
13a60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
13a70 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45  elect *p, int nE
13a80 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73  xtra){.  ExprLis
13a90 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
13aa0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74  >pOrderBy;.  int
13ab0 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   nOrderBy = p->p
13ac0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
13ad0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
13ae0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65  pParse->db;.  Ke
13af0 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71  yInfo *pRet = sq
13b00 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
13b10 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e  c(db, nOrderBy+n
13b20 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28  Extra, 1);.  if(
13b30 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74   pRet ){.    int
13b40 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
13b50 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
13b60 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
13b70 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
13b80 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79  Item = &pOrderBy
13b90 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78  ->a[i];.      Ex
13ba0 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65  pr *pTerm = pIte
13bb0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
13bc0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
13bd0 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
13be0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
13bf0 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  late ){.        
13c00 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
13c10 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
13c20 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  e, pTerm);.     
13c30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13c40 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
13c50 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
13c60 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78  e, p, pItem->u.x
13c70 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b  .iOrderByCol-1);
13c80 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
13c90 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20  ll==0 ) pColl = 
13ca0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
13cb0 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
13cc0 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20  >a[i].pExpr =.  
13cd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
13ce0 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72  xprAddCollateStr
13cf0 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72  ing(pParse, pTer
13d00 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  m, pColl->zName)
13d10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13d20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
13d30 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
13d40 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20  e(pRet) );.     
13d50 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20   pRet->aColl[i] 
13d60 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
13d70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Ret->aSortOrder[
13d80 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  i] = pOrderBy->a
13d90 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
13da0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
13db0 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e  rn pRet;.}..#ifn
13dc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13dd0 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  CTE./*.** This r
13de0 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
13df0 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f   VDBE code to co
13e00 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  mpute the conten
13e10 74 20 6f 66 20 61 20 57 49 54 48 20 52 45 43 55  t of a WITH RECU
13e20 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f  RSIVE.** query o
13e30 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
13e40 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74  *   <recursive-t
13e50 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70  able> AS (<setup
13e60 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41  -query> UNION [A
13e70 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71  LL] <recursive-q
13e80 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20  uery>).**       
13e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ea0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20    \___________/ 
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
13ec0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ee0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50             p->pP
13ef0 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  rior            
13f00 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a            p.**.*
13f10 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78  *.** There is ex
13f20 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65  actly one refere
13f30 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63 75 72  nce to the recur
13f40 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68  sive-table in th
13f50 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a  e FROM clause.**
13f60 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71 75   of recursive-qu
13f70 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68  ery, marked with
13f80 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b   the SrcList->a[
13f90 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ].fg.isRecursive
13fa0 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   flag..**.** The
13fb0 20 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e   setup-query run
13fc0 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61  s once to genera
13fd0 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65  te an initial se
13fe0 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67  t of rows that g
13ff0 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75  o.** into a Queu
14000 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61  e table.  Rows a
14010 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  re extracted fro
14020 6d 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  m the Queue tabl
14030 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e  e one by.** one.
14040 20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61    Each row extra
14050 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20  cted from Queue 
14060 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65  is output to pDe
14070 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69  st.  Then the si
14080 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65  ngle.** extracte
14090 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68  d row (now in th
140a0 65 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65  e iCurrent table
140b0 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f  ) becomes the co
140c0 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20  ntent of the.** 
140d0 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20  recursive-table 
140e0 66 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d  for a recursive-
140f0 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20  query run.  The 
14100 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65  output of the re
14110 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a  cursive-query.**
14120 20 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69   is added back i
14130 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61  nto the Queue ta
14140 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68  ble.  Then anoth
14150 65 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63  er row is extrac
14160 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a  ted from Queue.*
14170 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74  * and the iterat
14180 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e  ion continues un
14190 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61  til the Queue ta
141a0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a  ble is empty..**
141b0 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f  .** If the compo
141c0 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74  und query operat
141d0 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e  or is UNION then
141e0 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f   no duplicate ro
141f0 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69  ws are ever.** i
14200 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65  nserted into the
14210 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54   Queue table.  T
14220 68 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62  he iDistinct tab
14230 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20  le keeps a copy 
14240 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74  of all rows.** t
14250 68 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65  hat have ever be
14260 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  en inserted into
14270 20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65   Queue and cause
14280 73 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20  s duplicates to 
14290 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e  be.** discarded.
142a0 20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f    If the operato
142b0 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  r is UNION ALL, 
142c0 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20  then duplicates 
142d0 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20  are allowed..** 
142e0 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
142f0 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59   has an ORDER BY
14300 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69  , then entries i
14310 6e 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  n the Queue tabl
14320 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a  e are kept in.**
14330 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20   ORDER BY order 
14340 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e  and the first en
14350 74 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64  try is extracted
14360 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e   for each cycle.
14370 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20    Without.** an 
14380 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75  ORDER BY, the Qu
14390 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73  eue table is jus
143a0 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20  t a FIFO..**.** 
143b0 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  If a LIMIT claus
143c0 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74  e is provided, t
143d0 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f  hen the iteratio
143e0 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49  n stops after LI
143f0 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65  MIT rows.** have
14400 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20   been output to 
14410 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20  pDest.  A LIMIT 
14420 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f  of zero means to
14430 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20   output no rows 
14440 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76  and a.** negativ
14450 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f  e LIMIT means to
14460 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73   output all rows
14470 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61  .  If there is a
14480 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c  lso an OFFSET cl
14490 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70  ause.** with a p
144a0 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74  ositive value, t
144b0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46  hen the first OF
144c0 46 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65  FSET outputs are
144d0 20 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65   discarded rathe
144e0 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20  r.** than being 
144f0 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20  sent to pDest.  
14500 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20  The LIMIT count 
14510 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75  does not begin u
14520 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45  ntil after OFFSE
14530 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62  T.** rows have b
14540 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  een skipped..*/.
14550 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
14560 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76  rateWithRecursiv
14570 65 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20  eQuery(.  Parse 
14580 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
14590 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
145a0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
145b0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
145c0 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53   The recursive S
145d0 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65  ELECT to be code
145e0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
145f0 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
14600 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
14610 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
14620 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  .){.  SrcList *p
14630 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20  Src = p->pSrc;  
14640 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
14650 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65  clause of the re
14660 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f  cursive query */
14670 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d  .  int nCol = p-
14680 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  >pEList->nExpr; 
14690 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
146a0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63  lumns in the rec
146b0 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a  ursive table */.
146c0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
146d0 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
146e0 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  /* The prepared 
146f0 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
14700 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
14710 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70    Select *pSetup
14720 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20   = p->pPrior;   
14730 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65  /* The setup que
14740 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ry */.  int addr
14750 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
14760 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
14770 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  the loop */.  in
14780 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72  t addrCont, addr
14790 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43  Break;      /* C
147a0 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41  ONTINUE and BREA
147b0 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20  K addresses */. 
147c0 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20   int iCurrent = 
147d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
147e0 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61  * The Current ta
147f0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ble */.  int reg
14800 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20  Current;        
14810 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
14820 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65  er holding Curre
14830 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  nt table */.  in
14840 74 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20  t iQueue;       
14850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14860 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a  he Queue table *
14870 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63  /.  int iDistinc
14880 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
14890 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75    /* To ensure u
148a0 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66  nique results if
148b0 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20   UNION */.  int 
148c0 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f  eDest = SRT_Fifo
148d0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77  ;         /* How
148e0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65   to write to Que
148f0 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ue */.  SelectDe
14900 73 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20  st destQueue;   
14910 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44        /* SelectD
14920 65 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74  est targetting t
14930 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a  he Queue table *
14940 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14960 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
14970 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  r */.  int rc;  
14980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14990 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
149a0 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ode */.  ExprLis
149b0 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
149c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
149d0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
149e0 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b  .  Expr *pLimit;
149f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a00 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20   /* Saved LIMIT 
14a10 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20  and OFFSET */.  
14a20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65  int regLimit, re
14a30 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a  gOffset;      /*
14a40 20 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20   Registers used 
14a50 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  by LIMIT and OFF
14a60 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74  SET */..  /* Obt
14a70 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  ain authorizatio
14a80 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73  n to do a recurs
14a90 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ive query */.  i
14aa0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
14ab0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
14ac0 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c  TE_RECURSIVE, 0,
14ad0 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
14ae0 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..  /* Process t
14af0 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
14b00 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20  SET clauses, if 
14b10 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20  they exist */.  
14b20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69  addrBreak = sqli
14b30 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14b40 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63  (v);.  p->nSelec
14b50 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20  tRow = 320;  /* 
14b60 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a  4 billion rows *
14b70 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  /.  computeLimit
14b80 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
14b90 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  , p, addrBreak);
14ba0 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  .  pLimit = p->p
14bb0 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4c 69 6d 69  Limit;.  regLimi
14bc0 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
14bd0 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e   regOffset = p->
14be0 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c  iOffset;.  p->pL
14bf0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69  imit = 0;.  p->i
14c00 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73  Limit = p->iOffs
14c10 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72  et = 0;.  pOrder
14c20 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
14c30 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  ;..  /* Locate t
14c40 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
14c50 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74 20   of the Current 
14c60 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69  table */.  for(i
14c70 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72  =0; ALWAYS(i<pSr
14c80 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a  c->nSrc); i++){.
14c90 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b      if( pSrc->a[
14ca0 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76  i].fg.isRecursiv
14cb0 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72  e ){.      iCurr
14cc0 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  ent = pSrc->a[i]
14cd0 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  .iCursor;.      
14ce0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
14cf0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
14d00 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20  cursors numbers 
14d10 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44 69  for Queue and Di
14d20 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72  stinct.  The cur
14d30 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20  sor number for. 
14d40 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74   ** the Distinct
14d50 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65   table must be e
14d60 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74  xactly one great
14d70 65 72 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e  er than Queue in
14d80 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20   order.  ** for 
14d90 74 68 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f  the SRT_DistFifo
14da0 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65   and SRT_DistQue
14db0 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20  ue destinations 
14dc0 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51  to work. */.  iQ
14dd0 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  ueue = pParse->n
14de0 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e  Tab++;.  if( p->
14df0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
14e00 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64      eDest = pOrd
14e10 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51  erBy ? SRT_DistQ
14e20 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46  ueue : SRT_DistF
14e30 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e  ifo;.    iDistin
14e40 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
14e50 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  b++;.  }else{.  
14e60 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
14e70 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a  By ? SRT_Queue :
14e80 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20   SRT_Fifo;.  }. 
14e90 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
14ea0 73 74 49 6e 69 74 28 26 64 65 73 74 51 75 65 75  stInit(&destQueu
14eb0 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75 65  e, eDest, iQueue
14ec0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
14ed0 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75  e cursors for Cu
14ee0 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e  rrent, Queue, an
14ef0 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20  d Distinct. */. 
14f00 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b   regCurrent = ++
14f10 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
14f20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14f30 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
14f40 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65  do, iCurrent, re
14f50 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b  gCurrent, nCol);
14f60 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
14f70 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
14f80 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69  pKeyInfo = multi
14f90 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79  SelectOrderByKey
14fa0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20  Info(pParse, p, 
14fb0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
14fc0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
14fd0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
14fe0 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d  Queue, pOrderBy-
14ff0 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20  >nExpr+2, 0,.   
15000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15010 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
15020 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
15030 0a 20 20 20 20 64 65 73 74 51 75 65 75 65 2e 70  .    destQueue.p
15040 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
15050 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  By;.  }else{.   
15060 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15070 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
15080 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20  emeral, iQueue, 
15090 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62  nCol);.  }.  Vdb
150a0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75  eComment((v, "Qu
150b0 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20  eue table"));.  
150c0 69 66 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b  if( iDistinct ){
150d0 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e  .    p->addrOpen
150e0 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Ephm[0] = sqlite
150f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15100 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
15110 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a   iDistinct, 0);.
15120 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
15130 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
15140 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ral;.  }..  /* D
15150 65 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  etach the ORDER 
15160 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  BY clause from t
15170 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
15180 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  CT */.  p->pOrde
15190 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53  rBy = 0;..  /* S
151a0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
151b0 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71 75   of the setup-qu
151c0 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f  ery in Queue. */
151d0 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74  .  pSetup->pNext
151e0 20 3d 20 30 3b 0a 20 20 45 78 70 6c 61 69 6e 51   = 0;.  ExplainQ
151f0 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
15200 2c 20 31 2c 20 22 53 45 54 55 50 22 29 29 3b 0a  , 1, "SETUP"));.
15210 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
15220 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
15230 74 75 70 2c 20 26 64 65 73 74 51 75 65 75 65 29  tup, &destQueue)
15240 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78  ;.  pSetup->pNex
15250 74 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20  t = p;.  if( rc 
15260 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65  ) goto end_of_re
15270 63 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a  cursive_query;..
15280 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65    /* Find the ne
15290 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75  xt row in the Qu
152a0 65 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74  eue and output t
152b0 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64  hat row */.  add
152c0 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
152d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
152e0 65 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61  ewind, iQueue, a
152f0 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43  ddrBreak); VdbeC
15300 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
15310 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e  * Transfer the n
15320 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65  ext row in Queue
15330 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74   over to Current
15340 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
15350 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
15360 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29  llRow, iCurrent)
15370 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f  ; /* To reset co
15380 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  lumn cache */.  
15390 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
153a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
153b0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
153c0 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64  mn, iQueue, pOrd
153d0 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72  erBy->nExpr+1, r
153e0 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65  egCurrent);.  }e
153f0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
15400 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15410 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65  _RowData, iQueue
15420 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20  , regCurrent);. 
15430 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
15440 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
15450 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20  ete, iQueue);.. 
15460 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73   /* Output the s
15470 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72  ingle row in Cur
15480 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f  rent */.  addrCo
15490 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
154a0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
154b0 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72 65  codeOffset(v, re
154c0 67 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e  gOffset, addrCon
154d0 74 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65  t);.  selectInne
154e0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
154f0 20 69 43 75 72 72 65 6e 74 2c 0a 20 20 20 20 20   iCurrent,.     
15500 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 61 64   0, 0, pDest, ad
15510 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61  drCont, addrBrea
15520 6b 29 3b 0a 20 20 69 66 28 20 72 65 67 4c 69 6d  k);.  if( regLim
15530 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
15540 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15550 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20  P_DecrJumpZero, 
15560 72 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42 72  regLimit, addrBr
15570 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  eak);.    VdbeCo
15580 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
15590 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
155a0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
155b0 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65  Cont);..  /* Exe
155c0 63 75 74 65 20 74 68 65 20 72 65 63 75 72 73 69  cute the recursi
155d0 76 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e 67  ve SELECT taking
155e0 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20   the single row 
155f0 69 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20 20  in Current as.  
15600 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ** the value for
15610 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74   the recursive-t
15620 61 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65 20  able. Store the 
15630 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 51  results in the Q
15640 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ueue..  */.  if(
15650 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
15660 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20  F_Aggregate ){. 
15670 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15680 73 67 28 70 50 61 72 73 65 2c 20 22 72 65 63 75  sg(pParse, "recu
15690 72 73 69 76 65 20 61 67 67 72 65 67 61 74 65 20  rsive aggregate 
156a0 71 75 65 72 69 65 73 20 6e 6f 74 20 73 75 70 70  queries not supp
156b0 6f 72 74 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65  orted");.  }else
156c0 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  {.    p->pPrior 
156d0 3d 20 30 3b 0a 20 20 20 20 45 78 70 6c 61 69 6e  = 0;.    Explain
156e0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
156f0 65 2c 20 31 2c 20 22 52 45 43 55 52 53 49 56 45  e, 1, "RECURSIVE
15700 20 53 54 45 50 22 29 29 3b 0a 20 20 20 20 73 71   STEP"));.    sq
15710 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
15720 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75  se, p, &destQueu
15730 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
15740 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a  p->pPrior==0 );.
15750 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
15760 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f  pSetup;.  }..  /
15770 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74  * Keep running t
15780 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68  he loop until th
15790 65 20 51 75 65 75 65 20 69 73 20 65 6d 70 74 79  e Queue is empty
157a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
157b0 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70  eGoto(v, addrTop
157c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
157d0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
157e0 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64  addrBreak);..end
157f0 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75  _of_recursive_qu
15800 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  ery:.  sqlite3Ex
15810 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
15820 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64  rse->db, p->pOrd
15830 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64  erBy);.  p->pOrd
15840 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
15850 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  .  p->pLimit = p
15860 4c 69 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e 3b  Limit;.  return;
15870 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
15880 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
15890 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
158a0 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63  rences */.static
158b0 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
158c0 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
158d0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
158e0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
158f0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
15900 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
15910 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
15920 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
15930 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
15940 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
15950 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
15960 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
15970 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  lts */.);../*.**
15980 20 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63   Handle the spec
15990 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f  ial case of a co
159a0 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68  mpound-select th
159b0 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  at originates fr
159c0 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63  om a.** VALUES c
159d0 6c 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c  lause.  By handl
159e0 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 70  ing this as a sp
159f0 65 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61  ecial case, we a
15a00 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63  void deep.** rec
15a10 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73  ursion, and thus
15a20 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
15a30 65 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49  enforce the SQLI
15a40 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
15a50 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61  D_SELECT.** on a
15a60 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a   VALUES clause..
15a70 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68  **.** Because th
15a80 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20  e Select object 
15a90 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20  originates from 
15aa0 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a  a VALUES clause:
15ab0 0a 2a 2a 20 20 20 28 31 29 20 54 68 65 72 65 20  .**   (1) There 
15ac0 69 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f  is no LIMIT or O
15ad0 46 46 53 45 54 20 6f 72 20 65 6c 73 65 20 74 68  FFSET or else th
15ae0 65 72 65 20 69 73 20 61 20 4c 49 4d 49 54 20 6f  ere is a LIMIT o
15af0 66 20 65 78 61 63 74 6c 79 20 31 0a 2a 2a 20 20  f exactly 1.**  
15b00 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20 61   (2) All terms a
15b10 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20  re UNION ALL.** 
15b20 20 20 28 33 29 20 54 68 65 72 65 20 69 73 20 6e    (3) There is n
15b30 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
15b40 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 4c 49 4d  e.**.** The "LIM
15b50 49 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31 22  IT of exactly 1"
15b60 20 63 61 73 65 20 6f 66 20 63 6f 6e 64 69 74 69   case of conditi
15b70 6f 6e 20 28 31 29 20 63 6f 6d 65 73 20 61 62 6f  on (1) comes abo
15b80 75 74 20 77 68 65 6e 20 61 20 56 41 4c 55 45 53  ut when a VALUES
15b90 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 63 63 75 72  .** clause occur
15ba0 73 20 77 69 74 68 69 6e 20 73 63 61 6c 61 72 20  s within scalar 
15bb0 65 78 70 72 65 73 73 69 6f 6e 20 28 65 78 3a 20  expression (ex: 
15bc0 22 53 45 4c 45 43 54 20 28 56 41 4c 55 45 53 28  "SELECT (VALUES(
15bd0 31 29 2c 28 32 29 2c 28 33 29 29 22 29 2e 0a 2a  1),(2),(3))")..*
15be0 2a 20 54 68 65 20 73 71 6c 69 74 65 33 43 6f 64  * The sqlite3Cod
15bf0 65 53 75 62 73 65 6c 65 63 74 20 77 69 6c 6c 20  eSubselect will 
15c00 68 61 76 65 20 61 64 64 65 64 20 74 68 65 20 4c  have added the L
15c10 49 4d 49 54 20 31 20 63 6c 61 75 73 65 20 69 6e  IMIT 1 clause in
15c20 20 74 68 74 20 63 61 73 65 2e 0a 2a 2a 20 53 69   tht case..** Si
15c30 6e 63 65 20 74 68 65 20 6c 69 6d 69 74 20 69 73  nce the limit is
15c40 20 65 78 61 63 74 6c 79 20 31 2c 20 77 65 20 6f   exactly 1, we o
15c50 6e 6c 79 20 6e 65 65 64 20 74 6f 20 65 76 61 6c  nly need to eval
15c60 75 74 65 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  utes the left-mo
15c70 73 74 20 56 41 4c 55 45 53 2e 0a 2a 2f 0a 73 74  st VALUES..*/.st
15c80 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
15c90 6c 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61  lectValues(.  Pa
15ca0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
15cb0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
15cc0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
15cd0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
15ce0 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
15cf0 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
15d00 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
15d10 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
15d20 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
15d30 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
15d40 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
15d50 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69  nt nRow = 1;.  i
15d60 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 6e 74  nt rc = 0;.  int
15d70 20 62 53 68 6f 77 41 6c 6c 20 3d 20 70 2d 3e 70   bShowAll = p->p
15d80 4c 69 6d 69 74 3d 3d 30 3b 0a 20 20 61 73 73 65  Limit==0;.  asse
15d90 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
15da0 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20  & SF_MultiValue 
15db0 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73  );.  do{.    ass
15dc0 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
15dd0 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a   & SF_Values );.
15de0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
15df0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d  p==TK_ALL || (p-
15e00 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26  >op==TK_SELECT &
15e10 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20  & p->pPrior==0) 
15e20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
15e30 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d  ->pNext==0 || p-
15e40 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  >pEList->nExpr==
15e50 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74  p->pNext->pEList
15e60 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 69  ->nExpr );.    i
15e70 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  f( p->pPrior==0 
15e80 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73  ) break;.    ass
15e90 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e  ert( p->pPrior->
15ea0 70 4e 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20  pNext==p );.    
15eb0 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  p = p->pPrior;. 
15ec0 20 20 20 6e 52 6f 77 20 2b 3d 20 62 53 68 6f 77     nRow += bShow
15ed0 41 6c 6c 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29  All;.  }while(1)
15ee0 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79  ;.  ExplainQuery
15ef0 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c  Plan((pParse, 0,
15f00 20 22 53 43 41 4e 20 25 64 20 43 4f 4e 53 54 41   "SCAN %d CONSTA
15f10 4e 54 20 52 4f 57 25 73 22 2c 20 6e 52 6f 77 2c  NT ROW%s", nRow,
15f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15f30 20 20 20 20 20 6e 52 6f 77 3d 3d 31 20 3f 20 22       nRow==1 ? "
15f40 22 20 3a 20 22 53 22 29 29 3b 0a 20 20 77 68 69  " : "S"));.  whi
15f50 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 73 65 6c  le( p ){.    sel
15f60 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
15f70 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30 2c 20 30  rse, p, -1, 0, 0
15f80 2c 20 70 44 65 73 74 2c 20 31 2c 20 31 29 3b 0a  , pDest, 1, 1);.
15f90 20 20 20 20 69 66 28 20 21 62 53 68 6f 77 41 6c      if( !bShowAl
15fa0 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  l ) break;.    p
15fb0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e  ->nSelectRow = n
15fc0 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  Row;.    p = p->
15fd0 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  pNext;.  }.  ret
15fe0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15ff0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
16000 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
16010 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  ss a compound qu
16020 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a  ery form from.**
16030 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
16040 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73  arate queries us
16050 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e  ing UNION, UNION
16060 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72   ALL, EXCEPT, or
16070 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a  .** INTERSECT.**
16080 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74  .** "p" points t
16090 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
160a0 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
160b0 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20  ies.  the query 
160c0 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69  on the.** left i
160d0 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68  s p->pPrior.  Th
160e0 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75  e left query cou
160f0 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d  ld also be a com
16100 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69  pound query.** i
16110 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69  n which case thi
16120 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  s routine will b
16130 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  e called recursi
16140 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  vely. .**.** The
16150 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
16160 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20  total query are 
16170 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
16180 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
16190 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73  .** of type eDes
161a0 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
161b0 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78   iParm..**.** Ex
161c0 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64  ample 1:  Consid
161d0 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63  er a three-way c
161e0 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74  ompound SQL stat
161f0 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
16200 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
16210 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
16220 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
16230 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
16240 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65  **.** This state
16250 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75  ment is parsed u
16260 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  p as follows:.**
16270 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
16280 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20   FROM t3.**     
16290 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d   |.**      `----
162a0 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ->  SELECT b FRO
162b0 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20  M t2.**         
162c0 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
162d0 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d             `----
162e0 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52  -->  SELECT a FR
162f0 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OM t1.**.** The 
16300 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69  arrows in the di
16310 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72  agram above repr
16320 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74  esent the Select
16330 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e  .pPrior pointer.
16340 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72  .** So if this r
16350 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
16360 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f   with p equal to
16370 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74   the t3 query, t
16380 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69  hen.** pPrior wi
16390 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65  ll be the t2 que
163a0 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20  ry.  p->op will 
163b0 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74  be TK_UNION in t
163c0 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
163d0 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61  Notice that beca
163e0 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
163f0 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d  QLite parses com
16400 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74  pound SELECTs, t
16410 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
16420 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20   selects always 
16430 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20  group from left 
16440 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  to right..*/.sta
16450 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
16460 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
16470 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
16480 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
16490 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
164a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
164b0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
164c0 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
164d0 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
164e0 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
164f0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
16500 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
16510 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
16520 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
16530 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
16540 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
16550 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
16560 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
16570 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
16580 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
16590 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
165a0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
165b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
165c0 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
165d0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
165e0 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65  st;      /* Alte
165f0 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73  rnative data des
16600 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  tination */.  Se
16610 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20  lect *pDelete = 
16620 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20  0;  /* Chain of 
16630 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74  simple selects t
16640 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71  o delete */.  sq
16650 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
16660 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
16670 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20  connection */.. 
16680 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
16690 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
166a0 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75  BY or LIMIT clau
166b0 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
166c0 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20  CTs.  Only.  ** 
166d0 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d  the last (right-
166e0 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20  most) SELECT in 
166f0 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68  the series may h
16700 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
16710 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20  or LIMIT..  */. 
16720 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d   assert( p && p-
16730 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43  >pPrior );  /* C
16740 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
16750 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20  guarantees this 
16760 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74  much */.  assert
16770 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
16780 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d   SF_Recursive)==
16790 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  0 || p->op==TK_A
167a0 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  LL || p->op==TK_
167b0 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20  UNION );.  db = 
167c0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50  pParse->db;.  pP
167d0 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
167e0 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73  ;.  dest = *pDes
167f0 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  t;.  if( pPrior-
16800 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 50 72  >pOrderBy || pPr
16810 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ior->pLimit ){. 
16820 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
16830 73 67 28 70 50 61 72 73 65 2c 22 25 73 20 63 6c  sg(pParse,"%s cl
16840 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
16850 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65   after %s not be
16860 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 70 50 72  fore",.      pPr
16870 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30  ior->pOrderBy!=0
16880 20 3f 20 22 4f 52 44 45 52 20 42 59 22 20 3a 20   ? "ORDER BY" : 
16890 22 4c 49 4d 49 54 22 2c 20 73 65 6c 65 63 74 4f  "LIMIT", selectO
168a0 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
168b0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
168c0 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
168d0 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d  _end;.  }..  v =
168e0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
168f0 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
16900 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54  t( v!=0 );  /* T
16910 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  he VDBE already 
16920 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69  created by calli
16930 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  ng function */..
16940 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
16950 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70  destination temp
16960 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e  orary table if n
16970 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20  ecessary.  */.  
16980 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
16990 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
169a0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
169b0 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c  EList );.    sql
169c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
169d0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
169e0 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d  al, dest.iSDParm
169f0 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
16a00 70 72 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44  pr);.    dest.eD
16a10 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b  est = SRT_Table;
16a20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69  .  }..  /* Speci
16a30 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20  al handling for 
16a40 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  a compound-selec
16a50 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65  t that originate
16a60 73 20 61 73 20 61 20 56 41 4c 55 45 53 20 63 6c  s as a VALUES cl
16a70 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ause..  */.  if(
16a80 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
16a90 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 7b 0a  F_MultiValue ){.
16aa0 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
16ab0 6c 65 63 74 56 61 6c 75 65 73 28 70 50 61 72 73  lectValues(pPars
16ac0 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
16ad0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
16ae0 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
16af0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
16b00 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20   SELECTs in the 
16b10 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74  statement have t
16b20 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
16b30 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  f elements.  ** 
16b40 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20  in their result 
16b50 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sets..  */.  ass
16b60 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
16b70 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
16b80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
16b90 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  >pEList->nExpr==
16ba0 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
16bb0 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66 6e 64 65  nExpr );..#ifnde
16bc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
16bd0 45 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  E.  if( p->selFl
16be0 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
16bf0 76 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ve ){.    genera
16c00 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51  teWithRecursiveQ
16c10 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
16c20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  &dest);.  }else.
16c30 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d  #endif..  /* Com
16c40 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68  pound SELECTs th
16c50 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  at have an ORDER
16c60 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68   BY clause are h
16c70 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c  andled separatel
16c80 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  y..  */.  if( p-
16c90 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
16ca0 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c   return multiSel
16cb0 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73  ectOrderBy(pPars
16cc0 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
16cd0 7d 65 6c 73 65 7b 0a 0a 23 69 66 6e 64 65 66 20  }else{..#ifndef 
16ce0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
16cf0 41 49 4e 0a 20 20 20 20 69 66 28 20 70 50 72 69  AIN.    if( pPri
16d00 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b  or->pPrior==0 ){
16d10 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75  .      ExplainQu
16d20 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
16d30 20 31 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 51 55   1, "COMPOUND QU
16d40 45 52 59 22 29 29 3b 0a 20 20 20 20 20 20 45 78  ERY"));.      Ex
16d50 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
16d60 70 50 61 72 73 65 2c 20 31 2c 20 22 4c 45 46 54  pParse, 1, "LEFT
16d70 2d 4d 4f 53 54 20 53 55 42 51 55 45 52 59 22 29  -MOST SUBQUERY")
16d80 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
16d90 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
16da0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65   code for the le
16db0 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c  ft and right SEL
16dc0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
16dd0 20 20 20 20 2a 2f 0a 20 20 20 20 73 77 69 74 63      */.    switc
16de0 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
16df0 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b    case TK_ALL: {
16e00 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
16e10 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  r = 0;.        i
16e20 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20  nt nLimit;.     
16e30 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
16e40 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20  or->pLimit );.  
16e50 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c        pPrior->iL
16e60 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
16e70 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72  ;.        pPrior
16e80 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  ->iOffset = p->i
16e90 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
16ea0 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d  pPrior->pLimit =
16eb0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
16ec0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16ed0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
16ee0 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20  Prior, &dest);. 
16ef0 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74         p->pLimit
16f00 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
16f10 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
16f20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
16f30 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
16f40 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50   }.        p->pP
16f50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
16f60 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50    p->iLimit = pP
16f70 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  rior->iLimit;.  
16f80 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
16f90 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
16fa0 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  et;.        if( 
16fb0 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
16fc0 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
16fd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16fe0 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e  v, OP_IfNot, p->
16ff0 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
17000 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
17010 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
17020 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20  (v, "Jump ahead 
17030 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64  if LIMIT reached
17040 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  "));.          i
17050 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b  f( p->iOffset ){
17060 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
17070 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
17080 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74  , OP_OffsetLimit
17090 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
170a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170b0 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f  p->iLimit, p->iO
170c0 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66  ffset+1, p->iOff
170d0 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  set);.          
170e0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
170f0 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
17100 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
17110 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 29 29 3b 0a   "UNION ALL"));.
17120 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
17130 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
17140 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
17150 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17160 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
17170 0a 20 20 20 20 20 20 20 20 70 44 65 6c 65 74 65  .        pDelete
17180 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
17190 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
171a0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
171b0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
171c0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
171d0 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  dd(p->nSelectRow
171e0 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  , pPrior->nSelec
171f0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 69  tRow);.        i
17200 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
17210 74 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  t.         && sq
17220 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
17230 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  er(pPrior->pLimi
17240 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c 69 6d 69  t->pLeft, &nLimi
17250 74 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e  t).         && n
17260 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53  Limit>0 && p->nS
17270 65 6c 65 63 74 52 6f 77 20 3e 20 73 71 6c 69 74  electRow > sqlit
17280 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c  e3LogEst((u64)nL
17290 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20 29  imit) .        )
172a0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  {.          p->n
172b0 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
172c0 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
172d0 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20  Limit);.        
172e0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  }.        if( ad
172f0 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  dr ){.          
17300 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
17310 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
17320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17330 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
17340 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43       case TK_EXC
17350 45 50 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20  EPT:.      case 
17360 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
17370 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
17380 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
17390 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
173a0 70 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20  p table holding 
173b0 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
173c0 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20    u8 op = 0;    
173d0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
173e0 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
173f0 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
17400 66 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  f */.        int
17410 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a   priorOp;     /*
17420 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   The SRT_ operat
17430 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ion to apply to 
17440 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f  prior selects */
17450 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
17460 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 53 61 76  Limit;    /* Sav
17470 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e  ed values of p->
17480 6e 4c 69 6d 69 74 20 20 2a 2f 0a 20 20 20 20 20  nLimit  */.     
17490 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
174a0 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
174b0 75 6e 69 6f 6e 64 65 73 74 3b 0a 20 20 0a 20 20  uniondest;.  .  
174c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
174d0 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
174e0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
174f0 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
17500 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20  UNION );.       
17510 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55   priorOp = SRT_U
17520 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66  nion;.        if
17530 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72  ( dest.eDest==pr
17540 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20  iorOp ){.       
17550 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
17560 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
17570 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
17580 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
17590 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  r.          ** r
175a0 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 20 20  ight..          
175b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
175c0 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d  ert( p->pLimit==
175d0 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74  0 );      /* Not
175e0 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74   allowed on left
175f0 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  ward elements */
17600 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  .          union
17610 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61  Tab = dest.iSDPa
17620 72 6d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  rm;.        }els
17630 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
17640 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  We will need to 
17650 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74  create our own t
17660 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
17670 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20  o hold the.     
17680 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64       ** intermed
17690 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20  iate results..  
176a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
176b0 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
176c0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
176d0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
176e0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
176f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 64   );.          ad
17700 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
17710 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
17720 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f  nEphemeral, unio
17730 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
17740 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
17750 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
17760 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  = -1 );.        
17770 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
17780 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
17790 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74         findRight
177a0 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67  most(p)->selFlag
177b0 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
177c0 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 20  meral;.         
177d0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
177e0 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  st );.        }.
177f0 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f    .        /* Co
17800 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
17810 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
17820 6c 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a  left.        */.
17830 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17840 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42  !pPrior->pOrderB
17850 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  y );.        sql
17860 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
17870 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70  it(&uniondest, p
17880 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
17890 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
178a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
178b0 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75  arse, pPrior, &u
178c0 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
178d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
178e0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
178f0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
17900 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
17910 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
17920 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74  urrent SELECT st
17930 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20  atement.        
17940 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
17950 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
17960 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20  ){.          op 
17970 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20  = SRT_Except;.  
17980 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17990 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
179a0 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
179b0 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d  ;.          op =
179c0 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
179d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
179e0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
179f0 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
17a00 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  >pLimit;.       
17a10 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
17a20 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73          uniondes
17a30 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20  t.eDest = op;.  
17a40 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
17a50 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
17a60 31 2c 20 22 25 73 20 55 53 49 4e 47 20 54 45 4d  1, "%s USING TEM
17a70 50 20 42 2d 54 52 45 45 22 2c 0a 20 20 20 20 20  P B-TREE",.     
17a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a90 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
17aa0 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20 20 20 20  e(p->op)));.    
17ab0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17ac0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
17ad0 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20  , &uniondest);. 
17ae0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
17af0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17b00 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65  ;.        /* Que
17b10 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ry flattening in
17b20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
17b30 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d   might refill p-
17b40 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20  >pOrderBy..     
17b50 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f     ** Be sure to
17b60 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65   delete p->pOrde
17b70 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20  rBy, therefore, 
17b80 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72  to avoid a memor
17b90 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20  y leak. */.     
17ba0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
17bb0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
17bc0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
17bd0 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
17be0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
17bf0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
17c00 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  or;.        p->p
17c10 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
17c20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
17c30 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
17c40 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
17c50 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
17c60 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63  EstAdd(p->nSelec
17c70 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53  tRow, pPrior->nS
17c80 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20  electRow);.     
17c90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
17ca0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
17cb0 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
17cc0 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74         p->pLimit
17cd0 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
17ce0 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30     p->iLimit = 0
17cf0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66  ;.        p->iOf
17d00 66 73 65 74 20 3d 20 30 3b 0a 20 20 0a 20 20 20  fset = 0;.  .   
17d10 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
17d20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20  the data in the 
17d30 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
17d40 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
17d50 72 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rm.        ** it
17d60 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72   is that we curr
17d70 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20  ently need..    
17d80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
17d90 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d  ssert( unionTab=
17da0 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c  =dest.iSDParm ||
17db0 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69   dest.eDest!=pri
17dc0 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 20 20  orOp );.        
17dd0 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d  if( dest.eDest!=
17de0 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20  priorOp ){.     
17df0 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
17e00 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
17e10 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17e20 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
17e30 20 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20           iBreak 
17e40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
17e50 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
17e60 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
17e70 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
17e80 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l(v);.          
17e90 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
17ea0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
17eb0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
17ec0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17ed0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
17ee0 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42  nd, unionTab, iB
17ef0 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
17f00 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
17f10 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
17f20 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
17f30 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r(v);.          
17f40 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
17f50 70 50 61 72 73 65 2c 20 70 2c 20 75 6e 69 6f 6e  pParse, p, union
17f60 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
17f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
17f80 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e  , 0, &dest, iCon
17f90 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
17fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17fb0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
17fc0 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20   iCont);.       
17fd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17fe0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
17ff0 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
18000 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
18010 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
18020 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
18030 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
18040 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
18050 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18060 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f  , OP_Close, unio
18070 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
18080 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
18090 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
180a0 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
180b0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  ( p->op==TK_INTE
180c0 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20  RSECT ); {.     
180d0 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62     int tab1, tab
180e0 32 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  2;.        int i
180f0 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
18100 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 45 78  tart;.        Ex
18110 70 72 20 2a 70 4c 69 6d 69 74 3b 0a 20 20 20 20  pr *pLimit;.    
18120 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
18130 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
18140 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a   intersectdest;.
18150 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a          int r1;.
18160 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 4e    .        /* IN
18170 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65  TERSECT is diffe
18180 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74  rent from the ot
18190 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65  hers since it re
181a0 71 75 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a  quires.        *
181b0 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20  * two temporary 
181c0 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69  tables.  Hence i
181d0 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61  t has its own ca
181e0 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20  se.  Begin.     
181f0 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
18200 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
18210 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
18220 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
18230 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
18240 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 74  Tab++;.        t
18250 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
18260 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ab++;.        as
18270 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
18280 79 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 20  y==0 );.  .     
18290 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
182a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
182b0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
182c0 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
182d0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
182e0 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
182f0 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70   -1 );.        p
18300 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
18310 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
18320 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28    findRightmost(
18330 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  p)->selFlags |= 
18340 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
18350 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
18360 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
18370 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64   .        /* Cod
18380 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f  e the SELECTs to
18390 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74   our left into t
183a0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
183b0 74 61 62 31 22 2e 0a 20 20 20 20 20 20 20 20 2a  tab1"..        *
183c0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
183d0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
183e0 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
183f0 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29  SRT_Union, tab1)
18400 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
18410 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
18420 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e  rse, pPrior, &in
18430 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
18440 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
18450 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
18460 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
18470 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
18480 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
18490 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
184a0 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
184b0 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
184c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
184d0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
184e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
184f0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
18500 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  b2, 0);.        
18510 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
18520 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31  penEphm[1] == -1
18530 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   );.        p->a
18540 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
18550 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 70   addr;.        p
18560 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
18570 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
18580 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
18590 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
185a0 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 73 65  .        interse
185b0 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d  ctdest.iSDParm =
185c0 20 74 61 62 32 3b 0a 20 20 20 20 20 20 20 20 45   tab2;.        E
185d0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
185e0 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73 20  (pParse, 1, "%s 
185f0 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
18600 45 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E",.            
18610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
18620 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
18630 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  )));.        rc 
18640 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
18650 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65  pParse, p, &inte
18660 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20  rsectdest);.    
18670 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
18680 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
18690 20 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d         pDelete =
186a0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
186b0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
186c0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
186d0 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
186e0 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  w>pPrior->nSelec
186f0 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  tRow ){.        
18700 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
18710 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
18720 74 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tRow;.        }.
18730 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
18740 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
18750 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
18760 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
18770 69 6d 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 20  imit;.  .       
18780 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
18790 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
187a0 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
187b0 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
187c0 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
187d0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
187e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
187f0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
18800 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
18810 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
18820 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
18830 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
18840 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
18850 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
18860 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
18870 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
18880 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18890 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
188a0 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42  Rewind, tab1, iB
188b0 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
188c0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
188d0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
188e0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
188f0 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
18900 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18910 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61  p2(v, OP_RowData
18920 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20  , tab1, r1);.   
18930 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18940 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
18950 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20  NotFound, tab2, 
18960 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 0a 20  iCont, r1, 0);. 
18970 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
18980 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
18990 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
189a0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
189b0 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63  );.        selec
189c0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
189d0 65 2c 20 70 2c 20 74 61 62 31 2c 0a 20 20 20 20  e, p, tab1,.    
189e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189f0 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c      0, 0, &dest,
18a00 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
18a10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18a20 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
18a30 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
18a40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18a50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
18a60 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b  , tab1, iStart);
18a70 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
18a80 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18a90 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
18aa0 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
18ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18ac0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
18ad0 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ose, tab2, 0);. 
18ae0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18af0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
18b00 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lose, tab1, 0);.
18b10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18b20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
18b30 20 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45    #ifndef SQLITE
18b40 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
18b50 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d 3d    if( p->pNext==
18b60 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 6c 61  0 ){.      Expla
18b70 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28 70  inQueryPlanPop(p
18b80 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
18b90 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20  #endif.  }.  .  
18ba0 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
18bb0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
18bc0 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d  sed by .  ** tem
18bd0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
18be0 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
18bf0 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
18c00 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
18c10 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
18c20 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
18c30 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
18c40 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
18c50 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20   section is run 
18c60 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  by the right-mos
18c70 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
18c80 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45  nt only..  ** SE
18c90 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
18ca0 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61  to the left alwa
18cb0 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  ys skip this par
18cc0 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  t.  The right-mo
18cd0 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d  st.  ** SELECT m
18ce0 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74  ight also skip t
18cf0 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68  his part if it h
18d00 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  as no ORDER BY c
18d10 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e  lause and.  ** n
18d20 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72  o temp tables ar
18d30 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  e required..  */
18d40 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
18d50 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65  gs & SF_UsesEphe
18d60 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  meral ){.    int
18d70 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
18d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
18d90 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
18da0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
18db0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
18dc0 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
18dd0 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65  uence for the re
18de0 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
18df0 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20  Select *pLoop;  
18e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18e10 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
18e20 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74  ough SELECT stat
18e30 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f  ements */.    Co
18e40 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
18e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18e60 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
18e70 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
18e80 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ll[] */.    int 
18e90 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
18ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
18eb0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
18ec0 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  n result set */.
18ed0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
18ee0 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pNext==0 );.    
18ef0 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
18f00 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65  ->nExpr;.    pKe
18f10 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
18f20 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
18f30 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66  nCol, 1);.    if
18f40 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  ( !pKeyInfo ){. 
18f50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
18f60 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
18f70 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
18f80 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
18f90 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43      for(i=0, apC
18fa0 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  oll=pKeyInfo->aC
18fb0 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  oll; i<nCol; i++
18fc0 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20  , apColl++){.   
18fd0 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c     *apColl = mul
18fe0 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
18ff0 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
19000 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43       if( 0==*apC
19010 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  oll ){.        *
19020 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66  apColl = db->pDf
19030 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
19040 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
19050 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
19060 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
19070 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
19080 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
19090 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
190a0 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
190b0 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
190c0 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
190d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
190e0 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
190f0 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
19100 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
19110 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
19120 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
19130 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
19140 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
19150 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
19160 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
19170 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
19180 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
19190 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
191a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
191b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
191c0 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
191d0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
191e0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
191f0 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
19200 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
19210 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20  ef(pKeyInfo),.  
19220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19230 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59            P4_KEY
19240 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70  INFO);.        p
19250 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
19260 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[i] = -1;.    
19270 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
19280 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
19290 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d  f(pKeyInfo);.  }
192a0 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  ..multi_select_e
192b0 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64  nd:.  pDest->iSd
192c0 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b  st = dest.iSdst;
192d0 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
192e0 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20  = dest.nSdst;.  
192f0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
19300 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29  ete(db, pDelete)
19310 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19320 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
19330 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
19340 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SELECT */../*.**
19350 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   Error message f
19360 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d  or when two or m
19370 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 61 20 63  ore terms of a c
19380 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 68  ompound select h
19390 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ave different.**
193a0 20 73 69 7a 65 20 72 65 73 75 6c 74 20 73 65 74   size result set
193b0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
193c0 65 33 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d  e3SelectWrongNum
193d0 54 65 72 6d 73 45 72 72 6f 72 28 50 61 72 73 65  TermsError(Parse
193e0 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
193f0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73   *p){.  if( p->s
19400 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c  elFlags & SF_Val
19410 75 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ues ){.    sqlit
19420 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
19430 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d  e, "all VALUES m
19440 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ust have the sam
19450 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  e number of term
19460 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s");.  }else{.  
19470 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
19480 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43  g(pParse, "SELEC
19490 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  Ts to the left a
194a0 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a  nd right of %s".
194b0 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68        " do not h
194c0 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
194d0 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
194e0 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70  lumns", selectOp
194f0 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
19500 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  }.}../*.** Code 
19510 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  an output subrou
19520 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75  tine for a corou
19530 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tine implementat
19540 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45  ion of a.** SELE
19550 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a  CT statment..**.
19560 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62  ** The data to b
19570 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74  e output is cont
19580 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53  ained in pIn->iS
19590 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a  dst.  There are.
195a0 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f  ** pIn->nSdst co
195b0 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70  lumns to be outp
195c0 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68  ut.  pDest is wh
195d0 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73  ere the output s
195e0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74  hould.** be sent
195f0 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72  ..**.** regRetur
19600 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
19610 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  of the register 
19620 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72  holding the subr
19630 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
19640 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
19650 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
19660 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73  n it is the firs
19670 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20  t register in a 
19680 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72  vector that.** r
19690 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69  ecords the previ
196a0 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d  ous output.  mem
196b0 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66  [regPrev] is a f
196c0 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73  lag that is fals
196d0 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61  e.** if there ha
196e0 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f  s been no previo
196f0 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72  us output.  If r
19700 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f  egPrev>0 then co
19710 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74  de is.** generat
19720 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64  ed to suppress d
19730 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79  uplicates.  pKey
19740 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72  Info is used for
19750 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65   comparing.** ke
19760 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
19770 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20   LIMIT found in 
19780 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61  p->iLimit is rea
19790 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  ched, jump immed
197a0 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72  iately to.** iBr
197b0 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eak..*/.static i
197c0 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75  nt generateOutpu
197d0 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50  tSubroutine(.  P
197e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
197f0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
19800 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
19810 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
19820 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
19830 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
19840 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
19850 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  pIn,        /* C
19860 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69  oroutine supplyi
19870 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  ng data */.  Sel
19880 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
19890 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
198a0 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a   send the data *
198b0 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72  /.  int regRetur
198c0 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n,          /* T
198d0 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  he return addres
198e0 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
198f0 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20  int regPrev,    
19900 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
19910 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73  ous result regis
19920 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e  ter.  No uniquen
19930 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65  ess if 0 */.  Ke
19940 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
19950 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d        /* For com
19960 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76  paring with prev
19970 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ious entry */.  
19980 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
19990 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
199a0 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74  here if we hit t
199b0 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20  he LIMIT */.){. 
199c0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
199d0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
199e0 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74  iContinue;.  int
199f0 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d   addr;..  addr =
19a00 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
19a10 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43  entAddr(v);.  iC
19a20 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
19a30 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
19a40 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  );..  /* Suppres
19a50 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72  s duplicates for
19a60 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
19a70 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20  and INTERSECT . 
19a80 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65   */.  if( regPre
19a90 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  v ){.    int add
19aa0 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61  r1, addr2;.    a
19ab0 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
19ac0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
19ad0 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20  fNot, regPrev); 
19ae0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19af0 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
19b00 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
19b10 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49  , OP_Compare, pI
19b20 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65  n->iSdst, regPre
19b30 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c  v+1, pIn->nSdst,
19b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
19b60 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
19b70 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
19b80 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
19b90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19ba0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
19bb0 2c 20 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74  , addr2+2, iCont
19bc0 69 6e 75 65 2c 20 61 64 64 72 32 2b 32 29 3b 20  inue, addr2+2); 
19bd0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19be0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19bf0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
19c00 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
19c10 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
19c20 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74  Copy, pIn->iSdst
19c30 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
19c40 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20  ->nSdst-1);.    
19c50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19c60 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
19c70 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   1, regPrev);.  
19c80 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
19c90 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19ca0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
19cb0 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20  /* Suppress the 
19cc0 66 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74  first OFFSET ent
19cd0 72 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73  ries if there is
19ce0 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73   an OFFSET claus
19cf0 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66  e.  */.  codeOff
19d00 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
19d10 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a  t, iContinue);..
19d20 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
19d30 3e 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73  >eDest!=SRT_Exis
19d40 74 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ts );.  assert( 
19d50 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
19d60 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 73 77 69  T_Table );.  swi
19d70 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73  tch( pDest->eDes
19d80 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72  t ){.    /* Stor
19d90 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
19da0 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
19db0 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
19dc0 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
19dd0 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69  emTab: {.      i
19de0 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
19df0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
19e00 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20  );.      int r2 
19e10 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
19e20 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
19e30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19e40 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
19e50 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
19e60 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72  t, pIn->nSdst, r
19e70 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
19e80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19e90 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73  P_NewRowid, pDes
19ea0 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b  t->iSDParm, r2);
19eb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19ec0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
19ed0 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53  nsert, pDest->iS
19ee0 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a  DParm, r1, r2);.
19ef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19f00 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
19f10 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
19f20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
19f30 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
19f40 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
19f50 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
19f60 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
19f70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19f80 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
19f90 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
19fa0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
19fb0 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
19fc0 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
19fd0 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 20  (SELECT ...)".. 
19fe0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
19ff0 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
1a000 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 74 65  int r1;.      te
1a010 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64  stcase( pIn->nSd
1a020 73 74 3e 31 20 29 3b 0a 20 20 20 20 20 20 72 31  st>1 );.      r1
1a030 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1a040 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
1a050 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a060 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
1a070 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64  Record, pIn->iSd
1a080 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20  st, pIn->nSdst, 
1a090 0a 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 70  .          r1, p
1a0a0 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20  Dest->zAffSdst, 
1a0b0 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
1a0c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1a0d0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1a0e0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
1a0f0 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
1a100 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a110 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
1a120 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
1a130 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
1a140 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
1a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
1a160 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
1a170 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
1a180 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1a190 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
1a1a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a1b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1a1c0 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
1a1d0 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
1a1e0 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
1a1f0 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
1a200 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1a210 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
1a220 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
1a230 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
1a240 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
1a250 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
1a260 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
1a270 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1a280 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20  ( pIn->nSdst==1 
1a290 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
1a2a0 30 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  0 );  testcase( 
1a2b0 70 49 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b  pIn->nSdst!=1 );
1a2c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1a2d0 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
1a2e0 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  e, pIn->iSdst, p
1a2f0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31  Dest->iSDParm, 1
1a300 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
1a310 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
1a320 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
1a330 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
1a340 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a350 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
1a360 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a370 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
1a380 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
1a390 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
1a3a0 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
1a3b0 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73  gisters.    ** s
1a3c0 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73 74  tarting at pDest
1a3d0 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74  ->iSdst.  Then t
1a3e0 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69  he co-routine yi
1a3f0 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elds..    */.   
1a400 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
1a410 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ine: {.      if(
1a420 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30   pDest->iSdst==0
1a430 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73   ){.        pDes
1a440 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74  t->iSdst = sqlit
1a450 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
1a460 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73  Parse, pIn->nSds
1a470 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73  t);.        pDes
1a480 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e  t->nSdst = pIn->
1a490 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  nSdst;.      }. 
1a4a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1a4b0 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
1a4c0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65   pIn->iSdst, pDe
1a4d0 73 74 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  st->iSdst, pIn->
1a4e0 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
1a4f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1a500 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
1a510 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
1a520 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1a530 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65  ..    /* If none
1a540 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74   of the above, t
1a550 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64  hen the result d
1a560 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20  estination must 
1a570 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75  be.    ** SRT_Ou
1a580 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74  tput.  This rout
1a590 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
1a5a0 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68  led with any oth
1a5b0 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e  er.    ** destin
1a5c0 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ation other than
1a5d0 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65   the ones handle
1a5e0 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f  d above or SRT_O
1a5f0 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  utput..    **.  
1a600 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74    ** For SRT_Out
1a610 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65  put, results are
1a620 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
1a630 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
1a640 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65  rs.  .    ** The
1a650 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52  n the OP_ResultR
1a660 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  ow opcode is use
1a670 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74  d to cause sqlit
1a680 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20  e3_step() to.   
1a690 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e   ** return the n
1a6a0 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  ext row of resul
1a6b0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
1a6c0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
1a6d0 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
1a6e0 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
1a6f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a700 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a710 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d  _ResultRow, pIn-
1a720 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
1a730 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
1a740 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
1a750 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
1a760 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
1a770 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
1a780 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1a790 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
1a7a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
1a7b0 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
1a7c0 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
1a7d0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
1a7e0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
1a7f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a800 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70  _DecrJumpZero, p
1a810 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
1a820 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1a830 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  v);.  }..  /* Ge
1a840 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f  nerate the subro
1a850 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a  utine return.  *
1a860 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
1a870 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
1a880 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c  Continue);.  sql
1a890 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1a8a0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
1a8b0 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75  Return);..  retu
1a8c0 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
1a8d0 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * Alternative co
1a8e0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f  mpound select co
1a8f0 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72  de generator for
1a900 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72   cases when ther
1a910 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52  e.** is an ORDER
1a920 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a   BY clause..**.*
1a930 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75  * We assume a qu
1a940 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ery of the follo
1a950 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  wing form:.**.**
1a960 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20        <selectA> 
1a970 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65   <operator>  <se
1a980 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59  lectB>  ORDER BY
1a990 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a   <orderbylist>.*
1a9a0 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20  *.** <operator> 
1a9b0 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20  is one of UNION 
1a9c0 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45  ALL, UNION, EXCE
1a9d0 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
1a9e0 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69  .  The idea.** i
1a9f0 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c  s to code both <
1aa00 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65  selectA> and <se
1aa10 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20  lectB> with the 
1aa20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1aa30 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65  as.** co-routine
1aa40 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65  s.  Then run the
1aa50 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20   co-routines in 
1aa60 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72  parallel and mer
1aa70 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  ge the results.*
1aa80 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  * into the outpu
1aa90 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  t.  In addition 
1aaa0 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  to the two corou
1aab0 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65  tines (called se
1aac0 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c  lectA and.** sel
1aad0 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20  ectB) there are 
1aae0 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a  7 subroutines:.*
1aaf0 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20  *.**    outA:   
1ab00 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
1ab10 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20   of the selectA 
1ab20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
1ab30 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
1ab40 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
1ab50 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a  compound query..
1ab60 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20  **.**    outB:  
1ab70 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
1ab80 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42  t of the selectB
1ab90 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
1aba0 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
1abb0 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
1abc0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
1abd0 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65    (Only generate
1abe0 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a  d for UNION and.
1abf0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
1ac00 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50  NION ALL.  EXCEP
1ac10 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54  T and INSERTSECT
1ac20 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20   never output a 
1ac30 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  row that.**     
1ac40 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20          appears 
1ac50 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a  only in B.).**.*
1ac60 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61  *    AltB:    Ca
1ac70 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
1ac80 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
1ac90 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
1aca0 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41   A<B..**.**    A
1acb0 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  eqB:    Called w
1acc0 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
1acd0 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
1ace0 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e  utines and A==B.
1acf0 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  .**.**    AgtB: 
1ad00 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
1ad10 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
1ad20 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
1ad30 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a  s and A>B..**.**
1ad40 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c      EofA:    Cal
1ad50 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
1ad60 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
1ad70 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20  selectA..**.**  
1ad80 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65    EofB:    Calle
1ad90 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
1ada0 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
1adb0 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lectB..**.** The
1adc0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1add0 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69  of the latter fi
1ade0 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64  ve subroutines d
1adf0 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a  epend on which .
1ae00 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
1ae10 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20   used:.**.**.** 
1ae20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
1ae30 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e  N ALL         UN
1ae40 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45  ION            E
1ae50 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49  XCEPT          I
1ae60 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20  NTERSECT.**     
1ae70 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
1ae80 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
1ae90 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
1aea0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
1aeb0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c  --------.**   Al
1aec0 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  tB:   outA, next
1aed0 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
1aee0 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
1aef0 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
1af00 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a  tA.**.**   AeqB:
1af10 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
1af20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
1af30 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
1af40 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
1af50 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a  tA.**.**   AgtB:
1af60 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
1af70 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
1af80 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20           nextB  
1af90 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a            nextB.
1afa0 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20  **.**   EofA:   
1afb0 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
1afc0 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
1afd0 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20        halt      
1afe0 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
1aff0 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41  *   EofB:   outA
1b000 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
1b010 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
1b020 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
1b030 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e     halt.**.** In
1b040 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c   the AltB, AeqB,
1b050 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75   and AgtB subrou
1b060 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e  tines, an EOF on
1b070 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   A following nex
1b080 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20  tA.** causes an 
1b090 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
1b0a0 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f  o EofA and an EO
1b0b0 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67  F on B following
1b0c0 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a   nextB causes.**
1b0d0 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
1b0e0 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74  mp to EofB.  Wit
1b0f0 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  hin EofA and Eof
1b100 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e  B, and EOF on en
1b110 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  try or.** follow
1b120 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73  ing nextX causes
1b130 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65   a jump to the e
1b140 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  nd of the select
1b150 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
1b160 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d  ** Duplicate rem
1b170 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f  oval in the UNIO
1b180 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
1b190 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69  NTERSECT cases i
1b1a0 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74  s handled.** wit
1b1b0 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73  hin the output s
1b1c0 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
1b1d0 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72  regPrev register
1b1e0 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70   set holds the p
1b1f0 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74  reviously.** out
1b200 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f  put value.  A co
1b210 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
1b220 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61   against this va
1b230 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70  lue and the outp
1b240 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64  ut.** is skipped
1b250 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73   if the next res
1b260 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68  ults would be th
1b270 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72  e same as the pr
1b280 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  evious..**.** Th
1b290 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1b2a0 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c   plan is to impl
1b2b0 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f  ement the two co
1b2c0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76  routines and sev
1b2d0 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  en.** subroutine
1b2e0 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75  s first, then pu
1b2f0 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f  t the control lo
1b300 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f  gic at the botto
1b310 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  m.  Like this:.*
1b320 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f  *.**          go
1b330 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63  to Init.**     c
1b340 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oA: coroutine fo
1b350 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29  r left query (A)
1b360 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72  .**     coB: cor
1b370 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
1b380 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20   query (B).**   
1b390 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e   outA: output on
1b3a0 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20  e row of A.**   
1b3b0 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e   outB: output on
1b3c0 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f  e row of B (UNIO
1b3d0 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20  N and UNION ALL 
1b3e0 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41  only).**    EofA
1b3f0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42  : ....**    EofB
1b400 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42  : ....**    AltB
1b410 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42  : ....**    AeqB
1b420 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42  : ....**    AgtB
1b430 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74  : ....**    Init
1b440 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72  : initialize cor
1b450 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
1b460 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
1b470 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20  ld coA.**       
1b480 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74     if eof(A) got
1b490 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20  o EofA.**       
1b4a0 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20     yield coB.** 
1b4b0 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
1b4c0 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20  B) goto EofB.** 
1b4d0 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65     Cmpr: Compare
1b4e0 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20   A, B.**        
1b4f0 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71    Jump AltB, Aeq
1b500 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45  B, AgtB.**     E
1b510 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65  nd: ....**.** We
1b520 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42   call AltB, AeqB
1b530 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e  , AgtB, EofA, an
1b540 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69  d EofB "subrouti
1b550 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72  nes" but they ar
1b560 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c  e not.** actuall
1b570 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47  y called using G
1b580 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f  osub and they do
1b590 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f   not Return.  Eo
1b5a0 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70  fA and EofB loop
1b5b0 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61  .** until all da
1b5c0 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
1b5d0 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
1b5e0 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c   "end" labe.  Al
1b5f0 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64  tB, AeqB,.** and
1b600 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69   AgtB jump to ei
1b610 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e  ther L2 or to on
1b620 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66  e of EofA or Eof
1b630 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  B..*/.#ifndef SQ
1b640 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
1b650 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63  ND_SELECT.static
1b660 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
1b670 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
1b680 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1b690 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1b6a0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
1b6b0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
1b6c0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
1b6d0 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
1b6e0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
1b6f0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
1b700 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
1b710 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
1b720 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
1b730 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
1b740 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1b750 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  rs */.  Select *
1b760 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
1b770 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
1b780 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
1b790 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
1b7a0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
1b7b0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
1b7c0 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
1b7d0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
1b7e0 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44   destA;     /* D
1b7f0 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
1b800 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20  oroutine A */.  
1b810 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42  SelectDest destB
1b820 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
1b830 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
1b840 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ne B */.  int re
1b850 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20  gAddrA;         
1b860 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
1b870 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
1b880 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
1b890 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20  int regAddrB;   
1b8a0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1b8b0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
1b8c0 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
1b8d0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
1b8e0 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41  lectA;      /* A
1b8f0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
1b900 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
1b910 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
1b920 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41  lectB;      /* A
1b930 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
1b940 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
1b950 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
1b960 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  A;          /* A
1b970 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
1b980 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41  for the output-A
1b990 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1b9a0 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20   int regOutB;   
1b9b0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1b9c0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
1b9d0 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
1b9e0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b9f0 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20  addrOutA;       
1ba00 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1ba10 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
1ba20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1ba30 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20   addrOutB = 0;  
1ba40 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1ba50 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75   the output-B su
1ba60 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
1ba70 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20  t addrEofA;     
1ba80 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1ba90 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65  f the select-A-e
1baa0 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
1bab0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1bac0 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f  rEofA_noB;     /
1bad0 2a 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72  * Alternate addr
1bae0 45 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e 69  EofA if B is uni
1baf0 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
1bb00 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20  int addrEofB;   
1bb10 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1bb20 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
1bb30 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
1bb40 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
1bb50 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20  ddrAltB;        
1bb60 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1bb70 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e  he A<B subroutin
1bb80 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
1bb90 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eqB;         /* 
1bba0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
1bbb0 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ==B subroutine *
1bbc0 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42  /.  int addrAgtB
1bbd0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
1bbe0 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20  ress of the A>B 
1bbf0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1bc00 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20  int regLimitA;  
1bc10 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
1bc20 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
1bc30 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
1bc40 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20  gLimitB;        
1bc50 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
1bc60 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
1bc70 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b  /.  int regPrev;
1bc80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72            /* A r
1bc90 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
1bca0 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f  s to hold previo
1bcb0 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  us output */.  i
1bcc0 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20  nt savedLimit;  
1bcd0 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
1bce0 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74  lue of p->iLimit
1bcf0 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f   */.  int savedO
1bd00 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  ffset;      /* S
1bd10 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
1bd20 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  >iOffset */.  in
1bd30 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20  t labelCmpr;    
1bd40 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
1bd50 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1bd60 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  e merge algorith
1bd70 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  m */.  int label
1bd80 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  End;         /* 
1bd90 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e  Label for the en
1bda0 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c  d of the overall
1bdb0 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a   SELECT stmt */.
1bdc0 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
1bdd0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
1bde0 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
1bdf0 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65  t get retargette
1be00 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  d */.  int op;  
1be10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1be20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54  One of TK_ALL, T
1be30 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
1be40 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  PT, TK_INTERSECT
1be50 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
1be60 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43  KeyDup = 0; /* C
1be70 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
1be80 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
1be90 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20  ate removal */. 
1bea0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65   KeyInfo *pKeyMe
1beb0 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72  rge;   /* Compar
1bec0 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
1bed0 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77   for merging row
1bee0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
1bef0 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
1bf00 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
1bf10 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
1bf20 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f  t *pOrderBy;   /
1bf30 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
1bf40 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
1bf50 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
1bf60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
1bf70 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
1bf80 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
1bf90 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20  int *aPermute;  
1bfa0 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
1bfb0 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74   from ORDER BY t
1bfc0 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73  erms to result s
1bfd0 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20  et columns */.. 
1bfe0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
1bff0 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73  erBy!=0 );.  ass
1c000 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20  ert( pKeyDup==0 
1c010 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20  ); /* "Managed" 
1c020 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e  code needs this.
1c030 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20    Ticket #3382. 
1c040 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
1c050 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72  ->db;.  v = pPar
1c060 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
1c070 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
1c080 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68     /* Already th
1c090 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69  rown the error i
1c0a0 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69  f VDBE alloc fai
1c0b0 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e  led */.  labelEn
1c0c0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
1c0d0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c  akeLabel(v);.  l
1c0e0 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74  abelCmpr = sqlit
1c0f0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1c100 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68  v);...  /* Patch
1c110 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59   up the ORDER BY
1c120 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f   clause.  */.  o
1c130 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70  p = p->op;  .  p
1c140 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
1c150 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  r;.  assert( pPr
1c160 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ior->pOrderBy==0
1c170 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d   );.  pOrderBy =
1c180 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
1c190 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
1c1a0 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   );.  nOrderBy =
1c1b0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
1c1c0 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72  ;..  /* For oper
1c1d0 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e  ators other than
1c1e0 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61   UNION ALL we ha
1c1f0 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ve to make sure 
1c200 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52  that.  ** the OR
1c210 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
1c220 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20  vers every term 
1c230 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
1c240 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72  t.  Add.  ** ter
1c250 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  ms to the ORDER 
1c260 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63  BY clause as nec
1c270 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69  essary..  */.  i
1c280 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op!=TK_ALL ){
1c290 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62  .    for(i=1; db
1c2a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
1c2b0 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73  0 && i<=p->pELis
1c2c0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1c2d0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
1c2e0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1c2f0 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  m;.      for(j=0
1c300 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
1c310 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b  ->a; j<nOrderBy;
1c320 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
1c330 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1c340 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
1c350 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  rByCol>0 );.    
1c360 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75      if( pItem->u
1c370 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  .x.iOrderByCol==
1c380 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  i ) break;.     
1c390 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
1c3a0 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
1c3b0 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
1c3c0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
1c3d0 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b   TK_INTEGER, 0);
1c3e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
1c3f0 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
1c400 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
1c410 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
1c420 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
1c430 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  lue;.        pNe
1c440 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b  w->u.iValue = i;
1c450 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  .        p->pOrd
1c460 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 20  erBy = pOrderBy 
1c470 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1c480 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
1c490 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b  pOrderBy, pNew);
1c4a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
1c4b0 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79  derBy ) pOrderBy
1c4c0 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e  ->a[nOrderBy++].
1c4d0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
1c4e0 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20  = (u16)i;.      
1c4f0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1c500 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
1c510 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61  mparison permuta
1c520 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f  tion and keyinfo
1c530 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69   that is used wi
1c540 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d  th.  ** the perm
1c550 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  utation used to 
1c560 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
1c570 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f   next.  ** row o
1c580 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20  f results comes 
1c590 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20  from selectA or 
1c5a0 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61  selectB.  Also a
1c5b0 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a  dd explicit.  **
1c5c0 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74   collations to t
1c5d0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1c5e0 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74  se terms so that
1c5f0 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65   when the subque
1c600 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  ries.  ** to the
1c610 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c   right and the l
1c620 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65  eft are evaluate
1c630 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20  d, they use the 
1c640 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c  correct.  ** col
1c650 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61  lation..  */.  a
1c660 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65  Permute = sqlite
1c670 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
1c680 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28  b, sizeof(int)*(
1c690 6e 4f 72 64 65 72 42 79 20 2b 20 31 29 29 3b 0a  nOrderBy + 1));.
1c6a0 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29    if( aPermute )
1c6b0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
1c6c0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1c6d0 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65 5b  m;.    aPermute[
1c6e0 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20  0] = nOrderBy;. 
1c6f0 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 74 65     for(i=1, pIte
1c700 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69  m=pOrderBy->a; i
1c710 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c  <=nOrderBy; i++,
1c720 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1c730 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1c740 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
1c750 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1c760 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t( pItem->u.x.iO
1c770 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45  rderByCol<=p->pE
1c780 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
1c790 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d       aPermute[i]
1c7a0 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f   = pItem->u.x.iO
1c7b0 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20  rderByCol - 1;. 
1c7c0 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72     }.    pKeyMer
1c7d0 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ge = multiSelect
1c7e0 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70  OrderByKeyInfo(p
1c7f0 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20  Parse, p, 1);.  
1c800 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d  }else{.    pKeyM
1c810 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erge = 0;.  }.. 
1c820 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65   /* Reattach the
1c830 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1c840 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20   to the query.. 
1c850 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
1c860 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
1c870 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
1c880 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
1c890 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  stDup(pParse->db
1c8a0 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a  , pOrderBy, 0);.
1c8b0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
1c8c0 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72   range of tempor
1c8d0 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e  ary registers an
1c8e0 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65  d the KeyInfo ne
1c8f0 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68  eded.  ** for th
1c900 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d  e logic that rem
1c910 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72  oves duplicate r
1c920 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20  esult rows when 
1c930 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  the.  ** operato
1c940 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45  r is UNION, EXCE
1c950 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
1c960 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20   (but not UNION 
1c970 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALL)..  */.  if(
1c980 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
1c990 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a     regPrev = 0;.
1c9a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1c9b0 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   nExpr = p->pELi
1c9c0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
1c9d0 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
1c9e0 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  =nExpr || db->ma
1c9f0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1ca00 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
1ca10 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
1ca20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
1ca30 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c  nExpr+1;.    sql
1ca40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ca50 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
1ca60 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70   regPrev);.    p
1ca70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33  KeyDup = sqlite3
1ca80 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
1ca90 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20   nExpr, 1);.    
1caa0 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20  if( pKeyDup ){. 
1cab0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
1cac0 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
1cad0 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29 20  teable(pKeyDup) 
1cae0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
1caf0 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ; i<nExpr; i++){
1cb00 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
1cb10 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c  ->aColl[i] = mul
1cb20 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
1cb30 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
1cb40 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
1cb50 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
1cb60 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1cb70 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61  .  }. .  /* Sepa
1cb80 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e  rate the left an
1cb90 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72  d the right quer
1cba0 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68  y from one anoth
1cbb0 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  er.  */.  p->pPr
1cbc0 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f  ior = 0;.  pPrio
1cbd0 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
1cbe0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
1cbf0 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
1cc00 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
1cc10 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69  y, "ORDER");.  i
1cc20 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f  f( pPrior->pPrio
1cc30 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
1cc40 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
1cc50 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
1cc60 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70  Prior, pPrior->p
1cc70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
1cc80 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
1cc90 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72  pute the limit r
1cca0 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f  egisters */.  co
1ccb0 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
1ccc0 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c  ers(pParse, p, l
1ccd0 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20  abelEnd);.  if( 
1cce0 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d  p->iLimit && op=
1ccf0 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
1cd00 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61  egLimitA = ++pPa
1cd10 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
1cd20 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61  egLimitB = ++pPa
1cd30 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
1cd40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1cd50 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e  (v, OP_Copy, p->
1cd60 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66  iOffset ? p->iOf
1cd70 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d  fset+1 : p->iLim
1cd80 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  it,.            
1cd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cda0 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29        regLimitA)
1cdb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1cdc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
1cdd0 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72  py, regLimitA, r
1cde0 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c  egLimitB);.  }el
1cdf0 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  se{.    regLimit
1ce00 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20  A = regLimitB = 
1ce10 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
1ce20 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1ce30 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e  ->pLimit);.  p->
1ce40 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 72  pLimit = 0;..  r
1ce50 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72  egAddrA = ++pPar
1ce60 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41  se->nMem;.  regA
1ce70 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrB = ++pParse-
1ce80 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41  >nMem;.  regOutA
1ce90 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1cea0 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b  m;.  regOutB = +
1ceb0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1cec0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1ced0 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53  stInit(&destA, S
1cee0 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
1cef0 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74  gAddrA);.  sqlit
1cf00 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
1cf10 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72  (&destB, SRT_Cor
1cf20 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
1cf30 29 3b 0a 0a 20 20 45 78 70 6c 61 69 6e 51 75 65  );..  ExplainQue
1cf40 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
1cf50 31 2c 20 22 4d 45 52 47 45 20 28 25 73 29 22 2c  1, "MERGE (%s)",
1cf60 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
1cf70 3e 6f 70 29 29 29 3b 0a 0a 20 20 2f 2a 20 47 65  >op)));..  /* Ge
1cf80 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
1cf90 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
1cfa0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1cfb0 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ent to the.  ** 
1cfc0 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70  left of the comp
1cfd0 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20  ound operator - 
1cfe0 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a  the "A" select..
1cff0 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63    */.  addrSelec
1d000 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tA = sqlite3Vdbe
1d010 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
1d020 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71   1;.  addr1 = sq
1d030 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1d040 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
1d050 69 6e 65 2c 20 72 65 67 41 64 64 72 41 2c 20 30  ine, regAddrA, 0
1d060 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a  , addrSelectA);.
1d070 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1d080 2c 20 22 6c 65 66 74 20 53 45 4c 45 43 54 22 29  , "left SELECT")
1d090 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69  );.  pPrior->iLi
1d0a0 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b  mit = regLimitA;
1d0b0 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50  .  ExplainQueryP
1d0c0 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
1d0d0 22 4c 45 46 54 22 29 29 3b 0a 20 20 73 71 6c 69  "LEFT"));.  sqli
1d0e0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
1d0f0 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41  , pPrior, &destA
1d100 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1d110 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20  EndCoroutine(v, 
1d120 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
1d130 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1d140 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 2f  (v, addr1);..  /
1d150 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
1d160 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
1d170 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
1d180 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a  atement on .  **
1d190 20 74 68 65 20 72 69 67 68 74 20 2d 20 74 68 65   the right - the
1d1a0 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f   "B" select.  */
1d1b0 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d  .  addrSelectB =
1d1c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1d1d0 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a  entAddr(v) + 1;.
1d1e0 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
1d1f0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1d200 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
1d210 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20 61 64   regAddrB, 0, ad
1d220 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 56 64  drSelectB);.  Vd
1d230 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
1d240 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  ight SELECT"));.
1d250 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70    savedLimit = p
1d260 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65  ->iLimit;.  save
1d270 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  dOffset = p->iOf
1d280 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  fset;.  p->iLimi
1d290 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20  t = regLimitB;. 
1d2a0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
1d2b0 20 20 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72    .  ExplainQuer
1d2c0 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
1d2d0 2c 20 22 52 49 47 48 54 22 29 29 3b 0a 20 20 73  , "RIGHT"));.  s
1d2e0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1d2f0 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b  rse, p, &destB);
1d300 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73  .  p->iLimit = s
1d310 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e  avedLimit;.  p->
1d320 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f  iOffset = savedO
1d330 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33  ffset;.  sqlite3
1d340 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
1d350 28 76 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a  (v, regAddrB);..
1d360 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1d370 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
1d380 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
1d390 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41  ent row of the A
1d3a0 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
1d3b0 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
1d3c0 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
1d3d0 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
1d3e0 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1d3f0 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
1d400 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b  outine for A"));
1d410 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65  .  addrOutA = ge
1d420 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
1d430 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
1d440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d450 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74  p, &destA, pDest
1d460 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20  , regOutA,.     
1d470 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
1d480 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61  rev, pKeyDup, la
1d490 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a  belEnd);.  .  /*
1d4a0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1d4b0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
1d4c0 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  uts the current 
1d4d0 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a  row of the B.  *
1d4e0 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20  * select as the 
1d4f0 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20  next output row 
1d500 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
1d510 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69  select..  */.  i
1d520 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  f( op==TK_ALL ||
1d530 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b   op==TK_UNION ){
1d540 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1d550 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
1d560 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29   routine for B")
1d570 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20  );.    addrOutB 
1d580 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
1d590 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
1d5a0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1d5b0 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70      p, &destB, p
1d5c0 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20  Dest, regOutB,. 
1d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5e0 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
1d5f0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d  , labelEnd);.  }
1d600 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  .  sqlite3KeyInf
1d610 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b  oUnref(pKeyDup);
1d620 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1d630 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
1d640 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
1d650 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
1d660 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   A.  ** are exha
1d670 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
1d680 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20  ata in select B 
1d690 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
1d6a0 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50  if( op==TK_EXCEP
1d6b0 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45  T || op==TK_INTE
1d6c0 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
1d6d0 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72  rEofA_noB = addr
1d6e0 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b  EofA = labelEnd;
1d6f0 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20  .  }else{  .    
1d700 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1d710 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f  (v, "eof-A subro
1d720 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
1d730 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33  drEofA = sqlite3
1d740 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d750 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c  _Gosub, regOutB,
1d760 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20   addrOutB);.    
1d770 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73  addrEofA_noB = s
1d780 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d790 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1d7a0 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64  gAddrB, labelEnd
1d7b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7d0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1d7e0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1d7f0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1d800 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70  addrEofA);.    p
1d810 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
1d820 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
1d830 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70  p->nSelectRow, p
1d840 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
1d850 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  w);.  }..  /* Ge
1d860 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1d870 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
1d880 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
1d890 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61   select B.  ** a
1d8a0 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
1d8b0 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
1d8c0 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a  lect A remains..
1d8d0 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
1d8e0 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
1d8f0 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64     addrEofB = ad
1d900 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20  drEofA;.    if( 
1d910 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20  p->nSelectRow > 
1d920 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
1d930 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow ) p->nSelectR
1d940 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
1d950 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65  lectRow;.  }else
1d960 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  {  .    VdbeNoop
1d970 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
1d980 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1d990 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  ;.    addrEofB =
1d9a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d9b0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1d9c0 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
1d9d0 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
1d9e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d9f0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1da00 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62 65   labelEnd); Vdbe
1da10 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1da20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1da30 28 76 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20  (v, addrEofB);. 
1da40 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1da50 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
1da60 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42   the case of A<B
1da70 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1da80 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c  Comment((v, "A-l
1da90 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
1daa0 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20  );.  addrAltB = 
1dab0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1dac0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1dad0 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
1dae0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1daf0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1db00 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ld, regAddrA, ad
1db10 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76  drEofA); VdbeCov
1db20 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1db30 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1db40 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
1db50 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1db60 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
1db70 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20  e of A==B.  */. 
1db80 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1db90 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
1dba0 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65  = addrAltB;.  }e
1dbb0 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  lse if( op==TK_I
1dbc0 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
1dbd0 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
1dbe0 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74  ltB;.    addrAlt
1dbf0 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  B++;.  }else{.  
1dc00 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1dc10 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75  t((v, "A-eq-B su
1dc20 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
1dc30 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20   addrAeqB =.    
1dc40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1dc50 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1dc60 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
1dc70 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  A); VdbeCoverage
1dc80 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1dc90 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65  VdbeGoto(v, labe
1dca0 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lCmpr);.  }..  /
1dcb0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1dcc0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1dcd0 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20  se of A>B.  */. 
1dce0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1dcf0 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62  ((v, "A-gt-B sub
1dd00 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
1dd10 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33  drAgtB = sqlite3
1dd20 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1dd30 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  v);.  if( op==TK
1dd40 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
1dd50 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  NION ){.    sqli
1dd60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1dd70 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1dd80 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
1dd90 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1dda0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1ddb0 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ld, regAddrB, ad
1ddc0 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76  drEofB); VdbeCov
1ddd0 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1dde0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1ddf0 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
1de00 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20   This code runs 
1de10 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  once to initiali
1de20 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20  ze everything.. 
1de30 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1de40 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
1de50 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
1de60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1de70 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1de80 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56  addrEofA_noB); V
1de90 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1dea0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1deb0 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1dec0 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45   regAddrB, addrE
1ded0 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofB); VdbeCovera
1dee0 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70  ge(v);..  /* Imp
1def0 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20  lement the main 
1df00 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  merge loop.  */.
1df10 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1df20 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
1df30 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74  elCmpr);.  sqlit
1df40 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1df50 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20  OP_Permutation, 
1df60 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29  0, 0, 0, (char*)
1df70 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54  aPermute, P4_INT
1df80 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65  ARRAY);.  sqlite
1df90 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1dfa0 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41  P_Compare, destA
1dfb0 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53  .iSdst, destB.iS
1dfc0 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20  dst, nOrderBy,. 
1dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfe0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1dff0 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59  KeyMerge, P4_KEY
1e000 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
1e010 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
1e020 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b  OPFLAG_PERMUTE);
1e030 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1e040 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
1e050 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41   addrAltB, addrA
1e060 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 20  eqB, addrAgtB); 
1e070 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1e080 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
1e090 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  he this point in
1e0a0 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e   order to termin
1e0b0 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20  ate the query.. 
1e0c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1e0d0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1e0e0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f   labelEnd);..  /
1e0f0 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65  * Reassembly the
1e100 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
1e110 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
1e120 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74  be freed correct
1e130 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63  ly.  ** by the c
1e140 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
1e150 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
1e160 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
1e170 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
1e180 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
1e190 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  }.  p->pPrior = 
1e1a0 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72  pPrior;.  pPrior
1e1b0 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20  ->pNext = p;..  
1e1c0 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72  /*** TBD:  Inser
1e1d0 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c  t subroutine cal
1e1e0 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73  ls to close curs
1e1f0 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74  ors on incomplet
1e200 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72  e.  **** subquer
1e210 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 45 78 70 6c  ies ****/.  Expl
1e220 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28  ainQueryPlanPop(
1e230 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74 75 72  pParse);.  retur
1e240 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 21 3d  n pParse->nErr!=
1e250 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0;.}.#endif..#if
1e260 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1e270 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1e280 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1e290 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 0a 2f  TE_OMIT_VIEW)../
1e2a0 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
1e2b0 20 74 68 65 20 53 75 62 73 74 43 6f 6e 74 65 78   the SubstContex
1e2c0 74 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62  t object describ
1e2d0 65 73 20 61 6e 20 73 75 62 73 74 69 74 75 74 69  es an substituti
1e2e0 6f 6e 20 65 64 69 74 0a 2a 2a 20 74 6f 20 62 65  on edit.** to be
1e2f0 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 61 20   performed on a 
1e300 70 61 72 73 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a  parse tree..**.*
1e310 2a 20 41 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  * All references
1e320 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   to columns in t
1e330 61 62 6c 65 20 69 54 61 62 6c 65 20 61 72 65 20  able iTable are 
1e340 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 62  to be replaced b
1e350 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  y corresponding.
1e360 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  ** expressions i
1e370 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f 0a 74 79 70  n pEList..*/.typ
1e380 65 64 65 66 20 73 74 72 75 63 74 20 53 75 62 73  edef struct Subs
1e390 74 43 6f 6e 74 65 78 74 20 7b 0a 20 20 50 61 72  tContext {.  Par
1e3a0 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
1e3b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1e3c0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1e3d0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 3b 20 20  .  int iTable;  
1e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e3f0 52 65 70 6c 61 63 65 20 72 65 66 65 72 65 6e 63  Replace referenc
1e400 65 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  es to this table
1e410 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 54 61   */.  int iNewTa
1e420 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
1e430 2f 2a 20 4e 65 77 20 74 61 62 6c 65 20 6e 75 6d  /* New table num
1e440 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c  ber */.  int isL
1e450 65 66 74 4a 6f 69 6e 3b 20 20 20 20 20 20 20 20  eftJoin;        
1e460 20 20 20 2f 2a 20 41 64 64 20 54 4b 5f 49 46 5f     /* Add TK_IF_
1e470 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63 6f 64 65 73  NULL_ROW opcodes
1e480 20 6f 6e 20 65 61 63 68 20 72 65 70 6c 61 63 65   on each replace
1e490 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ment */.  ExprLi
1e4a0 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
1e4b0 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d 65      /* Replaceme
1e4c0 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a  nt expressions *
1e4d0 2f 0a 7d 20 53 75 62 73 74 43 6f 6e 74 65 78 74  /.} SubstContext
1e4e0 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  ;../* Forward De
1e4f0 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74  clarations */.st
1e500 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
1e510 78 70 72 4c 69 73 74 28 53 75 62 73 74 43 6f 6e  xprList(SubstCon
1e520 74 65 78 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a  text*, ExprList*
1e530 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  );.static void s
1e540 75 62 73 74 53 65 6c 65 63 74 28 53 75 62 73 74  ubstSelect(Subst
1e550 43 6f 6e 74 65 78 74 2a 2c 20 53 65 6c 65 63 74  Context*, Select
1e560 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
1e570 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  Scan through the
1e580 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
1e590 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72  r.  Replace ever
1e5a0 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a  y reference to.*
1e5b0 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  * a column in ta
1e5c0 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c  ble number iTabl
1e5d0 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  e with a copy of
1e5e0 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a   the iColumn-th.
1e5f0 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69  ** entry in pELi
1e600 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20  st.  (But leave 
1e610 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
1e620 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a  e ROWID column .
1e630 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a  ** unchanged.).*
1e640 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1e650 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
1e660 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63   flattening proc
1e670 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65  edure.  A subque
1e680 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75  ry.** whose resu
1e690 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65  lt set is define
1e6a0 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65  d by pEList appe
1e6b0 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20  ars as entry in 
1e6c0 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
1e6d0 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
1e6e0 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42  uch that the VDB
1e6f0 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65  E cursor assigne
1e700 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52  d to that.** FOR
1e710 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69  M clause entry i
1e720 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20  s iTable.  This 
1e730 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68  routine makes th
1e740 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20  e necessary .** 
1e750 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72  changes to pExpr
1e760 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65   so that it refe
1e770 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  rs directly to t
1e780 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a  he source table.
1e790 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
1e7a0 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65  ry rather the re
1e7b0 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
1e7c0 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
1e7d0 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45  tic Expr *substE
1e7e0 78 70 72 28 0a 20 20 53 75 62 73 74 43 6f 6e 74  xpr(.  SubstCont
1e7f0 65 78 74 20 2a 70 53 75 62 73 74 2c 20 20 2f 2a  ext *pSubst,  /*
1e800 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1e810 74 68 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  the substitution
1e820 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
1e830 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
1e840 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75  Expr in which su
1e850 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72  bstitution occur
1e860 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45  s */.){.  if( pE
1e870 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  xpr==0 ) return 
1e880 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  0;.  if( ExprHas
1e890 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1e8a0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
1e8b0 26 26 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74  && pExpr->iRight
1e8c0 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53 75 62 73  JoinTable==pSubs
1e8d0 74 2d 3e 69 54 61 62 6c 65 0a 20 20 29 7b 0a 20  t->iTable.  ){. 
1e8e0 20 20 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74     pExpr->iRight
1e8f0 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 53 75 62  JoinTable = pSub
1e900 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20  st->iNewTable;. 
1e910 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e   }.  if( pExpr->
1e920 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
1e930 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
1e940 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20 29  pSubst->iTable )
1e950 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
1e960 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
1e970 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
1e980 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TK_NULL;.    }el
1e990 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
1e9a0 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72  pNew;.      Expr
1e9b0 20 2a 70 43 6f 70 79 20 3d 20 70 53 75 62 73 74   *pCopy = pSubst
1e9c0 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  ->pEList->a[pExp
1e9d0 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
1e9e0 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 69 66  r;.      Expr if
1e9f0 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 61  NullRow;.      a
1ea00 73 73 65 72 74 28 20 70 53 75 62 73 74 2d 3e 70  ssert( pSubst->p
1ea10 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70  EList!=0 && pExp
1ea20 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53 75 62 73  r->iColumn<pSubs
1ea30 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
1ea40 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1ea50 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
1ea60 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
1ea70 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ht==0 );.      i
1ea80 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
1ea90 56 65 63 74 6f 72 28 70 43 6f 70 79 29 20 29 7b  Vector(pCopy) ){
1eaa0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1eab0 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70  VectorErrorMsg(p
1eac0 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2c 20 70  Subst->pParse, p
1ead0 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Copy);.      }el
1eae0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1eaf0 74 65 33 20 2a 64 62 20 3d 20 70 53 75 62 73 74  te3 *db = pSubst
1eb00 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
1eb10 20 20 20 20 20 20 69 66 28 20 70 53 75 62 73 74        if( pSubst
1eb20 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 26 26 20  ->isLeftJoin && 
1eb30 70 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pCopy->op!=TK_CO
1eb40 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
1eb50 20 20 6d 65 6d 73 65 74 28 26 69 66 4e 75 6c 6c    memset(&ifNull
1eb60 52 6f 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  Row, 0, sizeof(i
1eb70 66 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20 20 20 20  fNullRow));.    
1eb80 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e        ifNullRow.
1eb90 6f 70 20 3d 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  op = TK_IF_NULL_
1eba0 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ROW;.          i
1ebb0 66 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66 74 20 3d  fNullRow.pLeft =
1ebc0 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20   pCopy;.        
1ebd0 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 69 54 61 62    ifNullRow.iTab
1ebe0 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65  le = pSubst->iNe
1ebf0 77 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  wTable;.        
1ec00 20 20 70 43 6f 70 79 20 3d 20 26 69 66 4e 75 6c    pCopy = &ifNul
1ec10 6c 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lRow;.        }.
1ec20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
1ec30 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
1ec40 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20 20  , pCopy, 0);.   
1ec50 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26       if( pNew &&
1ec60 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a   pSubst->isLeftJ
1ec70 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oin ){.         
1ec80 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
1ec90 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e 42 65 4e  (pNew, EP_CanBeN
1eca0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ull);.        }.
1ecb0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1ecc0 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
1ecd0 72 74 79 28 70 45 78 70 72 2c 45 50 5f 46 72 6f  rty(pExpr,EP_Fro
1ece0 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
1ecf0 20 20 20 20 70 4e 65 77 2d 3e 69 52 69 67 68 74      pNew->iRight
1ed00 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 45 78 70  JoinTable = pExp
1ed10 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
1ed20 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  le;.          Ex
1ed30 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e  prSetProperty(pN
1ed40 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  ew, EP_FromJoin)
1ed50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ed60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1ed70 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
1ed80 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20  ;.        pExpr 
1ed90 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a  = pNew;.      }.
1eda0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1edb0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
1edc0 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  ==TK_IF_NULL_ROW
1edd0 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
1ede0 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c  e==pSubst->iTabl
1edf0 65 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  e ){.      pExpr
1ee00 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73  ->iTable = pSubs
1ee10 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20  t->iNewTable;.  
1ee20 20 20 7d 0a 20 20 20 20 70 45 78 70 72 2d 3e 70    }.    pExpr->p
1ee30 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72  Left = substExpr
1ee40 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e  (pSubst, pExpr->
1ee50 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 45 78 70  pLeft);.    pExp
1ee60 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73  r->pRight = subs
1ee70 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 45  tExpr(pSubst, pE
1ee80 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
1ee90 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1eea0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1eeb0 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
1eec0 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
1eed0 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78  pSubst, pExpr->x
1eee0 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20  .pSelect, 1);.  
1eef0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1ef00 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1ef10 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  bst, pExpr->x.pL
1ef20 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
1ef30 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a    return pExpr;.
1ef40 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1ef50 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 53  bstExprList(.  S
1ef60 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75  ubstContext *pSu
1ef70 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74  bst, /* Descript
1ef80 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
1ef90 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  itution */.  Exp
1efa0 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20  rList *pList    
1efb0 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63     /* List to sc
1efc0 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20  an and in which 
1efd0 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
1efe0 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tes */.){.  int 
1eff0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1f000 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
1f010 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1f020 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1f030 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
1f040 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  pr = substExpr(p
1f050 53 75 62 73 74 2c 20 70 4c 69 73 74 2d 3e 61 5b  Subst, pList->a[
1f060 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 7d  i].pExpr);.  }.}
1f070 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1f080 73 74 53 65 6c 65 63 74 28 0a 20 20 53 75 62 73  stSelect(.  Subs
1f090 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74  tContext *pSubst
1f0a0 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e  , /* Description
1f0b0 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75   of the substitu
1f0c0 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
1f0d0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1f0e0 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
1f0f0 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ent in which to 
1f100 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f  make substitutio
1f110 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50 72  ns */.  int doPr
1f120 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ior           /*
1f130 20 44 6f 20 73 75 62 73 74 69 74 75 74 65 73 20   Do substitutes 
1f140 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f 6f  on p->pPrior too
1f150 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
1f160 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74   *pSrc;.  struct
1f170 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1f180 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
1f190 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
1f1a0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62 73  ;.  do{.    subs
1f1b0 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74  tExprList(pSubst
1f1c0 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
1f1d0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1f1e0 70 53 75 62 73 74 2c 20 70 2d 3e 70 47 72 6f 75  pSubst, p->pGrou
1f1f0 70 42 79 29 3b 0a 20 20 20 20 73 75 62 73 74 45  pBy);.    substE
1f200 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1f210 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
1f220 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73    p->pHaving = s
1f230 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1f240 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
1f250 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75    p->pWhere = su
1f260 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20  bstExpr(pSubst, 
1f270 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
1f280 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
1f290 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
1f2a0 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  !=0 );.    for(i
1f2b0 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74  =pSrc->nSrc, pIt
1f2c0 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b  em=pSrc->a; i>0;
1f2d0 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
1f2e0 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
1f2f0 74 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d 2d  t(pSubst, pItem-
1f300 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20  >pSelect, 1);.  
1f310 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
1f320 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20  g.isTabFunc ){. 
1f330 20 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72         substExpr
1f340 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 49 74  List(pSubst, pIt
1f350 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29  em->u1.pFuncArg)
1f360 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f370 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69 6f    }while( doPrio
1f380 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50 72  r && (p = p->pPr
1f390 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e  ior)!=0 );.}.#en
1f3a0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
1f3b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1f3c0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1f3d0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1f3e0 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  EW) */..#if !def
1f3f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1f400 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1f410 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1f420 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54  IT_VIEW)./*.** T
1f430 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
1f440 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
1f450 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20  subqueries as a 
1f460 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69  performance opti
1f470 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  mization..** Thi
1f480 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1f490 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
1f4a0 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
1f4b0 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f   no flattening o
1f4c0 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
1f4d0 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
1f4e0 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
1f4f0 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
1f500 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1f510 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
1f520 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
1f530 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
1f540 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
1f550 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
1f560 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
1f570 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
1f580 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
1f590 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
1f5a0 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
1f5b0 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
1f5c0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
1f5d0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
1f5e0 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
1f5f0 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
1f600 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
1f610 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
1f620 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
1f630 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
1f640 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
1f650 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
1f660 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
1f670 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
1f680 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
1f690 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1f6a0 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
1f6b0 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
1f6c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1f6d0 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
1f6e0 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
1f6f0 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
1f700 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
1f710 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
1f720 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
1f730 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
1f740 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
1f750 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
1f760 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
1f770 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
1f780 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  lification gives
1f790 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
1f7a0 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
1f7b0 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
1f7c0 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
1f7d0 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
1f7e0 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
1f7f0 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
1f800 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
1f810 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
1f820 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
1f830 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
1f840 69 73 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  is subject to th
1f850 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73  e following cons
1f860 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  traints:.**.**  
1f870 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67  (**)  We no long
1f880 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c  er attempt to fl
1f890 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20  atten aggregate 
1f8a0 73 75 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a  subqueries. Was:
1f8b0 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 73  .**        The s
1f8c0 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
1f8d0 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e  outer query cann
1f8e0 6f 74 20 62 6f 74 68 20 62 65 20 61 67 67 72 65  ot both be aggre
1f8f0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  gates..**.**  (*
1f900 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72  *)  We no longer
1f910 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74   attempt to flat
1f920 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75  ten aggregate su
1f930 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a 0a 2a  bqueries. Was:.*
1f940 2a 20 20 20 20 20 20 20 20 28 32 29 20 49 66 20  *        (2) If 
1f950 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1f960 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 65  an aggregate the
1f970 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 61 29  n.**        (2a)
1f980 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f990 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20 6a   must not be a j
1f9a0 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  oin and.**      
1f9b0 20 20 28 32 62 29 20 74 68 65 20 6f 75 74 65 72    (2b) the outer
1f9c0 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74 20   query must not 
1f9d0 75 73 65 20 73 75 62 71 75 65 72 69 65 73 0a 2a  use subqueries.*
1f9e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74  *             ot
1f9f0 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  her than the one
1fa00 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
1fa10 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61 20  query that is a 
1fa20 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20 20 20 20  candidate.**    
1fa30 20 20 20 20 20 20 20 20 20 66 6f 72 20 66 6c 61           for fla
1fa40 74 74 65 6e 69 6e 67 2e 20 20 28 54 68 69 73 20  ttening.  (This 
1fa50 69 73 20 64 75 65 20 74 6f 20 74 69 63 6b 65 74  is due to ticket
1fa60 20 5b 32 66 37 31 37 30 64 37 33 62 66 39 61 62   [2f7170d73bf9ab
1fa70 66 38 30 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20  f80].**         
1fa80 20 20 20 20 66 72 6f 6d 20 32 30 31 35 2d 30 32      from 2015-02
1fa90 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33  -09.).**.**   (3
1faa0 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  )  If the subque
1fab0 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1fac0 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46  operand of a LEF
1fad0 54 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a 2a 20 20  T JOIN then.**  
1fae0 20 20 20 20 20 20 28 33 61 29 20 74 68 65 20 73        (3a) the s
1faf0 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
1fb00 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a  be a join and.**
1fb10 20 20 20 20 20 20 20 20 28 33 62 29 20 74 68 65          (3b) the
1fb20 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1fb30 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  the subquery may
1fb40 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 76   not contain a v
1fb50 69 72 74 75 61 6c 0a 2a 2a 20 20 20 20 20 20 20  irtual.**       
1fb60 20 20 20 20 20 20 74 61 62 6c 65 20 61 6e 64 0a        table and.
1fb70 2a 2a 20 20 20 20 20 20 20 20 28 33 63 29 20 74  **        (3c) t
1fb80 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1fb90 61 79 20 6e 6f 74 20 62 65 20 61 6e 20 61 67 67  ay not be an agg
1fba0 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  regate..**.**   
1fbb0 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
1fbc0 79 20 63 61 6e 20 6e 6f 74 20 62 65 20 44 49 53  y can not be DIS
1fbd0 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  TINCT..**.**  (*
1fbe0 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74  *)  At one point
1fbf0 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34   restrictions (4
1fc00 29 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65  ) and (5) define
1fc10 64 20 61 20 73 75 62 73 65 74 20 6f 66 20 44 49  d a subset of DI
1fc20 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20  STINCT.**       
1fc30 20 73 75 62 2d 71 75 65 72 69 65 73 20 74 68 61   sub-queries tha
1fc40 74 20 77 65 72 65 20 65 78 63 6c 75 64 65 64 20  t were excluded 
1fc50 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69  from this optimi
1fc60 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74  zation. Restrict
1fc70 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28  ion .**        (
1fc80 34 29 20 68 61 73 20 73 69 6e 63 65 20 62 65 65  4) has since bee
1fc90 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78  n expanded to ex
1fca0 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e  clude all DISTIN
1fcb0 43 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  CT subqueries..*
1fcc0 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e  *.**  (**)  We n
1fcd0 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74  o longer attempt
1fce0 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72   to flatten aggr
1fcf0 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73  egate subqueries
1fd00 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20  .  Was:.**      
1fd10 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1fd20 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20  y is aggregate, 
1fd30 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1fd40 6d 61 79 20 6e 6f 74 20 62 65 20 44 49 53 54 49  may not be DISTI
1fd50 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29  NCT..**.**   (7)
1fd60 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 6d    The subquery m
1fd70 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d 20  ust have a FROM 
1fd80 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20  clause.  TODO:  
1fd90 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77  For subqueries w
1fda0 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20  ithout.**       
1fdb0 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20   A FROM clause, 
1fdc0 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20  consider adding 
1fdd0 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 69  a FROM clause wi
1fde0 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a  th the special.*
1fdf0 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73  *        table s
1fe00 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20  qlite_once that 
1fe10 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69  consists of a si
1fe20 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e  ngle row contain
1fe30 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
1fe40 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a  single NULL..**.
1fe50 2a 2a 20 20 20 28 38 29 20 20 49 66 20 74 68 65  **   (8)  If the
1fe60 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c   subquery uses L
1fe70 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75  IMIT then the ou
1fe80 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1fe90 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a  t be a join..**.
1fea0 2a 2a 20 20 20 28 39 29 20 20 49 66 20 74 68 65  **   (9)  If the
1feb0 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c   subquery uses L
1fec0 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75  IMIT then the ou
1fed0 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1fee0 74 20 62 65 20 61 67 67 72 65 67 61 74 65 2e 0a  t be aggregate..
1fef0 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73  **.**  (**)  Res
1ff00 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77 61  triction (10) wa
1ff10 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
1ff20 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d  he code on 2005-
1ff30 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a 20  02-05 but we.** 
1ff40 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74 6c         accidentl
1ff50 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63 6f  y carried the co
1ff60 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75 6e  mment forward un
1ff70 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e 20  til 2014-09-15. 
1ff80 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   Original.**    
1ff90 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 3a 20      constraint: 
1ffa0 22 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79  "If the subquery
1ffb0 20 69 73 20 61 67 67 72 65 67 61 74 65 20 74 68   is aggregate th
1ffc0 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  en the outer que
1ffd0 72 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 6d 61  ry .**        ma
1ffe0 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e  y not use LIMIT.
1fff0 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54  ".**.**  (11)  T
20000 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
20010 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
20020 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20 68 61 76  may not both hav
20030 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
20040 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  es..**.**  (**) 
20050 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64   Not implemented
20060 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f  .  Subsumed into
20070 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29   restriction (3)
20080 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c  .  Was previousl
20090 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65  y.**        a se
200a0 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69  parate restricti
200b0 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d  on deriving from
200c0 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a   ticket #350..**
200d0 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73  .**  (13)  The s
200e0 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65  ubquery and oute
200f0 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
20100 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a  both use LIMIT..
20110 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65  **.**  (14)  The
20120 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
20130 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a  t use OFFSET..**
20140 0a 2a 2a 20 20 28 31 35 29 20 20 49 66 20 74 68  .**  (15)  If th
20150 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
20160 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
20170 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
20180 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
20190 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
201a0 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 20 20 20  use LIMIT..**   
201b0 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74       (See ticket
201c0 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65   #2339 and ticke
201d0 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e  t [02a8e81d44]).
201e0 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 49 66  .**.**  (16)  If
201f0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20200 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20 74   is aggregate, t
20210 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 79  hen the subquery
20220 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20 20   may not.**     
20230 20 20 20 75 73 65 20 4f 52 44 45 52 20 42 59 2e     use ORDER BY.
20240 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29    (Ticket #2942)
20250 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e    This used to n
20260 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20  ot matter.**    
20270 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74      until we int
20280 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75  roduced the grou
20290 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74  p_concat() funct
202a0 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31  ion.  .**.**  (1
202b0 37 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75  7)  If the subqu
202c0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
202d0 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 0a 2a  d select, then.*
202e0 2a 20 20 20 20 20 20 20 20 28 31 37 61 29 20 61  *        (17a) a
202f0 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72  ll compound oper
20300 61 74 6f 72 73 20 6d 75 73 74 20 62 65 20 61 20  ators must be a 
20310 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e 64 0a 2a  UNION ALL, and.*
20320 2a 20 20 20 20 20 20 20 20 28 31 37 62 29 20 6e  *        (17b) n
20330 6f 20 74 65 72 6d 73 20 77 69 74 68 69 6e 20 74  o terms within t
20340 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d 70  he subquery comp
20350 6f 75 6e 64 20 6d 61 79 20 62 65 20 61 67 67 72  ound may be aggr
20360 65 67 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20  egate.**        
20370 20 20 20 20 20 20 6f 72 20 44 49 53 54 49 4e 43        or DISTINC
20380 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  T, and.**       
20390 20 28 31 37 63 29 20 65 76 65 72 79 20 74 65 72   (17c) every ter
203a0 6d 20 77 69 74 68 69 6e 20 74 68 65 20 73 75 62  m within the sub
203b0 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20 6d  query compound m
203c0 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d 20  ust have a FROM 
203d0 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  clause.**       
203e0 20 28 31 37 64 29 20 74 68 65 20 6f 75 74 65 72   (17d) the outer
203f0 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
20400 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
20410 20 20 28 31 37 64 31 29 20 61 67 67 72 65 67 61    (17d1) aggrega
20420 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  te, or.**       
20430 20 20 20 20 20 20 20 28 31 37 64 32 29 20 44 49         (17d2) DI
20440 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a 20 20 20  STINCT, or.**   
20450 20 20 20 20 20 20 20 20 20 20 20 28 31 37 64 33             (17d3
20460 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ) a join..**.** 
20470 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e         The paren
20480 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20  t and sub-query 
20490 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  may contain WHER
204a0 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65  E clauses. Subje
204b0 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ct to.**        
204c0 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29  rules (11), (13)
204d0 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20   and (14), they 
204e0 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
204f0 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20   ORDER BY,.**   
20500 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f       LIMIT and O
20510 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20  FFSET clauses.  
20520 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e  The subquery can
20530 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70  not use any comp
20540 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
20550 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68  perator other th
20560 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63  an UNION ALL bec
20570 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68  ause all the oth
20580 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  er compound.**  
20590 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20        operators 
205a0 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20  have an implied 
205b0 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20 69  DISTINCT which i
205c0 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a  s disallowed by.
205d0 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72 69  **        restri
205e0 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a  ction (4)..**.**
205f0 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61          Also, ea
20600 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  ch component of 
20610 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75  the sub-query mu
20620 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  st return the sa
20630 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20  me number.**    
20640 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f      of result co
20650 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61  lumns. This is a
20660 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72  ctually a requir
20670 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f  ement for any co
20680 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
20690 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
206a0 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63  t, but all the c
206b0 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69 73  ode here does is
206c0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
206d0 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63  no.**        suc
206e0 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d  h (illegal) sub-
206f0 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e  query is flatten
20700 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
20710 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a  ill detect the.*
20720 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78 20  *        syntax 
20730 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e  error and return
20740 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73   a detailed mess
20750 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29  age..**.**  (18)
20760 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
20770 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
20780 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c   select, then al
20790 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  l terms of the.*
207a0 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 42  *        ORDER B
207b0 59 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  Y clause of the 
207c0 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73  parent must be s
207d0 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  imple references
207e0 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63   to .**        c
207f0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75  olumns of the su
20800 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
20810 28 31 39 29 20 20 49 66 20 74 68 65 20 73 75 62  (19)  If the sub
20820 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54  query uses LIMIT
20830 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
20840 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a  query may not.**
20850 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57          have a W
20860 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  HERE clause..**.
20870 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65  **  (20)  If the
20880 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
20890 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
208a0 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f   then it must no
208b0 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
208c0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
208d0 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37  se.  Ticket #377
208e0 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c  3.  We could rel
208f0 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  ax this constrai
20900 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d  nt.**        som
20910 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20  ewhat by saying 
20920 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f  that the terms o
20930 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
20940 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20  lause must.**   
20950 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75       appear as u
20960 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74  nmodified result
20970 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
20980 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75  outer query.  Bu
20990 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68  t we.**        h
209a0 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69  ave other optimi
209b0 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20  zations in mind 
209c0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61  to deal with tha
209d0 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  t case..**.**  (
209e0 32 31 29 20 20 49 66 20 74 68 65 20 73 75 62 71  21)  If the subq
209f0 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54 20  uery uses LIMIT 
20a00 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71  then the outer q
20a10 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 0a  uery may not be.
20a20 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
20a30 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74  CT.  (See ticket
20a40 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a   [752e1646fc])..
20a50 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65  **.**  (22)  The
20a60 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
20a70 74 20 62 65 20 61 20 72 65 63 75 72 73 69 76 65  t be a recursive
20a80 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a   CTE..**.**  (**
20a90 29 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f  )  Subsumed into
20aa0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37   restriction (17
20ab0 64 33 29 2e 20 20 57 61 73 3a 20 49 66 20 74 68  d3).  Was: If th
20ac0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
20ad0 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 72 65 63  .**        a rec
20ae0 75 72 73 69 76 65 20 43 54 45 2c 20 74 68 65 6e  ursive CTE, then
20af0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d   the sub-query m
20b00 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d 70  ay not be a comp
20b10 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 20 20  ound query..**  
20b20 20 20 20 20 20 20 54 68 69 73 20 72 65 73 74 72        This restr
20b30 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73  iction is becaus
20b40 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74  e transforming t
20b50 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72  he.**        par
20b60 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e  ent to a compoun
20b70 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73  d query confuses
20b80 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68   the code that h
20b90 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20  andles.**       
20ba0 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69   recursive queri
20bb0 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63  es in multiSelec
20bc0 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  t()..**.**  (**)
20bd0 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61    We no longer a
20be0 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65  ttempt to flatte
20bf0 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71  n aggregate subq
20c00 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a  ueries.  Was:.**
20c10 20 20 20 20 20 20 20 20 54 68 65 20 73 75 62 71          The subq
20c20 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
20c30 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 61  an aggregate tha
20c40 74 20 75 73 65 73 20 74 68 65 20 62 75 69 6c 74  t uses the built
20c50 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a  -in min() or .**
20c60 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29          or max()
20c70 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69   functions.  (Wi
20c80 74 68 6f 75 74 20 74 68 69 73 20 72 65 73 74 72  thout this restr
20c90 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20  iction, a query 
20ca0 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20  like:.**        
20cb0 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28  "SELECT x FROM (
20cc0 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78  SELECT max(y), x
20cd0 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64   FROM t1)" would
20ce0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
20cf0 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75 72  .**        retur
20d00 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f  n the value X fo
20d10 72 20 77 68 69 63 68 20 59 20 77 61 73 20 6d 61  r which Y was ma
20d20 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a  ximal.).**.**.**
20d30 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   In this routine
20d40 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65  , the "p" parame
20d50 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
20d60 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
20d70 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71  ery..** The subq
20d80 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d  uery is p->pSrc-
20d90 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67  >a[iFrom].  isAg
20da0 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
20db0 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20   outer query.** 
20dc0 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e  uses aggregates.
20dd0 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65  .**.** If flatte
20de0 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65  ning is not atte
20df0 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74  mpted, this rout
20e00 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61  ine is a no-op a
20e10 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  nd returns 0..**
20e20 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
20e30 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73  s attempted this
20e40 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
20e50 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66   1..**.** All of
20e60 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
20e70 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63  analysis must oc
20e80 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20  cur on both the 
20e90 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a  outer query and.
20ea0 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ** the subquery 
20eb0 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
20ec0 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61  ine runs..*/.sta
20ed0 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53  tic int flattenS
20ee0 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65  ubquery(.  Parse
20ef0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
20f00 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
20f10 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
20f20 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
20f30 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75  The parent or ou
20f40 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  ter SELECT state
20f50 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  ment */.  int iF
20f60 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rom,           /
20f70 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53  * Index in p->pS
20f80 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69  rc->a[] of the i
20f90 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f  nner subquery */
20fa0 0a 20 20 69 6e 74 20 69 73 41 67 67 20 20 20 20  .  int isAgg    
20fb0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20fc0 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  if outer SELECT 
20fd0 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
20fe0 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
20ff0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
21000 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
21010 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
21020 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20  ntext;.  Select 
21030 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a 20  *pParent;    /* 
21040 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41 4c  Current UNION AL
21050 4c 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f 74  L term of the ot
21060 68 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53  her query */.  S
21070 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20  elect *pSub;    
21080 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20     /* The inner 
21090 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65  query or "subque
210a0 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ry" */.  Select 
210b0 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20  *pSub1;      /* 
210c0 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  Pointer to the r
210d0 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20  ightmost select 
210e0 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a  in sub-query */.
210f0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
21100 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
21110 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
21120 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
21130 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72   SrcList *pSubSr
21140 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
21150 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
21160 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
21170 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20   iParent;       
21180 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20   /* VDBE cursor 
21190 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53  number of the pS
211a0 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65  ub result set te
211b0 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  mp table */.  in
211c0 74 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20 2d  t iNewParent = -
211d0 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74  1;/* Replacement
211e0 20 74 61 62 6c 65 20 66 6f 72 20 69 50 61 72 65   table for iPare
211f0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65  nt */.  int isLe
21200 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f 2a 20 54  ftJoin = 0; /* T
21210 72 75 65 20 69 66 20 70 53 75 62 20 69 73 20 74  rue if pSub is t
21220 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66  he right side of
21230 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 20   a LEFT JOIN */ 
21240 20 20 20 0a 20 20 69 6e 74 20 69 3b 20 20 20 20     .  int i;    
21250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
21260 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45  p counter */.  E
21270 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
21280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21290 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
212a0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
212b0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
212c0 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65  ubitem;   /* The
212d0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73   subquery */.  s
212e0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
212f0 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43  rse->db;..  /* C
21300 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66  heck to see if f
21310 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
21320 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20  mitted.  Return 
21330 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  0 if not..  */. 
21340 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
21350 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
21360 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28  rior==0 );.  if(
21370 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
21380 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
21390 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29  _QueryFlattener)
213a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
213b0 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
213c0 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26   assert( pSrc &&
213d0 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72   iFrom>=0 && iFr
213e0 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  om<pSrc->nSrc );
213f0 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70  .  pSubitem = &p
21400 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20  Src->a[iFrom];. 
21410 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69   iParent = pSubi
21420 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
21430 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d  pSub = pSubitem-
21440 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65  >pSelect;.  asse
21450 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 0a  rt( pSub!=0 );..
21460 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
21470 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
21480 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f  ( pSubSrc );.  /
21490 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69  * Prior to versi
214a0 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c  on 3.1.2, when L
214b0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
214c0 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65  had to be simple
214d0 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a   constants,.  **
214e0 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65   not arbitrary e
214f0 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 61  xpressions, we a
21500 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62  llowed some comb
21510 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61  ining of LIMIT a
21520 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
21530 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c  ecause they coul
21540 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74  d be computed at
21550 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20   compile-time.  
21560 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  But when LIMIT a
21570 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
21580 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79 20  ecame arbitrary 
21590 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20  expressions, we 
215a0 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61  were forced to a
215b0 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  dd restrictions 
215c0 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31  (13).  ** and (1
215d0 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  4). */.  if( pSu
215e0 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
215f0 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
21600 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
21610 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
21620 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  13) */.  if( pSu
21630 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 53 75  b->pLimit && pSu
21640 62 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68  b->pLimit->pRigh
21650 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
21660 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
21670 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  14) */.  if( (p-
21680 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43  >selFlags & SF_C
21690 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26 20 70  ompound)!=0 && p
216a0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
216b0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
216c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
216f0 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20  iction (15) */. 
21700 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72 63   }.  if( pSubSrc
21710 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ->nSrc==0 ) retu
21720 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
21730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
21740 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20  estriction (7)  
21750 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73  */.  if( pSub->s
21760 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
21770 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30  tinct ) return 0
21780 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
21790 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 20 20  estriction (4)  
217a0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
217b0 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e  Limit && (pSrc->
217c0 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29  nSrc>1 || isAgg)
217d0 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
217e0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
217f0 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39  strictions (8)(9
21800 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  ) */.  }.  if( p
21810 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53  ->pOrderBy && pS
21820 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
21830 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
21840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21860 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
21870 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a  riction (11) */.
21880 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20    }.  if( isAgg 
21890 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
218a0 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  y ) return 0;   
218b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
218c0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29  Restriction (16)
218d0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
218e0 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68  pLimit && p->pWh
218f0 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21910 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29  Restriction (19)
21920 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
21930 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65  pLimit && (p->se
21940 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
21950 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  inct)!=0 ){.    
21960 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
21970 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
21980 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (21) */.  }.  
21990 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61  if( pSub->selFla
219a0 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69  gs & (SF_Recursi
219b0 76 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ve) ){.    retur
219c0 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74  n 0; /* Restrict
219d0 69 6f 6e 73 20 28 32 32 29 20 2a 2f 0a 20 20 7d  ions (22) */.  }
219e0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  /*.  ** If t
219f0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74  he subquery is t
21a00 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
21a10 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   of a LEFT JOIN,
21a20 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 73   then the.  ** s
21a30 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
21a40 62 65 20 61 20 6a 6f 69 6e 20 69 74 73 65 6c 66  be a join itself
21a50 20 28 33 61 29 2e 20 45 78 61 6d 70 6c 65 20 6f   (3a). Example o
21a60 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f  f why this is no
21a70 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65 64 3a 0a  t.  ** allowed:.
21a80 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
21a90 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
21aa0 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33  JOIN (t2 JOIN t3
21ab0 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
21ac0 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
21ad0 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
21ae0 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
21af0 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
21b00 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e  ER JOIN t2) JOIN
21b10 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68   t3.  **.  ** wh
21b20 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c  ich is not at al
21b30 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  l the same thing
21b40 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
21b50 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74  he subquery is t
21b60 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
21b70 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   of a LEFT JOIN,
21b80 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 0a   then the outer.
21b90 20 20 2a 2a 20 71 75 65 72 79 20 63 61 6e 6e 6f    ** query canno
21ba0 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61 74  t be an aggregat
21bb0 65 2e 20 28 33 63 29 20 20 54 68 69 73 20 69 73  e. (3c)  This is
21bc0 20 61 6e 20 61 72 74 69 66 61 63 74 20 6f 66 20   an artifact of 
21bd0 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 61 67 67  the way.  ** agg
21be0 72 65 67 61 74 65 73 20 61 72 65 20 70 72 6f 63  regates are proc
21bf0 65 73 73 65 64 20 2d 20 74 68 65 72 65 20 69 73  essed - there is
21c00 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f   no mechanism to
21c10 20 64 65 74 65 72 6d 69 6e 65 20 69 66 0a 20 20   determine if.  
21c20 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e  ** the LEFT JOIN
21c30 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65   table should be
21c40 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a   all-NULL..  **.
21c50 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 69    ** See also ti
21c60 63 6b 65 74 73 20 23 33 30 36 2c 20 23 33 35 30  ckets #306, #350
21c70 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a 20 20 2a  , and #3300..  *
21c80 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65  /.  if( (pSubite
21c90 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
21ca0 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b   JT_OUTER)!=0 ){
21cb0 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20  .    isLeftJoin 
21cc0 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 53 75  = 1;.    if( pSu
21cd0 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  bSrc->nSrc>1 || 
21ce0 69 73 41 67 67 20 7c 7c 20 49 73 56 69 72 74 75  isAgg || IsVirtu
21cf0 61 6c 28 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d  al(pSubSrc->a[0]
21d00 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  .pTab) ){.      
21d10 2f 2a 20 20 28 33 61 29 20 20 20 20 20 20 20 20  /*  (3a)        
21d20 20 20 20 20 20 28 33 63 29 20 20 20 20 20 28 33       (3c)     (3
21d30 62 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  b) */.      retu
21d40 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
21d50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58  #ifdef SQLITE_EX
21d60 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a 20 20  TRA_IFNULLROW.  
21d70 65 6c 73 65 20 69 66 28 20 69 46 72 6f 6d 3e 30  else if( iFrom>0
21d80 20 26 26 20 21 69 73 41 67 67 20 29 7b 0a 20 20   && !isAgg ){.  
21d90 20 20 2f 2a 20 53 65 74 74 69 6e 67 20 69 73 4c    /* Setting isL
21da0 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31 20 63 61  eftJoin to -1 ca
21db0 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f  uses OP_IfNullRo
21dc0 77 20 6f 70 63 6f 64 65 73 20 74 6f 20 62 65 20  w opcodes to be 
21dd0 67 65 6e 65 72 61 74 65 64 20 66 6f 72 0a 20 20  generated for.  
21de0 20 20 2a 2a 20 65 76 65 72 79 20 72 65 66 65 72    ** every refer
21df0 65 6e 63 65 20 74 6f 20 61 6e 79 20 72 65 73 75  ence to any resu
21e00 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 73  lt column from s
21e10 75 62 71 75 65 72 79 20 69 6e 20 61 20 6a 6f 69  ubquery in a joi
21e20 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a 2a 20 74  n, even.    ** t
21e30 68 6f 75 67 68 20 74 68 65 79 20 61 72 65 20 6e  hough they are n
21e40 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  ot necessary.  T
21e50 68 69 73 20 77 69 6c 6c 20 73 74 72 65 73 73 2d  his will stress-
21e60 74 65 73 74 20 74 68 65 20 4f 50 5f 49 66 4e 75  test the OP_IfNu
21e70 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a 20 6f 70  llRow .    ** op
21e80 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 73 4c  code. */.    isL
21e90 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b 0a 20 20  eftJoin = -1;.  
21ea0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
21eb0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37 29 3a  estriction (17):
21ec0 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
21ed0 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
21ee0 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20  SELECT, then it 
21ef0 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e  must.  ** use on
21f00 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ly the UNION ALL
21f10 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e   operator. And n
21f20 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c  one of the simpl
21f30 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73  e select queries
21f40 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20  .  ** that make 
21f50 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  up the compound 
21f60 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77  SELECT are allow
21f70 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61  ed to be aggrega
21f80 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20  te or distinct. 
21f90 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a   ** queries..  *
21fa0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50  /.  if( pSub->pP
21fb0 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20  rior ){.    if( 
21fc0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
21fd0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
21fe0 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  ;  /* Restrictio
21ff0 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20 20 7d 0a  n (20) */.    }.
22000 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c      if( isAgg ||
22010 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
22020 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
22030 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  || pSrc->nSrc!=1
22040 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
22050 20 30 3b 20 2f 2a 20 28 31 37 64 31 29 2c 20 28   0; /* (17d1), (
22060 31 37 64 32 29 2c 20 6f 72 20 28 31 37 64 33 29  17d2), or (17d3)
22070 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   */.    }.    fo
22080 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53  r(pSub1=pSub; pS
22090 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31  ub1; pSub1=pSub1
220a0 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
220b0 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
220c0 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
220d0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
220e0 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
220f0 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
22100 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
22110 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
22120 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
22130 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
22140 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20  regate );.      
22150 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53  assert( pSub->pS
22160 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  rc!=0 );.      a
22170 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 45 4c  ssert( pSub->pEL
22180 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75 62  ist->nExpr==pSub
22190 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  1->pEList->nExpr
221a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   );.      if( (p
221b0 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
221c0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
221d0 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 20  _Aggregate))!=0 
221e0 20 20 20 2f 2a 20 28 31 37 62 29 20 2a 2f 0a 20     /* (17b) */. 
221f0 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d        || (pSub1-
22200 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31  >pPrior && pSub1
22210 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 20 20  ->op!=TK_ALL)   
22220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22230 20 28 31 37 61 29 20 2a 2f 0a 20 20 20 20 20 20   (17a) */.      
22240 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d   || pSub1->pSrc-
22250 3e 6e 53 72 63 3c 31 20 20 20 20 20 20 20 20 20  >nSrc<1         
22260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22270 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 37 63           /* (17c
22280 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b 0a 20 20  ) */.      ){.  
22290 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
222a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
222b0 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70  stcase( pSub1->p
222c0 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20  Src->nSrc>1 );. 
222d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73     }..    /* Res
222e0 74 72 69 63 74 69 6f 6e 20 28 31 38 29 2e 20 2a  triction (18). *
222f0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72  /.    if( p->pOr
22300 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69  derBy ){.      i
22310 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72  nt ii;.      for
22320 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72  (ii=0; ii<p->pOr
22330 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69  derBy->nExpr; ii
22340 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
22350 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b   p->pOrderBy->a[
22360 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  ii].u.x.iOrderBy
22370 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Col==0 ) return 
22380 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
22390 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 2d 72 65  .  }..  /* Ex-re
223a0 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29 3a 0a  striction (23):.
223b0 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 77 61    ** The only wa
223c0 79 20 74 68 61 74 20 74 68 65 20 72 65 63 75 72  y that the recur
223d0 73 69 76 65 20 70 61 72 74 20 6f 66 20 61 20 43  sive part of a C
223e0 54 45 20 63 61 6e 20 63 6f 6e 74 61 69 6e 20 61  TE can contain a
223f0 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 2a 2a 20 73   compound.  ** s
22400 75 62 71 75 65 72 79 20 69 73 20 66 6f 72 20 74  ubquery is for t
22410 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 62  he subquery to b
22420 65 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61 20  e one term of a 
22430 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20 74 68  join.  But if th
22440 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
22450 69 73 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20  is a join, then 
22460 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 68  the flattening h
22470 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
22480 73 74 6f 70 70 65 64 20 62 79 0a 20 20 2a 2a 20  stopped by.  ** 
22490 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37 64  restriction (17d
224a0 33 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  3).  */.  assert
224b0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
224c0 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d   SF_Recursive)==
224d0 30 20 7c 7c 20 70 53 75 62 2d 3e 70 50 72 69 6f  0 || pSub->pPrio
224e0 72 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 2a 2a 2a  r==0 );..  /****
224f0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
22500 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65  is point, flatte
22510 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
22520 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45  d. *****/.  SELE
22530 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
22540 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25 73 2e  ,p,("flatten %s.
22550 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c  %p from term %d\
22560 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
22570 20 20 20 20 20 20 20 70 53 75 62 2d 3e 7a 53 65         pSub->zSe
22580 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20 69 46 72  lName, pSub, iFr
22590 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68  om));..  /* Auth
225a0 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65  orize the subque
225b0 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  ry */.  pParse->
225c0 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
225d0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  Subitem->zName;.
225e0 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20    TESTONLY(i =) 
225f0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
22600 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
22610 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
22620 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d  ;.  testcase( i=
22630 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a  =SQLITE_DENY );.
22640 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
22650 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
22660 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f  uthContext;..  /
22670 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  * If the sub-que
22680 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
22690 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
226a0 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74  t, then (by rest
226b0 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37  rictions.  ** 17
226c0 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69   and 18 above) i
226d0 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f  t must be a UNIO
226e0 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61  N ALL and the pa
226f0 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20  rent query must 
22700 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20  .  ** be of the 
22710 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form:.  **.  ** 
22720 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72      SELECT <expr
22730 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75  -list> FROM (<su
22740 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65  b-query>) <where
22750 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20  -clause> .  **. 
22760 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   ** followed by 
22770 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
22780 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45  MIT and/or OFFSE
22790 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20  T clauses. This 
227a0 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74  block.  ** creat
227b0 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66  es N-1 copies of
227c0 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
227d0 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52  y without any OR
227e0 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72  DER BY, LIMIT or
227f0 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c   .  ** OFFSET cl
22800 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20  auses and joins 
22810 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74  them to the left
22820 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68  -hand-side of th
22830 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
22840 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20  using UNION ALL 
22850 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68  operators. In th
22860 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65  is case N is the
22870 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c   number of simpl
22880 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74  e.  ** select st
22890 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  atements in the 
228a0 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
228b0 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  ry..  **.  ** Ex
228c0 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
228d0 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20       SELECT a+1 
228e0 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20  FROM (.  **     
228f0 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
22900 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
22910 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
22920 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20         SELECT y 
22930 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20  FROM tab.  **   
22940 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
22950 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
22960 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20  T abs(z*2) FROM 
22970 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20  tab2.  **     ) 
22980 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52  WHERE a!=5 ORDER
22990 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
229a0 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
229b0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
229c0 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20  SELECT x+1 FROM 
229d0 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35  tab WHERE x+1!=5
229e0 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
229f0 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
22a00 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62  ECT y+1 FROM tab
22a10 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20   WHERE y+1!=5.  
22a20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
22a30 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
22a40 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d   abs(z*2)+1 FROM
22a50 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28   tab2 WHERE abs(
22a60 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  z*2)+1!=5.  **  
22a70 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20     ORDER BY 1.  
22a80 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20  **.  ** We call 
22a90 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75  this the "compou
22aa0 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
22ab0 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20  tening"..  */.  
22ac0 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70  for(pSub=pSub->p
22ad0 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75  Prior; pSub; pSu
22ae0 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
22af0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  .    Select *pNe
22b00 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  w;.    ExprList 
22b10 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
22b20 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70  OrderBy;.    Exp
22b30 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r *pLimit = p->p
22b40 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65 63  Limit;.    Selec
22b50 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
22b60 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f  Prior;.    p->pO
22b70 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
22b80 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20  p->pSrc = 0;.   
22b90 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
22ba0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
22bb0 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  0;.    pNew = sq
22bc0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
22bd0 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 73 71  b, p, 0);.    sq
22be0 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61  lite3SelectSetNa
22bf0 6d 65 28 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a  me(pNew, pSub->z
22c00 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d  SelName);.    p-
22c10 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
22c20 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
22c30 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
22c40 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
22c50 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  ;.    p->op = TK
22c60 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e  _ALL;.    if( pN
22c70 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ew==0 ){.      p
22c80 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
22c90 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
22ca0 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72      pNew->pPrior
22cb0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
22cc0 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50   if( pPrior ) pP
22cd0 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  rior->pNext = pN
22ce0 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ew;.      pNew->
22cf0 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
22d00 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65   p->pPrior = pNe
22d10 77 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  w;.      SELECTT
22d20 52 41 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c  RACE(2,pParse,p,
22d30 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  ("compound-subqu
22d40 65 72 79 20 66 6c 61 74 74 65 6e 65 72 22 0a 20  ery flattener". 
22d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d60 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 63               " c
22d70 72 65 61 74 65 73 20 25 73 2e 25 70 20 61 73 20  reates %s.%p as 
22d80 70 65 65 72 5c 6e 22 2c 70 4e 65 77 2d 3e 7a 53  peer\n",pNew->zS
22d90 65 6c 4e 61 6d 65 2c 20 70 4e 65 77 29 29 3b 0a  elName, pNew));.
22da0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
22db0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
22dc0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
22dd0 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74    /* Begin flatt
22de0 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d  ening the iFrom-
22df0 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
22e00 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a  FROM clause .  *
22e10 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  * in the outer q
22e20 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75  uery..  */.  pSu
22e30 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62  b = pSub1 = pSub
22e40 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a  item->pSelect;..
22e50 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
22e60 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
22e70 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63 69  structure associ
22e80 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
22e90 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f  ** subquery.  */
22ea0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
22eb0 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
22ec0 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c  Database);.  sql
22ed0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
22ee0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  Subitem->zName);
22ef0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
22f00 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
22f10 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74  Alias);.  pSubit
22f20 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
22f30 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
22f40 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62  Name = 0;.  pSub
22f50 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30  item->zAlias = 0
22f60 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  ;.  pSubitem->pS
22f70 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  elect = 0;..  /*
22f80 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20   Defer deleting 
22f90 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
22fa0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22fb0 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
22fc0 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65  ry until code ge
22fd0 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  neration is.  **
22fe0 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65   complete, since
22ff0 20 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c   there may still
23000 20 65 78 69 73 74 20 45 78 70 72 2e 70 54 61 62   exist Expr.pTab
23010 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20   entries that.  
23020 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  ** refer to the 
23030 73 75 62 71 75 65 72 79 20 65 76 65 6e 20 61 66  subquery even af
23040 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20  ter flattening. 
23050 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20   Ticket #3346.. 
23060 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65   **.  ** pSubite
23070 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79  m->pTab is alway
23080 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65  s non-NULL by te
23090 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  st restrictions 
230a0 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e  and tests above.
230b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41  .  */.  if( ALWA
230c0 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  YS(pSubitem->pTa
230d0 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62  b!=0) ){.    Tab
230e0 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20  le *pTabToDel = 
230f0 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a  pSubitem->pTab;.
23100 20 20 20 20 69 66 28 20 70 54 61 62 54 6f 44 65      if( pTabToDe
23110 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 29 7b  l->nTabRef==1 ){
23120 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 54  .      Parse *pT
23130 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
23140 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
23150 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54  Parse);.      pT
23160 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f  abToDel->pNextZo
23170 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c  mbie = pToplevel
23180 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20  ->pZombieTab;.  
23190 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70      pToplevel->p
231a0 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62  ZombieTab = pTab
231b0 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  ToDel;.    }else
231c0 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  {.      pTabToDe
231d0 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b 0a 20 20  l->nTabRef--;.  
231e0 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d    }.    pSubitem
231f0 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a  ->pTab = 0;.  }.
23200 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
23210 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e  ing loop runs on
23220 63 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d  ce for each term
23230 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73   in a compound-s
23240 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61  ubquery.  ** fla
23250 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63  ttening (as desc
23260 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49  ribed above).  I
23270 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
23280 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a   different kind.
23290 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69    ** of flatteni
232a0 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e  ng - a flattenin
232b0 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  g other than a c
232c0 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
232d0 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20   flattening -.  
232e0 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f  ** then this loo
232f0 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65  p only runs once
23300 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
23310 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20   loop moves all 
23320 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d  of the FROM elem
23330 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71  ents of the subq
23340 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20  uery into the.  
23350 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
23360 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
23370 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64  query.  Before d
23380 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d  oing this, remem
23390 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72  ber.  ** the cur
233a0 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
233b0 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65  he original oute
233c0 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65  r query FROM ele
233d0 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61  ment in.  ** iPa
233e0 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65  rent.  The iPare
233f0 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e  nt cursor will n
23400 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53  ever be used.  S
23410 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20  ubsequent code. 
23420 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78   ** will scan ex
23430 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e  pressions lookin
23440 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65  g for iParent re
23450 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70  ferences and rep
23460 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20  lace.  ** those 
23470 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20  references with 
23480 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
23490 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20   resolve to the 
234a0 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20  subquery FROM.  
234b0 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61  ** elements we a
234c0 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69  re now copying i
234d0 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50  n..  */.  for(pP
234e0 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74  arent=p; pParent
234f0 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e  ; pParent=pParen
23500 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d  t->pPrior, pSub=
23510 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
23520 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a     int nSubSrc;.
23530 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20      u8 jointype 
23540 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63  = 0;.    pSubSrc
23550 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20   = pSub->pSrc;  
23560 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
23570 65 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f  e of subquery */
23580 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70  .    nSubSrc = p
23590 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f  SubSrc->nSrc;  /
235a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
235b0 73 20 69 6e 20 73 75 62 71 75 65 72 79 20 46 52  s in subquery FR
235c0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
235d0 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
235e0 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52  >pSrc;     /* FR
235f0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
23600 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
23610 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29 7b  .    if( pSrc ){
23620 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
23630 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a  Parent==p );  /*
23640 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f   First time thro
23650 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
23660 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d        jointype =
23670 20 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f   pSubitem->fg.jo
23680 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73  intype;.    }els
23690 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
236a0 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20   pParent!=p );  
236b0 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65  /* 2nd and subse
236c0 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f  quent times thro
236d0 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
236e0 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61        pSrc = pPa
236f0 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c  rent->pSrc = sql
23700 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
23710 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d(db, 0, 0, 0);.
23720 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d        if( pSrc==
23730 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
23740 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
23750 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
23760 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
23770 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
23780 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
23790 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66  a single slot of
237a0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
237b0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20   of the outer.  
237c0 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20    ** query.  If 
237d0 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
237e0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65   more than one e
237f0 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52  lement in its FR
23800 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a  OM clause,.    *
23810 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68  * then expand th
23820 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f  e outer query to
23830 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20   make space for 
23840 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65  it to hold all e
23850 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f  lements.    ** o
23860 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
23870 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
23880 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
23890 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a    **    SELECT *
238a0 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c   FROM tabA, (SEL
238b0 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c  ECT * FROM sub1,
238c0 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20   sub2), tabB;.  
238d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
238e0 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20  outer query has 
238f0 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46  3 slots in its F
23900 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65  ROM clause.  One
23910 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20   slot of the.   
23920 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
23930 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74  (the middle slot
23940 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  ) is used by the
23950 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20   subquery.  The 
23960 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63  next.    ** bloc
23970 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65  k of code will e
23980 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  xpand the outer 
23990 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73  query FROM claus
239a0 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20  e to 4 slots..  
239b0 20 20 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65 20    ** The middle 
239c0 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64  slot is expanded
239d0 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e   to two slots in
239e0 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73   order to make s
239f0 70 61 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20  pace.    ** for 
23a00 74 68 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73  the two elements
23a10 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
23a20 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
23a30 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ery..    */.    
23a40 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b  if( nSubSrc>1 ){
23a50 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
23a60 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71  pSrc = pSrc = sq
23a70 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
23a80 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53  rge(db, pSrc, nS
23a90 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29  ubSrc-1,iFrom+1)
23aa0 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
23ab0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
23ac0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
23ad0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
23ae0 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68    /* Transfer th
23af0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
23b00 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62  rms from the sub
23b10 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
23b20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
23b30 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  y..    */.    fo
23b40 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63  r(i=0; i<nSubSrc
23b50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
23b60 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
23b70 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b  e(db, pSrc->a[i+
23b80 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a  iFrom].pUsing);.
23b90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
23ba0 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 66  rc->a[i+iFrom].f
23bb0 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29  g.isTabFunc==0 )
23bc0 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b  ;.      pSrc->a[
23bd0 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53  i+iFrom] = pSubS
23be0 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
23bf0 69 4e 65 77 50 61 72 65 6e 74 20 3d 20 70 53 75  iNewParent = pSu
23c00 62 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  bSrc->a[i].iCurs
23c10 6f 72 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  or;.      memset
23c20 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c  (&pSubSrc->a[i],
23c30 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53   0, sizeof(pSubS
23c40 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20  rc->a[i]));.    
23c50 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46  }.    pSrc->a[iF
23c60 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  rom].fg.jointype
23c70 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a   = jointype;.  .
23c80 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e      /* Now begin
23c90 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75   substituting su
23ca0 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65  bquery result se
23cb0 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  t expressions fo
23cc0 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  r .    ** refere
23cd0 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72  nces to the iPar
23ce0 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ent in the outer
23cf0 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a   query..    ** .
23d00 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a      ** Example:.
23d10 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
23d20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30  SELECT a+5, b*10
23d30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a   FROM (SELECT x*
23d40 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20  3 AS a, y+10 AS 
23d50 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45  b FROM t1) WHERE
23d60 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c   a>b;.    **   \
23d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d80 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
23d90 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f  ___ subquery ___
23da0 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
23db0 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f    /.    **    \_
23dc0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23dd0 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79  ____ outer query
23de0 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   _______________
23df0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
23e00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
23e10 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20  e look at every 
23e20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
23e30 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
23e40 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
23e50 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20   see.    ** "a" 
23e60 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78  we substitute "x
23e70 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c  *3" and every pl
23e80 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77  ace we see "b" w
23e90 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b  e substitute "y+
23ea0 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  10"..    */.    
23eb0 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
23ec0 42 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  By ){.      /* A
23ed0 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 6e  t this point, an
23ee0 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64 65  y non-zero iOrde
23ef0 72 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69 6e  rByCol values in
23f00 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 0a  dicate that the.
23f10 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42        ** ORDER B
23f20 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  Y column express
23f30 69 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61 6c  ion is identical
23f40 20 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42 79   to the iOrderBy
23f50 43 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a 20  Col'th.      ** 
23f60 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75 72  expression retur
23f70 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 73 74  ned by SELECT st
23f80 61 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53 69  atement pSub. Si
23f90 6e 63 65 20 74 68 65 73 65 20 76 61 6c 75 65 73  nce these values
23fa0 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74  .      ** do not
23fb0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f 72   necessarily cor
23fc0 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75 6d  respond to colum
23fd0 6e 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74 61  ns in SELECT sta
23fe0 74 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c 0a  tement pParent,.
23ff0 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68        ** zero th
24000 65 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73 66  em before transf
24010 65 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20  ering the ORDER 
24020 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20  BY clause..     
24030 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74   **.      ** Not
24040 20 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79 20   doing this may 
24050 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20 69  cause an error i
24060 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63  f a subsequent c
24070 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20  all to this.    
24080 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74    ** function at
24090 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65  tempts to flatte
240a0 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62  n a compound sub
240b0 2d 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61 72  -query into pPar
240c0 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68  ent.      ** (th
240d0 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73 20  e only way this 
240e0 63 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69 66  can happen is if
240f0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
24100 62 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20 20  b-query is.     
24110 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 61   ** currently pa
24120 72 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72 63  rt of pSub->pSrc
24130 29 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 64  ). See ticket [d
24140 31 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f 0a  11a6e908f].  */.
24150 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
24160 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d  pOrderBy = pSub-
24170 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
24180 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
24190 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
241a0 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  ){.        pOrde
241b0 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f  rBy->a[i].u.x.iO
241c0 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20  rderByCol = 0;. 
241d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
241e0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f  ert( pParent->pO
241f0 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
24200 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64     pParent->pOrd
24210 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
24220 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72  .      pSub->pOr
24230 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d  derBy = 0;.    }
24240 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71  .    pWhere = sq
24250 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
24260 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30   pSub->pWhere, 0
24270 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4c 65 66  );.    if( isLef
24280 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20 20 20 20 20  tJoin>0 ){.     
24290 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 57 68   setJoinExpr(pWh
242a0 65 72 65 2c 20 69 4e 65 77 50 61 72 65 6e 74 29  ere, iNewParent)
242b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
242c0 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  ent->pWhere = sq
242d0 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
242e0 20 70 57 68 65 72 65 2c 20 70 50 61 72 65 6e 74   pWhere, pParent
242f0 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 69  ->pWhere);.    i
24300 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
24310 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  led==0 ){.      
24320 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b 0a  SubstContext x;.
24330 20 20 20 20 20 20 78 2e 70 50 61 72 73 65 20 3d        x.pParse =
24340 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 78   pParse;.      x
24350 2e 69 54 61 62 6c 65 20 3d 20 69 50 61 72 65 6e  .iTable = iParen
24360 74 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65 77 54  t;.      x.iNewT
24370 61 62 6c 65 20 3d 20 69 4e 65 77 50 61 72 65 6e  able = iNewParen
24380 74 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c 65 66  t;.      x.isLef
24390 74 4a 6f 69 6e 20 3d 20 69 73 4c 65 66 74 4a 6f  tJoin = isLeftJo
243a0 69 6e 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c 69  in;.      x.pELi
243b0 73 74 20 3d 20 70 53 75 62 2d 3e 70 45 4c 69 73  st = pSub->pELis
243c0 74 3b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  t;.      substSe
243d0 6c 65 63 74 28 26 78 2c 20 70 50 61 72 65 6e 74  lect(&x, pParent
243e0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 0);.    }.  . 
243f0 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65     /* The flatte
24400 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73  ned query is dis
24410 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20  tinct if either 
24420 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65  the inner or the
24430 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
24440 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e  ery is distinct.
24450 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61   .    */.    pPa
24460 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  rent->selFlags |
24470 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  = pSub->selFlags
24480 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a   & SF_Distinct;.
24490 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a    .    /*.    **
244a0 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
244b0 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d   (SELECT ... LIM
244c0 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c  IT a OFFSET b) L
244d0 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b  IMIT x OFFSET y;
244e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
244f0 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f  ne is tempted to
24500 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e   try to add a an
24510 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  d b to combine t
24520 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20  he limits.  But 
24530 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73  this.    ** does
24540 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74   not work if eit
24550 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67  her limit is neg
24560 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ative..    */.  
24570 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
24580 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  it ){.      pPar
24590 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53  ent->pLimit = pS
245a0 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20  ub->pLimit;.    
245b0 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d    pSub->pLimit =
245c0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
245d0 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65   /* Finially, de
245e0 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66  lete what is lef
245f0 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
24600 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  y and return.  *
24610 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a  * success..  */.
24620 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
24630 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31 29  elete(db, pSub1)
24640 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
24650 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
24660 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
24670 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
24680 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
24690 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x100,pParse,p,("
246a0 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67  After flattening
246b0 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
246c0 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
246d0 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
246e0 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
246f0 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
24700 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
24710 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
24720 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
24730 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
24740 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
24750 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
24760 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
24770 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
24780 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63  EW)./*.** Make c
24790 6f 70 69 65 73 20 6f 66 20 72 65 6c 65 76 61 6e  opies of relevan
247a0 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  t WHERE clause t
247b0 65 72 6d 73 20 6f 66 20 74 68 65 20 6f 75 74 65  erms of the oute
247c0 72 20 71 75 65 72 79 20 69 6e 74 6f 0a 2a 2a 20  r query into.** 
247d0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
247e0 20 6f 66 20 73 75 62 71 75 65 72 79 2e 20 20 45   of subquery.  E
247f0 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
24800 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
24810 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63  SELECT a AS x, c
24820 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 29  -d AS y FROM t1)
24830 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79   WHERE x=5 AND y
24840 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73  =10;.**.** Trans
24850 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a  formed into:.**.
24860 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
24870 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53  ROM (SELECT a AS
24880 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f   x, c-d AS y FRO
24890 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 41  M t1 WHERE a=5 A
248a0 4e 44 20 63 2d 64 3d 31 30 29 0a 2a 2a 20 20 20  ND c-d=10).**   
248b0 20 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20    WHERE x=5 AND 
248c0 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20  y=10;.**.** The 
248d0 68 6f 70 65 20 69 73 20 74 68 61 74 20 74 68 65  hope is that the
248e0 20 74 65 72 6d 73 20 61 64 64 65 64 20 74 6f 20   terms added to 
248f0 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  the inner query 
24900 77 69 6c 6c 20 6d 61 6b 65 20 69 74 20 6d 6f 72  will make it mor
24910 65 0a 2a 2a 20 65 66 66 69 63 69 65 6e 74 2e 0a  e.** efficient..
24920 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74  **.** Do not att
24930 65 6d 70 74 20 74 68 69 73 20 6f 70 74 69 6d 69  empt this optimi
24940 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a  zation if:.**.**
24950 20 20 20 28 31 29 20 28 2a 2a 20 54 68 69 73 20     (1) (** This 
24960 72 65 73 74 72 69 63 74 69 6f 6e 20 77 61 73 20  restriction was 
24970 72 65 6d 6f 76 65 64 20 6f 6e 20 32 30 31 37 2d  removed on 2017-
24980 30 39 2d 32 39 2e 20 20 57 65 20 75 73 65 64 20  09-29.  We used 
24990 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  to.**           
249a0 64 69 73 61 6c 6c 6f 77 20 74 68 69 73 20 6f 70  disallow this op
249b0 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 61  timization for a
249c0 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
249d0 69 65 73 2c 20 62 75 74 20 6e 6f 77 0a 2a 2a 20  ies, but now.** 
249e0 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
249f0 61 6c 6c 6f 77 65 64 20 62 79 20 70 75 74 74 69  allowed by putti
24a00 6e 67 20 74 68 65 20 65 78 74 72 61 20 74 65 72  ng the extra ter
24a10 6d 73 20 6f 6e 20 74 68 65 20 48 41 56 49 4e 47  ms on the HAVING
24a20 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20   clause..**     
24a30 20 20 20 20 20 20 54 68 65 20 61 64 64 65 64 20        The added 
24a40 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73  HAVING clause is
24a50 20 70 6f 69 6e 74 6c 65 73 73 20 69 66 20 74 68   pointless if th
24a60 65 20 73 75 62 71 75 65 72 79 20 6c 61 63 6b 73  e subquery lacks
24a70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 20  .**           a 
24a80 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
24a90 20 20 42 75 74 20 73 75 63 68 20 61 20 48 41 56    But such a HAV
24aa0 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20 61 6c  ING clause is al
24ab0 73 6f 20 68 61 72 6d 6c 65 73 73 0a 2a 2a 20 20  so harmless.**  
24ac0 20 20 20 20 20 20 20 20 20 73 6f 20 74 68 65 72           so ther
24ad0 65 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61  e does not appea
24ae0 72 20 74 6f 20 62 65 20 61 6e 79 20 72 65 61 73  r to be any reas
24af0 6f 6e 20 74 6f 20 61 64 64 20 65 78 74 72 61 20  on to add extra 
24b00 6c 6f 67 69 63 0a 2a 2a 20 20 20 20 20 20 20 20  logic.**        
24b10 20 20 20 74 6f 20 73 75 70 70 72 65 73 73 20 69     to suppress i
24b20 74 2e 20 2a 2a 29 0a 2a 2a 0a 2a 2a 20 20 20 28  t. **).**.**   (
24b30 32 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  2) The inner que
24b40 72 79 20 69 73 20 74 68 65 20 72 65 63 75 72 73  ry is the recurs
24b50 69 76 65 20 70 61 72 74 20 6f 66 20 61 20 63 6f  ive part of a co
24b60 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65  mmon table expre
24b70 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  ssion..**.**   (
24b80 33 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  3) The inner que
24b90 72 79 20 68 61 73 20 61 20 4c 49 4d 49 54 20 63  ry has a LIMIT c
24ba0 6c 61 75 73 65 20 28 73 69 6e 63 65 20 74 68 65  lause (since the
24bb0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
24bc0 57 48 45 52 45 0a 2a 2a 20 20 20 20 20 20 20 63  WHERE.**       c
24bd0 6c 6f 73 65 20 77 6f 75 6c 64 20 63 68 61 6e 67  lose would chang
24be0 65 20 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66  e the meaning of
24bf0 20 74 68 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a   the LIMIT)..**.
24c00 2a 2a 20 20 20 28 34 29 20 54 68 65 20 69 6e 6e  **   (4) The inn
24c10 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20  er query is the 
24c20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
24c30 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 61 6e 64   a LEFT JOIN and
24c40 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 65 78   the.**       ex
24c50 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 70  pression to be p
24c60 75 73 68 65 64 20 64 6f 77 6e 20 64 6f 65 73 20  ushed down does 
24c70 6e 6f 74 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68  not come from th
24c80 65 20 4f 4e 20 63 6c 61 75 73 65 0a 2a 2a 20 20  e ON clause.**  
24c90 20 20 20 20 20 6f 6e 20 74 68 61 74 20 4c 45 46       on that LEF
24ca0 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 20 20  T JOIN..**.**   
24cb0 28 35 29 20 54 68 65 20 57 48 45 52 45 20 63 6c  (5) The WHERE cl
24cc0 61 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  ause expression 
24cd0 6f 72 69 67 69 6e 61 74 65 73 20 69 6e 20 74 68  originates in th
24ce0 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
24cf0 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66  ause.**       of
24d00 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 77 68 65   a LEFT JOIN whe
24d10 72 65 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f  re iCursor is no
24d20 74 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  t the right-hand
24d30 20 74 61 62 6c 65 20 6f 66 20 74 68 61 74 0a 2a   table of that.*
24d40 2a 20 20 20 20 20 20 20 6c 65 66 74 20 6a 6f 69  *       left joi
24d50 6e 2e 20 20 41 6e 20 65 78 61 6d 70 6c 65 3a 0a  n.  An example:.
24d60 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
24d70 53 45 4c 45 43 54 20 2a 0a 2a 2a 20 20 20 20 20  SELECT *.**     
24d80 20 20 20 20 20 20 46 52 4f 4d 20 28 53 45 4c 45        FROM (SELE
24d90 43 54 20 31 20 41 53 20 61 31 20 55 4e 49 4f 4e  CT 1 AS a1 UNION
24da0 20 41 4c 4c 20 53 45 4c 45 43 54 20 32 29 20 41   ALL SELECT 2) A
24db0 53 20 61 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  S aa.**         
24dc0 20 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 31    JOIN (SELECT 1
24dd0 20 41 53 20 62 32 20 55 4e 49 4f 4e 20 41 4c 4c   AS b2 UNION ALL
24de0 20 53 45 4c 45 43 54 20 32 29 20 41 53 20 62 62   SELECT 2) AS bb
24df0 20 4f 4e 20 28 61 31 3d 62 32 29 0a 2a 2a 20 20   ON (a1=b2).**  
24e00 20 20 20 20 20 20 20 20 20 4c 45 46 54 20 4a 4f           LEFT JO
24e10 49 4e 20 28 53 45 4c 45 43 54 20 38 20 41 53 20  IN (SELECT 8 AS 
24e20 63 33 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  c3 UNION ALL SEL
24e30 45 43 54 20 39 29 20 41 53 20 63 63 20 4f 4e 20  ECT 9) AS cc ON 
24e40 28 62 32 3d 32 29 3b 0a 2a 2a 0a 2a 2a 20 20 20  (b2=2);.**.**   
24e50 20 20 20 20 54 68 65 20 63 6f 72 72 65 63 74 20      The correct 
24e60 61 6e 73 77 65 72 20 69 73 20 74 68 72 65 65 20  answer is three 
24e70 72 6f 77 73 3a 20 20 28 31 2c 31 2c 4e 55 4c 4c  rows:  (1,1,NULL
24e80 29 2c 28 32 2c 32 2c 38 29 2c 28 32 2c 32 2c 39  ),(2,2,8),(2,2,9
24e90 29 2e 0a 2a 2a 20 20 20 20 20 20 20 42 75 74 20  )..**       But 
24ea0 69 66 20 74 68 65 20 28 62 32 3d 32 29 20 74 65  if the (b2=2) te
24eb0 72 6d 20 77 65 72 65 20 74 6f 20 62 65 20 70 75  rm were to be pu
24ec0 73 68 65 64 20 64 6f 77 6e 20 69 6e 74 6f 20 74  shed down into t
24ed0 68 65 20 62 62 20 73 75 62 71 75 65 72 79 2c 0a  he bb subquery,.
24ee0 2a 2a 20 20 20 20 20 20 20 74 68 65 6e 20 74 68  **       then th
24ef0 65 20 28 31 2c 31 2c 4e 55 4c 4c 29 20 72 6f 77  e (1,1,NULL) row
24f00 20 77 6f 75 6c 64 20 62 65 20 73 75 70 70 72 65   would be suppre
24f10 73 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ssed..**.** Retu
24f20 72 6e 20 30 20 69 66 20 6e 6f 20 63 68 61 6e 67  rn 0 if no chang
24f30 65 73 20 61 72 65 20 6d 61 64 65 20 61 6e 64 20  es are made and 
24f40 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e 65 20  non-zero if one 
24f50 6f 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c  or more WHERE cl
24f60 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73 20 61 72  ause.** terms ar
24f70 65 20 64 75 70 6c 69 63 61 74 65 64 20 69 6e 74  e duplicated int
24f80 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  o the subquery..
24f90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 75  */.static int pu
24fa0 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
24fb0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
24fc0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
24fd0 73 65 20 63 6f 6e 74 65 78 74 20 28 66 6f 72 20  se context (for 
24fe0 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 65 72 72  malloc() and err
24ff0 6f 72 20 72 65 70 6f 72 74 69 6e 67 29 20 2a 2f  or reporting) */
25000 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71  .  Select *pSubq
25010 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
25020 73 75 62 71 75 65 72 79 20 77 68 6f 73 65 20 57  subquery whose W
25030 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74  HERE clause is t
25040 6f 20 62 65 20 61 75 67 6d 65 6e 74 65 64 20 2a  o be augmented *
25050 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
25060 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
25070 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
25080 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
25090 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 73 6f   */.  int iCurso
250a0 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  r,          /* C
250b0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
250c0 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
250d0 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e    int isLeftJoin
250e0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
250f0 69 66 20 70 53 75 62 71 20 69 73 20 74 68 65 20  if pSubq is the 
25100 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20  right term of a 
25110 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 29 7b 0a  LEFT JOIN */.){.
25120 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
25130 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20  int nChng = 0;. 
25140 20 69 66 28 20 70 57 68 65 72 65 3d 3d 30 20 29   if( pWhere==0 )
25150 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
25160 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73   pSubq->selFlags
25170 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
25180 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
25190 72 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20  restriction (2) 
251a0 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
251b0 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 4f 6e 6c  E_DEBUG.  /* Onl
251c0 79 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  y the first term
251d0 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 63   of a compound c
251e0 61 6e 20 68 61 76 65 20 61 20 57 49 54 48 20 63  an have a WITH c
251f0 6c 61 75 73 65 2e 20 20 42 75 74 20 6d 61 6b 65  lause.  But make
25200 0a 20 20 2a 2a 20 73 75 72 65 20 6e 6f 20 6f 74  .  ** sure no ot
25210 68 65 72 20 74 65 72 6d 73 20 61 72 65 20 6d 61  her terms are ma
25220 72 6b 65 64 20 53 46 5f 52 65 63 75 72 73 69 76  rked SF_Recursiv
25230 65 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 74 68  e in case someth
25240 69 6e 67 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  ing changes.  **
25250 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a   in the future..
25260 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 53 65 6c    */.  {.    Sel
25270 65 63 74 20 2a 70 58 3b 20 20 0a 20 20 20 20 66  ect *pX;  .    f
25280 6f 72 28 70 58 3d 70 53 75 62 71 3b 20 70 58 3b  or(pX=pSubq; pX;
25290 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b   pX=pX->pPrior){
252a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
252b0 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  pX->selFlags & (
252c0 53 46 5f 52 65 63 75 72 73 69 76 65 29 29 3d 3d  SF_Recursive))==
252d0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  0 );.    }.  }.#
252e0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 53 75  endif..  if( pSu
252f0 62 71 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b  bq->pLimit!=0 ){
25300 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
25310 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33  * restriction (3
25320 29 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65  ) */.  }.  while
25330 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b  ( pWhere->op==TK
25340 5f 41 4e 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e  _AND ){.    nChn
25350 67 20 2b 3d 20 70 75 73 68 44 6f 77 6e 57 68 65  g += pushDownWhe
25360 72 65 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20  reTerms(pParse, 
25370 70 53 75 62 71 2c 20 70 57 68 65 72 65 2d 3e 70  pSubq, pWhere->p
25380 52 69 67 68 74 2c 0a 20 20 20 20 20 20 20 20 20  Right,.         
25390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253a0 20 20 20 20 20 20 20 69 43 75 72 73 6f 72 2c 20         iCursor, 
253b0 69 73 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  isLeftJoin);.   
253c0 20 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65   pWhere = pWhere
253d0 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69  ->pLeft;.  }.  i
253e0 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e 0a 20 20  f( isLeftJoin.  
253f0 20 26 26 20 28 45 78 70 72 48 61 73 50 72 6f 70   && (ExprHasProp
25400 65 72 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46  erty(pWhere,EP_F
25410 72 6f 6d 4a 6f 69 6e 29 3d 3d 30 0a 20 20 20 20  romJoin)==0.    
25420 20 20 20 20 20 7c 7c 20 70 57 68 65 72 65 2d 3e       || pWhere->
25430 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21  iRightJoinTable!
25440 3d 69 43 75 72 73 6f 72 29 0a 20 20 29 7b 0a 20  =iCursor).  ){. 
25450 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
25460 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 20  restriction (4) 
25470 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70  */.  }.  if( Exp
25480 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 57 68  rHasProperty(pWh
25490 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  ere,EP_FromJoin)
254a0 20 26 26 20 70 57 68 65 72 65 2d 3e 69 52 69 67   && pWhere->iRig
254b0 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 69 43 75  htJoinTable!=iCu
254c0 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rsor ){.    retu
254d0 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63  rn 0; /* restric
254e0 74 69 6f 6e 20 28 35 29 20 2a 2f 0a 20 20 7d 0a  tion (5) */.  }.
254f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
25500 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
25510 28 70 57 68 65 72 65 2c 20 69 43 75 72 73 6f 72  (pWhere, iCursor
25520 29 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b  ) ){.    nChng++
25530 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 75  ;.    while( pSu
25540 62 71 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73  bq ){.      Subs
25550 74 43 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20  tContext x;.    
25560 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
25570 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
25580 64 62 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a  db, pWhere, 0);.
25590 20 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45        unsetJoinE
255a0 78 70 72 28 70 4e 65 77 2c 20 2d 31 29 3b 0a 20  xpr(pNew, -1);. 
255b0 20 20 20 20 20 78 2e 70 50 61 72 73 65 20 3d 20       x.pParse = 
255c0 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 78 2e  pParse;.      x.
255d0 69 54 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72  iTable = iCursor
255e0 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65 77 54 61  ;.      x.iNewTa
255f0 62 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20  ble = iCursor;. 
25600 20 20 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69       x.isLeftJoi
25610 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 78 2e 70  n = 0;.      x.p
25620 45 4c 69 73 74 20 3d 20 70 53 75 62 71 2d 3e 70  EList = pSubq->p
25630 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4e 65  EList;.      pNe
25640 77 20 3d 20 73 75 62 73 74 45 78 70 72 28 26 78  w = substExpr(&x
25650 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69  , pNew);.      i
25660 66 28 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61  f( pSubq->selFla
25670 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
25680 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 75  e ){.        pSu
25690 62 71 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  bq->pHaving = sq
256a0 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
256b0 72 73 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e  rse->db, pSubq->
256c0 70 48 61 76 69 6e 67 2c 20 70 4e 65 77 29 3b 0a  pHaving, pNew);.
256d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
256e0 20 20 20 20 20 70 53 75 62 71 2d 3e 70 57 68 65       pSubq->pWhe
256f0 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
25700 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  And(pParse->db, 
25710 70 53 75 62 71 2d 3e 70 57 68 65 72 65 2c 20 70  pSubq->pWhere, p
25720 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
25730 20 20 20 20 70 53 75 62 71 20 3d 20 70 53 75 62      pSubq = pSub
25740 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d  q->pPrior;.    }
25750 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43  .  }.  return nC
25760 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  hng;.}.#endif /*
25770 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
25780 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
25790 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
257a0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
257b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 46 75 6e  ../*.** The pFun
257c0 63 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 67  c is the only ag
257d0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
257e0 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20 20   in the query.  
257f0 43 68 65 63 6b 20 74 6f 20 73 65 65 0a 2a 2a 20  Check to see.** 
25800 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  if the query is 
25810 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
25820 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69  the min/max opti
25830 6d 69 7a 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  mization. .**.**
25840 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
25850 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
25860 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74   the min/max opt
25870 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 68 65 6e 20  imization, then 
25880 73 65 74 0a 2a 2a 20 2a 70 70 4d 69 6e 4d 61 78  set.** *ppMinMax
25890 20 74 6f 20 62 65 20 61 6e 20 4f 52 44 45 52 20   to be an ORDER 
258a0 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  BY clause to be 
258b0 75 73 65 64 20 66 6f 72 20 74 68 65 20 6f 70 74  used for the opt
258c0 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64  imization.** and
258d0 20 72 65 74 75 72 6e 20 65 69 74 68 65 72 20 57   return either W
258e0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
258f0 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42   or WHERE_ORDERB
25900 59 5f 4d 41 58 20 64 65 70 65 6e 64 69 6e 67 20  Y_MAX depending 
25910 6f 6e 0a 2a 2a 20 77 68 65 74 68 65 72 20 70 46  on.** whether pF
25920 75 6e 63 20 69 73 20 61 20 6d 69 6e 28 29 20 6f  unc is a min() o
25930 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e  r max() function
25940 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71  ..**.** If the q
25950 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63 61  uery is not a ca
25960 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65 20  ndidate for the 
25970 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61  min/max optimiza
25980 74 69 6f 6e 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  tion, return.** 
25990 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
259a0 52 4d 41 4c 20 28 77 68 69 63 68 20 6d 75 73 74  RMAL (which must
259b0 20 62 65 20 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a   be zero)..**.**
259c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
259d0 73 74 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  st be called aft
259e0 65 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  er aggregate fun
259f0 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
25a00 0a 2a 2a 20 6c 6f 63 61 74 65 64 20 62 75 74 20  .** located but 
25a10 62 65 66 6f 72 65 20 74 68 65 69 72 20 61 72 67  before their arg
25a20 75 6d 65 6e 74 73 20 68 61 76 65 20 62 65 65 6e  uments have been
25a30 20 73 75 62 6a 65 63 74 65 64 20 74 6f 20 61 67   subjected to ag
25a40 67 72 65 67 61 74 65 0a 2a 2a 20 61 6e 61 6c 79  gregate.** analy
25a50 73 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  sis..*/.static u
25a60 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 73 71  8 minMaxQuery(sq
25a70 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
25a80 2a 70 46 75 6e 63 2c 20 45 78 70 72 4c 69 73 74  *pFunc, ExprList
25a90 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20   **ppMinMax){.  
25aa0 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45 52 45  int eRet = WHERE
25ab0 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
25ac0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
25ad0 76 61 6c 75 65 20 2a 2f 0a 20 20 45 78 70 72 4c  value */.  ExprL
25ae0 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 46  ist *pEList = pF
25af0 75 6e 63 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20  unc->x.pList;   
25b00 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f   /* Arguments to
25b10 20 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   agg function */
25b20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
25b30 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Func;           
25b40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
25b50 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 66 75   of aggregate fu
25b60 6e 63 74 69 6f 6e 20 70 46 75 6e 63 20 2a 2f 0a  nction pFunc */.
25b70 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
25b80 65 72 42 79 3b 0a 20 20 75 38 20 73 6f 72 74 4f  erBy;.  u8 sortO
25b90 72 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  rder;..  assert(
25ba0 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 29 3b   *ppMinMax==0 );
25bb0 0a 20 20 61 73 73 65 72 74 28 20 70 46 75 6e 63  .  assert( pFunc
25bc0 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
25bd0 43 54 49 4f 4e 20 29 3b 0a 20 20 69 66 28 20 70  CTION );.  if( p
25be0 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69  EList==0 || pELi
25bf0 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
25c00 65 74 75 72 6e 20 65 52 65 74 3b 0a 20 20 7a 46  eturn eRet;.  zF
25c10 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 75 2e 7a  unc = pFunc->u.z
25c20 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 71 6c  Token;.  if( sql
25c30 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e  ite3StrICmp(zFun
25c40 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a  c, "min")==0 ){.
25c50 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45      eRet = WHERE
25c60 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20  _ORDERBY_MIN;.  
25c70 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51    sortOrder = SQ
25c80 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 0a 20 20 7d  LITE_SO_ASC;.  }
25c90 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
25ca0 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
25cb0 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  max")==0 ){.    
25cc0 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
25cd0 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 73 6f  ERBY_MAX;.    so
25ce0 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45  rtOrder = SQLITE
25cf0 5f 53 4f 5f 44 45 53 43 3b 0a 20 20 7d 65 6c 73  _SO_DESC;.  }els
25d00 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 65 52  e{.    return eR
25d10 65 74 3b 0a 20 20 7d 0a 20 20 2a 70 70 4d 69 6e  et;.  }.  *ppMin
25d20 4d 61 78 20 3d 20 70 4f 72 64 65 72 42 79 20 3d  Max = pOrderBy =
25d30 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
25d40 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20  Dup(db, pEList, 
25d50 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  0);.  assert( pO
25d60 72 64 65 72 42 79 21 3d 30 20 7c 7c 20 64 62 2d  rderBy!=0 || db-
25d70 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
25d80 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
25d90 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d  ) pOrderBy->a[0]
25da0 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73 6f 72  .sortOrder = sor
25db0 74 4f 72 64 65 72 3b 0a 20 20 72 65 74 75 72 6e  tOrder;.  return
25dc0 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   eRet;.}../*.** 
25dd0 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  The select state
25de0 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74  ment passed as t
25df0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
25e00 74 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  t is an aggregat
25e10 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20  e query..** The 
25e20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
25e30 69 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  is the associate
25e40 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f  d aggregate-info
25e50 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a   object. This .*
25e60 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73  * function tests
25e70 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 69   if the SELECT i
25e80 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  s of the form:.*
25e90 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f  *.**   SELECT co
25ea0 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c  unt(*) FROM <tbl
25eb0 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61  >.**.** where ta
25ec0 62 6c 65 20 69 73 20 61 20 64 61 74 61 62 61 73  ble is a databas
25ed0 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73  e table, not a s
25ee0 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65  ub-select or vie
25ef0 77 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 0a  w. If the query.
25f00 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68  ** does match th
25f10 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e  is pattern, then
25f20 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
25f30 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72  e Table object r
25f40 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c  epresenting.** <
25f50 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64  tbl> is returned
25f60 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69  . Otherwise, 0 i
25f70 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
25f80 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53  tatic Table *isS
25f90 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63  impleCount(Selec
25fa0 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70  t *p, AggInfo *p
25fb0 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c  AggInfo){.  Tabl
25fc0 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20  e *pTab;.  Expr 
25fd0 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72  *pExpr;..  asser
25fe0 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20  t( !p->pGroupBy 
25ff0 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68  );..  if( p->pWh
26000 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74  ere || p->pEList
26010 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c  ->nExpr!=1 .   |
26020 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21  | p->pSrc->nSrc!
26030 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61  =1 || p->pSrc->a
26040 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b  [0].pSelect.  ){
26050 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
26060 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70   }.  pTab = p->p
26070 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
26080 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c    pExpr = p->pEL
26090 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
260a0 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20  .  assert( pTab 
260b0 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63  && !pTab->pSelec
260c0 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20  t && pExpr );.. 
260d0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
260e0 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
260f0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
26100 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  !=TK_AGG_FUNCTIO
26110 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
26120 69 66 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e  if( NEVER(pAggIn
26130 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20  fo->nFunc==0) ) 
26140 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
26150 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  (pAggInfo->aFunc
26160 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  [0].pFunc->funcF
26170 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43  lags&SQLITE_FUNC
26180 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74  _COUNT)==0 ) ret
26190 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
261a0 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73  pr->flags&EP_Dis
261b0 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30  tinct ) return 0
261c0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62  ;..  return pTab
261d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
261e0 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74  e source-list it
261f0 65 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  em passed as an 
26200 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67  argument was aug
26210 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a  mented with an.*
26220 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  * INDEXED BY cla
26230 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f  use, then try to
26240 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65 63   locate the spec
26250 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20  ified index. If 
26260 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63  there.** was suc
26270 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74  h a clause and t
26280 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63  he named index c
26290 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20  annot be found, 
262a0 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
262b0 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76  E_ERROR and leav
262c0 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
262d0 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  arse. Otherwise,
262e0 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46   populate .** pF
262f0 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20  rom->pIndex and 
26300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26310 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
26320 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28  IndexedByLookup(
26330 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73  Parse *pParse, s
26340 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
26350 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66  em *pFrom){.  if
26360 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26  ( pFrom->pTab &&
26370 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64   pFrom->fg.isInd
26380 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 54 61  exedBy ){.    Ta
26390 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
263a0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61  m->pTab;.    cha
263b0 72 20 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d 20  r *zIndexedBy = 
263c0 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pFrom->u1.zIndex
263d0 65 64 42 79 3b 0a 20 20 20 20 49 6e 64 65 78 20  edBy;.    Index 
263e0 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
263f0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
26400 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  ; .        pIdx 
26410 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
26420 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pIdx->zName, z
26430 49 6e 64 65 78 65 64 42 79 29 3b 20 0a 20 20 20  IndexedBy); .   
26440 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e       pIdx=pIdx->
26450 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20  pNext.    );.   
26460 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20   if( !pIdx ){.  
26470 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
26480 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
26490 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c  such index: %s",
264a0 20 7a 49 6e 64 65 78 65 64 42 79 2c 20 30 29 3b   zIndexedBy, 0);
264b0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
264c0 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
264d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
264e0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
264f0 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49  .    pFrom->pIBI
26500 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d  ndex = pIdx;.  }
26510 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
26520 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74  _OK;.}./*.** Det
26530 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ect compound SEL
26540 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
26550 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52  hat use an ORDER
26560 20 42 59 20 63 6c 61 75 73 65 20 77 69 74 68 20   BY clause with 
26570 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  .** an alternati
26580 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ve collating seq
26590 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  uence..**.**    
265a0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
265b0 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  t1 EXCEPT SELECT
265c0 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44   ... FROM t2 ORD
265d0 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45  ER BY .. COLLATE
265e0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65   ....**.** These
265f0 20 61 72 65 20 72 65 77 72 69 74 74 65 6e 20 61   are rewritten a
26600 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a  s a subquery:.**
26610 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
26620 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
26630 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20   FROM t1 EXCEPT 
26640 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
26650 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52  t2).**     ORDER
26660 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20   BY ... COLLATE 
26670 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74  ....**.** This t
26680 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
26690 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
266a0 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65  se the multiSele
266b0 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74  ctOrderBy() rout
266c0 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61  ine.** above tha
266d0 74 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  t generates the 
266e0 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f  code for a compo
266f0 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68 20  und SELECT with 
26700 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
26710 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72  se.** uses a mer
26720 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61  ge algorithm tha
26730 74 20 72 65 71 75 69 72 65 73 20 74 68 65 20 73  t requires the s
26740 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ame collating se
26750 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a  quence on the.**
26760 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
26770 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20  as on the ORDER 
26780 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20  BY clause.  See 
26790 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f  ticket.** http:/
267a0 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f  /www.sqlite.org/
267b0 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34  src/info/6709574
267c0 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74  d2a.**.** This t
267d0 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
267e0 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72   only needed for
267f0 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45   EXCEPT, INTERSE
26800 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a  CT, and UNION..*
26810 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20  * The UNION ALL 
26820 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66  operator works f
26830 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65  ine with multiSe
26840 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 65 76  lectOrderBy() ev
26850 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65  en when.** there
26860 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72   are COLLATE ter
26870 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
26880 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  BY..*/.static in
26890 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e  t convertCompoun
268a0 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72  dSelectToSubquer
268b0 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  y(Walker *pWalke
268c0 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
268d0 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74   int i;.  Select
268e0 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
268f0 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20   *pX;.  sqlite3 
26900 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78  *db;.  struct Ex
26910 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
26920 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53    SrcList *pNewS
26930 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rc;.  Parse *pPa
26940 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d  rse;.  Token dum
26950 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50  my;..  if( p->pP
26960 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  rior==0 ) return
26970 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
26980 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
26990 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
269a0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72  _Continue;.  for
269b0 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58  (pX=p; pX && (pX
269c0 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
269d0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pX->op==TK_SELEC
269e0 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f  T); pX=pX->pPrio
269f0 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30  r){}.  if( pX==0
26a00 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
26a10 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d  ntinue;.  a = p-
26a20 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20  >pOrderBy->a;.  
26a30 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42  for(i=p->pOrderB
26a40 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30  y->nExpr-1; i>=0
26a50 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20  ; i--){.    if( 
26a60 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67  a[i].pExpr->flag
26a70 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
26a80 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
26a90 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57  ( i<0 ) return W
26aa0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20  RC_Continue;..  
26ab0 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
26ac0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20  his point, that 
26ad0 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66  means the transf
26ae0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75  ormation is requ
26af0 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72  ired. */..  pPar
26b00 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
26b10 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61  arse;.  db = pPa
26b20 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20  rse->db;.  pNew 
26b30 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
26b40 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
26b50 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
26b60 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
26b70 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d  n WRC_Abort;.  m
26b80 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c  emset(&dummy, 0,
26b90 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b   sizeof(dummy));
26ba0 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c  .  pNewSrc = sql
26bb0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
26bc0 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65  dFromTerm(pParse
26bd0 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e  ,0,0,0,&dummy,pN
26be0 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70  ew,0,0);.  if( p
26bf0 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75  NewSrc==0 ) retu
26c00 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
26c10 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d  *pNew = *p;.  p-
26c20 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b  >pSrc = pNewSrc;
26c30 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73  .  p->pEList = s
26c40 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
26c50 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
26c60 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
26c70 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30 29 29  TK_ASTERISK, 0))
26c80 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53  ;.  p->op = TK_S
26c90 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65  ELECT;.  p->pWhe
26ca0 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  re = 0;.  pNew->
26cb0 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20  pGroupBy = 0;.  
26cc0 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
26cd0 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  0;.  pNew->pOrde
26ce0 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50  rBy = 0;.  p->pP
26cf0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rior = 0;.  p->p
26d00 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  Next = 0;.  p->p
26d10 57 69 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73  With = 0;.  p->s
26d20 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43  elFlags &= ~SF_C
26d30 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72  ompound;.  asser
26d40 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
26d50 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d  & SF_Converted)=
26d60 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c  =0 );.  p->selFl
26d70 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72  ags |= SF_Conver
26d80 74 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ted;.  assert( p
26d90 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29  New->pPrior!=0 )
26da0 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
26db0 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a  ->pNext = pNew;.
26dc0 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d    pNew->pLimit =
26dd0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43   0;.  return WRC
26de0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
26df0 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
26e00 20 69 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   if the FROM cla
26e10 75 73 65 20 74 65 72 6d 20 70 46 72 6f 6d 20 68  use term pFrom h
26e20 61 73 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20  as table-valued 
26e30 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 67 75  function.** argu
26e40 6d 65 6e 74 73 2e 20 20 49 66 20 69 74 20 64 6f  ments.  If it do
26e50 65 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  es, leave an err
26e60 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
26e70 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a  arse and return.
26e80 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e  ** non-zero, sin
26e90 63 65 20 70 46 72 6f 6d 20 69 73 20 6e 6f 74 20  ce pFrom is not 
26ea0 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 20  allowed to be a 
26eb0 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e  table-valued fun
26ec0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
26ed0 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65 46 75 6e   int cannotBeFun
26ee0 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
26ef0 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c  rse, struct SrcL
26f00 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29  ist_item *pFrom)
26f10 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66  {.  if( pFrom->f
26f20 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20  g.isTabFunc ){. 
26f30 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
26f40 73 67 28 70 50 61 72 73 65 2c 20 22 27 25 73 27  sg(pParse, "'%s'
26f50 20 69 73 20 6e 6f 74 20 61 20 66 75 6e 63 74 69   is not a functi
26f60 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d  on", pFrom->zNam
26f70 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
26f80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
26f90 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
26fa0 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a  ITE_OMIT_CTE./*.
26fb0 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 57 69 74  ** Argument pWit
26fc0 68 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20  h (which may be 
26fd0 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20  NULL) points to 
26fe0 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  a linked list of
26ff0 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49 54 48   nested .** WITH
27000 20 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20   contexts, from 
27010 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f  inner to outermo
27020 73 74 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  st. If the table
27030 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a   identified by .
27040 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  ** FROM clause e
27050 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20 69 73 20  lement pItem is 
27060 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d  really a common-
27070 74 61 62 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e  table-expression
27080 20 28 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20   (CTE) .** then 
27090 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
270a0 20 74 6f 20 74 68 65 20 43 54 45 20 64 65 66 69   to the CTE defi
270b0 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20  nition for that 
270c0 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65  table. Otherwise
270d0 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  .** return NULL.
270e0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d  .**.** If a non-
270f0 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65  NULL value is re
27100 74 75 72 6e 65 64 2c 20 73 65 74 20 2a 70 70 43  turned, set *ppC
27110 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e 74 20  ontext to point 
27120 74 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f  to the With.** o
27130 62 6a 65 63 74 20 74 68 61 74 20 74 68 65 20 72  bject that the r
27140 65 74 75 72 6e 65 64 20 43 54 45 20 62 65 6c 6f  eturned CTE belo
27150 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69  ngs to..*/.stati
27160 63 20 73 74 72 75 63 74 20 43 74 65 20 2a 73 65  c struct Cte *se
27170 61 72 63 68 57 69 74 68 28 0a 20 20 57 69 74 68  archWith(.  With
27180 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20   *pWith,        
27190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
271a0 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d 6f 73 74  urrent innermost
271b0 20 57 49 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a   WITH clause */.
271c0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
271d0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20  _item *pItem,   
271e0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
271f0 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f   element to reso
27200 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a  lve */.  With **
27210 70 70 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20  ppContext       
27220 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
27230 20 57 49 54 48 20 63 6c 61 75 73 65 20 72 65 74   WITH clause ret
27240 75 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67  urn value belong
27250 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  s to */.){.  con
27260 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
27270 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61    if( pItem->zDa
27280 74 61 62 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e  tabase==0 && (zN
27290 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61  ame = pItem->zNa
272a0 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 57 69  me)!=0 ){.    Wi
272b0 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  th *p;.    for(p
272c0 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e  =pWith; p; p=p->
272d0 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69  pOuter){.      i
272e0 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
272f0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20  i=0; i<p->nCte; 
27300 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
27310 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
27320 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e  (zName, p->a[i].
27330 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
27340 20 20 20 20 20 20 20 2a 70 70 43 6f 6e 74 65 78         *ppContex
27350 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  t = p;.         
27360 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d   return &p->a[i]
27370 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27380 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
27390 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20  return 0;.}../* 
273a0 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
273b0 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 73  or maintains a s
273c0 74 61 63 6b 20 6f 66 20 61 63 74 69 76 65 20 57  tack of active W
273d0 49 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77  ITH clauses.** w
273e0 69 74 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f  ith the inner-mo
273f0 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 62  st WITH clause b
27400 65 69 6e 67 20 61 74 20 74 68 65 20 74 6f 70 20  eing at the top 
27410 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  of the stack..**
27420 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
27430 20 70 75 73 68 65 73 20 74 68 65 20 57 49 54 48   pushes the WITH
27440 20 63 6c 61 75 73 65 20 70 61 73 73 65 64 20 61   clause passed a
27450 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
27460 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68  ument.** onto th
27470 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
27480 63 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20  ck. If argument 
27490 62 46 72 65 65 20 69 73 20 74 72 75 65 2c 20 74  bFree is true, t
274a0 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54 48  hen this.** WITH
274b0 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65 76   clause will nev
274c0 65 72 20 62 65 20 70 6f 70 70 65 64 20 66 72 6f  er be popped fro
274d0 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 49 6e 20  m the stack. In 
274e0 74 68 69 73 20 63 61 73 65 20 69 74 0a 2a 2a 20  this case it.** 
274f0 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20  should be freed 
27500 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 50  along with the P
27510 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20  arse object. In 
27520 6f 74 68 65 72 20 63 61 73 65 73 2c 20 77 68 65  other cases, whe
27530 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74  n.** bFree==0, t
27540 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20 77  he With object w
27550 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61 6c 6f  ill be freed alo
27560 6e 67 20 77 69 74 68 20 74 68 65 20 53 45 4c 45  ng with the SELE
27570 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  CT .** statement
27580 20 77 69 74 68 20 77 68 69 63 68 20 69 74 20 69   with which it i
27590 73 20 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f  s associated..*/
275a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74  .void sqlite3Wit
275b0 68 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61  hPush(Parse *pPa
275c0 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68  rse, With *pWith
275d0 2c 20 75 38 20 62 46 72 65 65 29 7b 0a 20 20 61  , u8 bFree){.  a
275e0 73 73 65 72 74 28 20 62 46 72 65 65 3d 3d 30 20  ssert( bFree==0 
275f0 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70 57 69 74  || (pParse->pWit
27600 68 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  h==0 && pParse->
27610 70 57 69 74 68 54 6f 46 72 65 65 3d 3d 30 29 20  pWithToFree==0) 
27620 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29  );.  if( pWith )
27630 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
27640 61 72 73 65 2d 3e 70 57 69 74 68 21 3d 70 57 69  arse->pWith!=pWi
27650 74 68 20 29 3b 0a 20 20 20 20 70 57 69 74 68 2d  th );.    pWith-
27660 3e 70 4f 75 74 65 72 20 3d 20 70 50 61 72 73 65  >pOuter = pParse
27670 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61  ->pWith;.    pPa
27680 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
27690 74 68 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65  th;.    if( bFre
276a0 65 20 29 20 70 50 61 72 73 65 2d 3e 70 57 69 74  e ) pParse->pWit
276b0 68 54 6f 46 72 65 65 20 3d 20 70 57 69 74 68 3b  hToFree = pWith;
276c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
276d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63  is function chec
276e0 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20 70  ks if argument p
276f0 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20 61  From refers to a
27700 20 43 54 45 20 64 65 63 6c 61 72 65 64 20 62 79   CTE declared by
27710 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61 75   .** a WITH clau
27720 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20  se on the stack 
27730 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61  currently mainta
27740 69 6e 65 64 20 62 79 20 74 68 65 20 70 61 72 73  ined by the pars
27750 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63  er. And,.** if c
27760 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73  urrently process
27770 69 6e 67 20 61 20 43 54 45 20 65 78 70 72 65 73  ing a CTE expres
27780 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 61  sion, if it is a
27790 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72 65   recursive.** re
277a0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
277b0 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a  urrent CTE..**.*
277c0 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73  * If pFrom falls
277d0 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66 20   into either of 
277e0 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72 69  the two categori
277f0 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d  es above, pFrom-
27800 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68  >pTab.** and oth
27810 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 70 6f  er fields are po
27820 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69 6e  pulated accordin
27830 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  gly. The caller 
27840 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20  should check.** 
27850 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29  (pFrom->pTab!=0)
27860 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
27870 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73  ether or not a s
27880 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68 0a  uccessful match.
27890 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a  ** was found..**
278a0 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
278b0 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f  ot a match is fo
278c0 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  und, SQLITE_OK i
278d0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
278e0 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73   error.** occurs
278f0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f  . If an error do
27900 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72  es occur, an err
27910 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 74  or message is st
27920 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70  ored in the.** p
27930 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20 65  arser and some e
27940 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20  rror code other 
27950 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72  than SQLITE_OK r
27960 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
27970 69 63 20 69 6e 74 20 77 69 74 68 45 78 70 61 6e  ic int withExpan
27980 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57 61  d(.  Walker *pWa
27990 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74 20  lker, .  struct 
279a0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
279b0 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a  rom.){.  Parse *
279c0 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
279d0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  ->pParse;.  sqli
279e0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
279f0 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20 43  ->db;.  struct C
27a00 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20 20  te *pCte;       
27a10 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68          /* Match
27a20 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20  ed CTE (or NULL 
27a30 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a  if no match) */.
27a40 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20 20    With *pWith;  
27a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a60 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73 65    /* WITH clause
27a70 20 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f 6e   that pCte belon
27a80 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65  gs to */..  asse
27a90 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
27aa0 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20  =0 );..  pCte = 
27ab0 73 65 61 72 63 68 57 69 74 68 28 70 50 61 72 73  searchWith(pPars
27ac0 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c  e->pWith, pFrom,
27ad0 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28 20   &pWith);.  if( 
27ae0 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62 6c  pCte ){.    Tabl
27af0 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78 70  e *pTab;.    Exp
27b00 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
27b10 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b     Select *pSel;
27b20 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 65  .    Select *pLe
27b30 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ft;             
27b40 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20     /* Left-most 
27b50 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
27b60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61 79   */.    int bMay
27b70 52 65 63 75 72 73 69 76 65 3b 20 20 20 20 20 20  Recursive;      
27b80 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
27b90 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64   compound joined
27ba0 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20   by UNION [ALL] 
27bb0 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53 61  */.    With *pSa
27bc0 76 65 64 57 69 74 68 3b 20 20 20 20 20 20 20 20  vedWith;        
27bd0 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
27be0 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d  value of pParse-
27bf0 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f  >pWith */..    /
27c00 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45  * If pCte->zCteE
27c10 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  rr is non-NULL a
27c20 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  t this point, th
27c30 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20 69 6c  en this is an il
27c40 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63  legal.    ** rec
27c50 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
27c60 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20 4c 65   to CTE pCte. Le
27c70 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
27c80 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
27c90 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20  n.    ** early. 
27ca0 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72  If pCte->zCteErr
27cb0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
27cc0 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63  his is not a rec
27cd0 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
27ce0 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73  ..    ** In this
27cf0 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20   case, proceed. 
27d00 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65   */.    if( pCte
27d10 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a 20 20 20  ->zCteErr ){.   
27d20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
27d30 73 67 28 70 50 61 72 73 65 2c 20 70 43 74 65 2d  sg(pParse, pCte-
27d40 3e 7a 43 74 65 45 72 72 2c 20 70 43 74 65 2d 3e  >zCteErr, pCte->
27d50 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
27d60 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
27d70 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
27d80 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f   cannotBeFunctio
27d90 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29  n(pParse, pFrom)
27da0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
27db0 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20 61 73 73  _ERROR;..    ass
27dc0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
27dd0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d  ==0 );.    pFrom
27de0 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
27df0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
27e00 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
27e10 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20  able));.    if( 
27e20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
27e30 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
27e40 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20  pTab->nTabRef = 
27e50 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61  1;.    pTab->zNa
27e60 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
27e70 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a  rDup(db, pCte->z
27e80 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d  Name);.    pTab-
27e90 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
27ea0 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
27eb0 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
27ec0 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
27ed0 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
27ee0 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
27ef0 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72  gs |= TF_Ephemer
27f00 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c  al | TF_NoVisibl
27f10 65 52 6f 77 69 64 3b 0a 20 20 20 20 70 46 72 6f  eRowid;.    pFro
27f20 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
27f30 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
27f40 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c  , pCte->pSelect,
27f50 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d   0);.    if( db-
27f60 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
27f70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
27f80 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  MEM_BKPT;.    as
27f90 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
27fa0 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  lect );..    /* 
27fb0 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73  Check if this is
27fc0 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
27fd0 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20  . */.    pSel = 
27fe0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
27ff0 20 20 20 20 62 4d 61 79 52 65 63 75 72 73 69 76      bMayRecursiv
28000 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d  e = ( pSel->op==
28010 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e  TK_ALL || pSel->
28020 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
28030 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75      if( bMayRecu
28040 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
28050 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c  nt i;.      SrcL
28060 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f  ist *pSrc = pFro
28070 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
28080 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
28090 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
280a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ++){.        str
280b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
280c0 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d   *pItem = &pSrc-
280d0 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  >a[i];.        i
280e0 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  f( pItem->zDatab
280f0 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ase==0 .        
28100 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65   && pItem->zName
28110 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  !=0 .         &&
28120 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
28130 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  mp(pItem->zName,
28140 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20   pCte->zName).  
28150 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
28160 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
28170 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20   = pTab;.       
28180 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 52     pItem->fg.isR
28190 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20  ecursive = 1;.  
281a0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54          pTab->nT
281b0 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  abRef++;.       
281c0 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67     pSel->selFlag
281d0 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76  s |= SF_Recursiv
281e0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
281f0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
28200 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75  /* Only one recu
28210 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20  rsive reference 
28220 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f  is permitted. */
28230 20 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e   .    if( pTab->
28240 6e 54 61 62 52 65 66 3e 32 20 29 7b 0a 20 20 20  nTabRef>2 ){.   
28250 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
28260 73 67 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  sg(.          pP
28270 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20  arse, "multiple 
28280 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65  references to re
28290 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25  cursive table: %
282a0 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a  s", pCte->zName.
282b0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
282c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
282d0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  OR;.    }.    as
282e0 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 54 61 62  sert( pTab->nTab
282f0 52 65 66 3d 3d 31 20 7c 7c 20 0a 20 20 20 20 20  Ref==1 || .     
28300 20 20 20 20 20 20 20 28 28 70 53 65 6c 2d 3e 73         ((pSel->s
28310 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72  elFlags&SF_Recur
28320 73 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e  sive) && pTab->n
28330 54 61 62 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20  TabRef==2 ));.. 
28340 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72     pCte->zCteErr
28350 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65 66   = "circular ref
28360 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20  erence: %s";.   
28370 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70 50   pSavedWith = pP
28380 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20  arse->pWith;.   
28390 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
283a0 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20   pWith;.    if( 
283b0 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b  bMayRecursive ){
283c0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
283d0 50 72 69 6f 72 20 3d 20 70 53 65 6c 2d 3e 70 50  Prior = pSel->pP
283e0 72 69 6f 72 3b 0a 20 20 20 20 20 20 61 73 73 65  rior;.      asse
283f0 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 57 69 74  rt( pPrior->pWit
28400 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  h==0 );.      pP
28410 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 70 53  rior->pWith = pS
28420 65 6c 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 20  el->pWith;.     
28430 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
28440 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 50 72 69  ct(pWalker, pPri
28450 6f 72 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  or);.      pPrio
28460 72 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20  r->pWith = 0;.  
28470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
28480 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
28490 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b  (pWalker, pSel);
284a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
284b0 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
284c0 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74  ;..    for(pLeft
284d0 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50  =pSel; pLeft->pP
284e0 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66  rior; pLeft=pLef
284f0 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20  t->pPrior);.    
28500 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e  pEList = pLeft->
28510 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20  pEList;.    if( 
28520 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20  pCte->pCols ){. 
28530 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20       if( pEList 
28540 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
28550 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e  !=pCte->pCols->n
28560 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
28570 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
28580 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
28590 73 20 68 61 73 20 25 64 20 76 61 6c 75 65 73 20  s has %d values 
285a0 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c  for %d columns",
285b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 74  .            pCt
285c0 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74  e->zName, pEList
285d0 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70  ->nExpr, pCte->p
285e0 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20  Cols->nExpr.    
285f0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70      );.        p
28600 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
28610 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20  SavedWith;.     
28620 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28630 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
28640 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
28650 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20  Cte->pCols;.    
28660 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  }..    sqlite3Co
28670 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
28680 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  t(pParse, pEList
28690 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
286a0 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
286b0 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
286c0 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ve ){.      if( 
286d0 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSel->selFlags &
286e0 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b   SF_Recursive ){
286f0 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a  .        pCte->z
28700 43 74 65 45 72 72 20 3d 20 22 6d 75 6c 74 69 70  CteErr = "multip
28710 6c 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66  le recursive ref
28720 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20  erences: %s";.  
28730 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28740 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72     pCte->zCteErr
28750 20 3d 20 22 72 65 63 75 72 73 69 76 65 20 72 65   = "recursive re
28760 66 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62  ference in a sub
28770 71 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20  query: %s";.    
28780 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
28790 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
287a0 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ker, pSel);.    
287b0 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65  }.    pCte->zCte
287c0 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Err = 0;.    pPa
287d0 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61  rse->pWith = pSa
287e0 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20  vedWith;.  }..  
287f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28800 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
28810 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28820 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  CTE./*.** If the
28830 20 53 45 4c 45 43 54 20 70 61 73 73 65 64 20 61   SELECT passed a
28840 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
28850 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73  ument has an ass
28860 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a  ociated WITH .**
28870 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20   clause, pop it 
28880 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73  from the stack s
28890 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
288a0 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
288b0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  t..**.** This fu
288c0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61  nction is used a
288d0 73 20 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c  s the xSelectCal
288e0 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63  lback2() callbac
288f0 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53  k by.** sqlite3S
28900 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 68  electExpand() wh
28910 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c  en walking a SEL
28920 45 43 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f  ECT tree to reso
28930 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d  lve table.** nam
28940 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f  es and other FRO
28950 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
28960 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s. .*/.static vo
28970 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68  id selectPopWith
28980 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
28990 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
289a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
289b0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
289c0 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57  .  if( OK_IF_ALW
289d0 41 59 53 5f 54 52 55 45 28 70 50 61 72 73 65 2d  AYS_TRUE(pParse-
289e0 3e 70 57 69 74 68 29 20 26 26 20 70 2d 3e 70 50  >pWith) && p->pP
289f0 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 57  rior==0 ){.    W
28a00 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e  ith *pWith = fin
28a10 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70  dRightmost(p)->p
28a20 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 70 57  With;.    if( pW
28a30 69 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ith!=0 ){.      
28a40 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
28a50 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a  pWith==pWith );.
28a60 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57        pParse->pW
28a70 69 74 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75  ith = pWith->pOu
28a80 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ter;.    }.  }.}
28a90 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73  .#else.#define s
28aa0 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23  electPopWith 0.#
28ab0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
28ac0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57  s routine is a W
28ad0 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66  alker callback f
28ae0 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61  or "expanding" a
28af0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
28b00 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67  t..** "Expanding
28b10 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68  " means to do th
28b20 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
28b30 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20  **    (1)  Make 
28b40 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72  sure VDBE cursor
28b50 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
28b60 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  en assigned to e
28b70 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  very.**         
28b80 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46  element of the F
28b90 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
28ba0 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69  *    (2)  Fill i
28bb0 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e  n the pTabList->
28bc0 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20  a[].pTab fields 
28bd0 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  in the SrcList t
28be0 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  hat .**         
28bf0 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61  defines FROM cla
28c00 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73  use.  When views
28c10 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
28c20 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20  ROM clause,.**  
28c30 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62         fill pTab
28c40 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63  List->a[].pSelec
28c50 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  t with a copy of
28c60 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
28c70 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
28c80 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
28c90 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f   the view.  A co
28ca0 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68  py is made of th
28cb0 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a  e view's SELECT.
28cc0 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65  **         state
28cd0 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20  ment so that we 
28ce0 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66  can freely modif
28cf0 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74  y or delete that
28d00 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
28d10 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f        without wo
28d20 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73  rrying about mes
28d30 73 69 6e 67 20 75 70 20 74 68 65 20 70 65 72 73  sing up the pers
28d40 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74  istent represent
28d50 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20  ation.**        
28d60 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a   of the view..**
28d70 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20  .**    (3)  Add 
28d80 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45  terms to the WHE
28d90 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63  RE clause to acc
28da0 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54  ommodate the NAT
28db0 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20  URAL keyword.** 
28dc0 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73          on joins
28dd0 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20   and the ON and 
28de0 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
28df0 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  joins..**.**    
28e00 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69  (4)  Scan the li
28e10 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  st of columns in
28e20 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
28e30 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67  (pEList) looking
28e40 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20  .**         for 
28e50 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
28e60 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72   "*" operator or
28e70 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65   the TABLE.* ope
28e80 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20  rator..**       
28e90 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61    If found, expa
28ea0 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62  nd each "*" to b
28eb0 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
28ec0 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a  n every table.**
28ed0 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42           and TAB
28ee0 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79  LE.* to be every
28ef0 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45   column in TABLE
28f00 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ..**.*/.static i
28f10 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65  nt selectExpande
28f20 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  r(Walker *pWalke
28f30 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
28f40 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
28f50 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
28f60 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  ;.  int i, j, k;
28f70 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
28f80 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74  List;.  ExprList
28f90 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75   *pEList;.  stru
28fa0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
28fb0 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65  *pFrom;.  sqlite
28fc0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
28fd0 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20  db;.  Expr *pE, 
28fe0 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b  *pRight, *pExpr;
28ff0 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20  .  u16 selFlags 
29000 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 20  = p->selFlags;. 
29010 20 75 33 32 20 65 6c 69 73 74 46 6c 61 67 73 20   u32 elistFlags 
29020 3d 20 30 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c  = 0;..  p->selFl
29030 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64  ags |= SF_Expand
29040 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ed;.  if( db->ma
29050 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20  llocFailed  ){. 
29060 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
29070 6f 72 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ort;.  }.  asser
29080 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b  t( p->pSrc!=0 );
29090 0a 20 20 69 66 28 20 28 73 65 6c 46 6c 61 67 73  .  if( (selFlags
290a0 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21   & SF_Expanded)!
290b0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
290c0 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a   WRC_Prune;.  }.
290d0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
290e0 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
290f0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 73 71   p->pEList;.  sq
29100 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 70 50  lite3WithPush(pP
29110 61 72 73 65 2c 20 70 2d 3e 70 57 69 74 68 2c 20  arse, p->pWith, 
29120 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  0);..  /* Make s
29130 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ure cursor numbe
29140 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
29150 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74  igned to all ent
29160 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65  ries in.  ** the
29170 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
29180 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
29190 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ment..  */.  sql
291a0 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
291b0 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
291c0 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f   pTabList);..  /
291d0 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20  * Look up every 
291e0 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74  table named in t
291f0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
29200 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49  f the select.  I
29210 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20  f.  ** an entry 
29220 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
29230 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79  se is a subquery
29240 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61   instead of a ta
29250 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a  ble or view,.  *
29260 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  * then create a 
29270 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
29280 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73  structure to des
29290 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65  cribe the subque
292a0 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ry..  */.  for(i
292b0 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
292c0 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
292d0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
292e0 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  rom++){.    Tabl
292f0 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73 73  e *pTab;.    ass
29300 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69  ert( pFrom->fg.i
29310 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c  sRecursive==0 ||
29320 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20   pFrom->pTab!=0 
29330 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  );.    if( pFrom
29340 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ->fg.isRecursive
29350 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
29360 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
29370 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66 6e 64  pTab==0 );.#ifnd
29380 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
29390 54 45 0a 20 20 20 20 69 66 28 20 77 69 74 68 45  TE.    if( withE
293a0 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70  xpand(pWalker, p
293b0 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57  From) ) return W
293c0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66  RC_Abort;.    if
293d0 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20  ( pFrom->pTab ) 
293e0 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20  {} else.#endif. 
293f0 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e     if( pFrom->zN
29400 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  ame==0 ){.#ifnde
29410 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
29420 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c  BQUERY.      Sel
29430 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
29440 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
29450 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
29460 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
29470 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
29480 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
29490 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20   pSel!=0 );.    
294a0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
294b0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
294c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 61 6c    if( sqlite3Wal
294d0 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
294e0 20 70 53 65 6c 29 20 29 20 72 65 74 75 72 6e 20   pSel) ) return 
294f0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
29500 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
29510 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
29520 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
29530 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
29540 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
29550 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
29560 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  rt;.      pTab->
29570 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 20  nTabRef = 1;.   
29580 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41     if( pFrom->zA
29590 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lias ){.        
295a0 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pTab->zName = sq
295b0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
295c0 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 29  , pFrom->zAlias)
295d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
295e0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
295f0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
29600 6e 74 66 28 64 62 2c 20 22 73 75 62 71 75 65 72  ntf(db, "subquer
29610 79 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29 70 54  y_%p", (void*)pT
29620 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ab);.      }.   
29630 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e     while( pSel->
29640 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d  pPrior ){ pSel =
29650 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d   pSel->pPrior; }
29660 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
29670 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
29680 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e  t(pParse, pSel->
29690 70 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e 43  pEList,&pTab->nC
296a0 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b  ol,&pTab->aCol);
296b0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  .      pTab->iPK
296c0 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  ey = -1;.      p
296d0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
296e0 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32  = 200; assert( 2
296f0 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  00==sqlite3LogEs
29700 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20  t(1048576) );.  
29710 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
29720 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72  gs |= TF_Ephemer
29730 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  al;.#endif.    }
29740 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
29750 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  n ordinary table
29760 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e   or view name in
29770 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
29780 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
29790 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
297a0 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d   );.      pFrom-
297b0 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
297c0 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
297d0 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c  eItem(pParse, 0,
297e0 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69   pFrom);.      i
297f0 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
29800 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
29810 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e       if( pTab->n
29820 54 61 62 52 65 66 3e 3d 30 78 66 66 66 66 20 29  TabRef>=0xffff )
29830 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
29840 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
29850 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65  , "too many refe
29860 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c 22  rences to \"%s\"
29870 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20 20  : max 65535",.  
29880 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a           pTab->z
29890 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Name);.        p
298a0 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  From->pTab = 0;.
298b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
298c0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
298d0 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54  }.      pTab->nT
298e0 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69  abRef++;.      i
298f0 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  f( !IsVirtual(pT
29900 61 62 29 20 26 26 20 63 61 6e 6e 6f 74 42 65 46  ab) && cannotBeF
29910 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  unction(pParse, 
29920 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20  pFrom) ){.      
29930 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
29940 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20  rt;.      }.#if 
29950 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
29960 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
29970 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f  efined (SQLITE_O
29980 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
29990 29 0a 20 20 20 20 20 20 69 66 28 20 49 73 56 69  ).      if( IsVi
299a0 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20 70  rtual(pTab) || p
299b0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
299c0 20 20 20 20 20 20 20 20 69 31 36 20 6e 43 6f 6c          i16 nCol
299d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
299e0 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
299f0 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
29a00 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57  pTab) ) return W
29a10 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
29a20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
29a30 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20  >pSelect==0 );. 
29a40 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53         pFrom->pS
29a50 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
29a60 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
29a70 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  b->pSelect, 0);.
29a80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
29a90 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 46 72  electSetName(pFr
29aa0 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70 54 61  om->pSelect, pTa
29ab0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
29ac0 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     nCol = pTab->
29ad0 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 54  nCol;.        pT
29ae0 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  ab->nCol = -1;. 
29af0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
29b00 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
29b10 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  , pFrom->pSelect
29b20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  );.        pTab-
29b30 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  >nCol = nCol;.  
29b40 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
29b50 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74   }..    /* Locat
29b60 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  e the index name
29b70 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45 44  d by the INDEXED
29b80 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61   BY clause, if a
29b90 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  ny. */.    if( s
29ba0 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c  qlite3IndexedByL
29bb0 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46  ookup(pParse, pF
29bc0 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65  rom) ){.      re
29bd0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
29be0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
29bf0 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20  Process NATURAL 
29c00 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e  keywords, and ON
29c10 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
29c20 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a  es of joins..  *
29c30 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
29c40 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69  ocFailed || sqli
29c50 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50  teProcessJoin(pP
29c60 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
29c70 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
29c80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20  ;.  }..  /* For 
29c90 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f  every "*" that o
29ca0 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c  ccurs in the col
29cb0 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74  umn list, insert
29cc0 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20   the names of.  
29cd0 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  ** all columns i
29ce0 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41  n all tables.  A
29cf0 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42  nd for every TAB
29d00 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20  LE.* insert the 
29d10 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c  names.  ** of al
29d20 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42  l columns in TAB
29d30 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  LE.  The parser 
29d40 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69  inserted a speci
29d50 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  al expression.  
29d60 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41  ** with the TK_A
29d70 53 54 45 52 49 53 4b 20 6f 70 65 72 61 74 6f 72  STERISK operator
29d80 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68   for each "*" th
29d90 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74  at it found in t
29da0 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c  he column.  ** l
29db0 69 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ist.  The follow
29dc0 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61  ing code just ha
29dd0 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  s to locate the 
29de0 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a 2a  TK_ASTERISK.  **
29df0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
29e00 20 65 78 70 61 6e 64 20 65 61 63 68 20 6f 6e 65   expand each one
29e10 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
29e20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20  all columns in. 
29e30 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a   ** all tables..
29e40 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
29e50 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68  rst loop just ch
29e60 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
29e70 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22  here are any "*"
29e80 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20   operators.  ** 
29e90 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64  that need expand
29ea0 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
29eb0 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
29ec0 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
29ed0 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
29ee0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
29ef0 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45   pE->op==TK_ASTE
29f00 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20  RISK ) break;.  
29f10 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
29f20 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
29f30 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
29f40 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
29f50 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e  =TK_DOT || (pE->
29f60 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e  pLeft!=0 && pE->
29f70 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pLeft->op==TK_ID
29f80 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  ) );.    if( pE-
29f90 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
29fa0 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  E->pRight->op==T
29fb0 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65  K_ASTERISK ) bre
29fc0 61 6b 3b 0a 20 20 20 20 65 6c 69 73 74 46 6c 61  ak;.    elistFla
29fd0 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61 67 73 3b  gs |= pE->flags;
29fe0 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c  .  }.  if( k<pEL
29ff0 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
2a000 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77    /*.    ** If w
2a010 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65  e get here it me
2a020 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  ans the result s
2a030 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  et contains one 
2a040 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20  or more "*".    
2a050 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
2a060 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
2a070 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72  anded.  Loop thr
2a080 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
2a090 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74  sion.    ** in t
2a0a0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
2a0b0 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e  d expand them on
2a0c0 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f  e by one..    */
2a0d0 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
2a0e0 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70  List_item *a = p
2a0f0 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78  EList->a;.    Ex
2a100 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30  prList *pNew = 0
2a110 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  ;.    int flags 
2a120 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  = pParse->db->fl
2a130 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e  ags;.    int lon
2a140 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20  gNames = (flags 
2a150 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
2a160 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20  Names)!=0.      
2a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a180 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  && (flags & SQLI
2a190 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
2a1a0 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b  )==0;..    for(k
2a1b0 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
2a1c0 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  xpr; k++){.     
2a1d0 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72   pE = a[k].pExpr
2a1e0 3b 0a 20 20 20 20 20 20 65 6c 69 73 74 46 6c 61  ;.      elistFla
2a1f0 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61 67 73 3b  gs |= pE->flags;
2a200 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
2a210 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pE->pRight;.    
2a220 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
2a230 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67  !=TK_DOT || pRig
2a240 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ht!=0 );.      i
2a250 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 53  f( pE->op!=TK_AS
2a260 54 45 52 49 53 4b 0a 20 20 20 20 20 20 20 26 26  TERISK.       &&
2a270 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54   (pE->op!=TK_DOT
2a280 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d   || pRight->op!=
2a290 54 4b 5f 41 53 54 45 52 49 53 4b 29 0a 20 20 20  TK_ASTERISK).   
2a2a0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
2a2b0 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   This particular
2a2c0 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
2a2d0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
2a2e0 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20  expanded..      
2a2f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
2a300 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
2a310 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
2a320 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78  , pNew, a[k].pEx
2a330 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
2a340 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
2a350 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
2a360 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20  >nExpr-1].zName 
2a370 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  = a[k].zName;.  
2a380 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
2a390 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
2a3a0 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61  Span = a[k].zSpa
2a3b0 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b  n;.          a[k
2a3c0 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
2a3d0 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61         a[k].zSpa
2a3e0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  n = 0;.        }
2a3f0 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45  .        a[k].pE
2a400 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  xpr = 0;.      }
2a410 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
2a420 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
2a430 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22   is a "*" or a "
2a440 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65  TABLE.*" and nee
2a450 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20  ds to be.       
2a460 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f   ** expanded. */
2a470 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62  .        int tab
2a480 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20  leSeen = 0;     
2a490 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65   /* Set to 1 whe
2a4a0 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20  n TABLE matches 
2a4b0 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
2a4c0 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20  *zTName = 0;    
2a4d0 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61     /* text of na
2a4e0 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20  me of TABLE */. 
2a4f0 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
2a500 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20  p==TK_DOT ){.   
2a510 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2a520 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20  E->pLeft!=0 );. 
2a530 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2a540 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2a550 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f  y(pE->pLeft, EP_
2a560 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
2a570 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
2a580 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f  pE->pLeft->u.zTo
2a590 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ken;.        }. 
2a5a0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20         for(i=0, 
2a5b0 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
2a5c0 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
2a5d0 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
2a5e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61  +){.          Ta
2a5f0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
2a600 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  m->pTab;.       
2a610 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
2a620 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
2a630 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
2a640 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72   *zTabName = pFr
2a650 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  om->zAlias;.    
2a660 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2a670 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20   *zSchemaName = 
2a680 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  0;.          int
2a690 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20   iDb;.          
2a6a0 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
2a6b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
2a6c0 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
2a6d0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
2a6e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
2a6f0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2a700 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  d ) break;.     
2a710 20 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30       if( pSub==0
2a720 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c   || (pSub->selFl
2a730 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46  ags & SF_NestedF
2a740 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rom)==0 ){.     
2a750 20 20 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b         pSub = 0;
2a760 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2a770 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74   zTName && sqlit
2a780 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65  e3StrICmp(zTName
2a790 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29  , zTabName)!=0 )
2a7a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2a7b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2a7c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a7d0 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
2a7e0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
2a7f0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
2a800 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
2a810 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62  SchemaName = iDb
2a820 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44  >=0 ? db->aDb[iD
2a830 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 22 2a  b].zDbSName : "*
2a840 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ";.          }. 
2a850 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
2a860 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
2a870 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
2a880 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
2a890 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
2a8a0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
2a8b0 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b   char *zColname;
2a8c0 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65    /* The compute
2a8d0 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  d column name */
2a8e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
2a8f0 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a  r *zToFree;   /*
2a900 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67   Malloced string
2a910 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
2a920 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20  e freed */.     
2a930 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f         Token sCo
2a940 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75  lname;  /* Compu
2a950 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ted column name 
2a960 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20  as a token */.. 
2a970 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
2a980 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20  t( zName );.    
2a990 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
2a9a0 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20 20 20  me && pSub.     
2a9b0 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
2a9c0 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28  e3MatchSpanName(
2a9d0 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  pSub->pEList->a[
2a9e0 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e  j].zSpan, 0, zTN
2a9f0 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20  ame, 0)==0.     
2aa00 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2aa10 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2aa20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2aa30 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
2aa40 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d  If a column is m
2aa50 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e  arked as 'hidden
2aa60 27 2c 20 6f 6d 69 74 20 69 74 20 66 72 6f 6d 20  ', omit it from 
2aa70 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20  the expanded.   
2aa80 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75           ** resu
2aa90 6c 74 2d 73 65 74 20 6c 69 73 74 20 75 6e 6c 65  lt-set list unle
2aaa0 73 73 20 74 68 65 20 53 45 4c 45 43 54 20 68 61  ss the SELECT ha
2aab0 73 20 74 68 65 20 53 46 5f 49 6e 63 6c 75 64 65  s the SF_Include
2aac0 48 69 64 64 65 6e 0a 20 20 20 20 20 20 20 20 20  Hidden.         
2aad0 20 20 20 2a 2a 20 62 69 74 20 73 65 74 2e 0a 20     ** bit set.. 
2aae0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2aaf0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
2ab00 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2ab10 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 29 3d 3d  IncludeHidden)==
2ab20 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  0.             &
2ab30 26 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e  & IsHiddenColumn
2ab40 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29  (&pTab->aCol[j])
2ab50 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b   .            ){
2ab60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
2ab70 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2ab80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ab90 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31     tableSeen = 1
2aba0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ;..            i
2abb0 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65  f( i>0 && zTName
2abc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2abd0 20 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d       if( (pFrom-
2abe0 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
2abf0 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20  T_NATURAL)!=0.  
2ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
2ac10 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
2ac20 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69  ndex(pTabList, i
2ac30 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20  , zName, 0, 0). 
2ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a               ){.
2ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac60 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20  /* In a NATURAL 
2ac70 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a  join, omit the j
2ac80 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  oin columns from
2ac90 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
2aca0 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74        ** table t
2acb0 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74  o the right of t
2acc0 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20  he join */.     
2acd0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
2ace0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
2acf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2ad00 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64     if( sqlite3Id
2ad10 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d  ListIndex(pFrom-
2ad20 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e  >pUsing, zName)>
2ad30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2ad40 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f        /* In a jo
2ad50 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20  in with a USING 
2ad60 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c  clause, omit col
2ad70 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20  umns in the.    
2ad80 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75              ** u
2ad90 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d  sing clause from
2ada0 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68   the table on th
2adb0 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
2adc0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
2add0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2ade0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2adf0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2ae00 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
2ae10 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
2ae20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
2ae30 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a      zColname = z
2ae40 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
2ae50 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20    zToFree = 0;. 
2ae60 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
2ae70 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62  ongNames || pTab
2ae80 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a  List->nSrc>1 ){.
2ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
2aea0 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr *pLeft;.     
2aeb0 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
2aec0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
2aed0 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65   TK_ID, zTabName
2aee0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2aef0 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
2af00 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2af10 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69  _DOT, pLeft, pRi
2af20 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
2af30 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e      if( zSchemaN
2af40 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
2af50 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
2af60 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
2af70 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d  K_ID, zSchemaNam
2af80 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2af90 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
2afa0 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2afb0 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
2afc0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
2afd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2afe0 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61        if( longNa
2aff0 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mes ){.         
2b000 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20         zColname 
2b010 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
2b020 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54  (db, "%s.%s", zT
2b030 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a  abName, zName);.
2b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b050 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61  zToFree = zColna
2b060 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
2b070 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2b080 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2b090 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69       pExpr = pRi
2b0a0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
2b0b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
2b0c0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
2b0d0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
2b0e0 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29  se, pNew, pExpr)
2b0f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
2b100 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26  lite3TokenInit(&
2b110 73 43 6f 6c 6e 61 6d 65 2c 20 7a 43 6f 6c 6e 61  sColname, zColna
2b120 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
2b130 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2b140 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  SetName(pParse, 
2b150 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c  pNew, &sColname,
2b160 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2b170 20 69 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d   if( pNew && (p-
2b180 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
2b190 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b  estedFrom)!=0 ){
2b1a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
2b1b0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
2b1c0 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d  tem *pX = &pNew-
2b1d0 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
2b1e0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
2b1f0 20 69 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20   if( pSub ){.   
2b200 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
2b210 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
2b220 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 53 75  DbStrDup(db, pSu
2b230 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  b->pEList->a[j].
2b240 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20  zSpan);.        
2b250 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2b260 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29  ( pX->zSpan==0 )
2b270 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2b280 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2b290 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e         pX->zSpan
2b2a0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
2b2b0 66 28 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22  f(db, "%s.%s.%s"
2b2c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63               zSc
2b2f0 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  hemaName, zTabNa
2b300 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20  me, zColname);. 
2b310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2b320 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70  estcase( pX->zSp
2b330 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  an==0 );.       
2b340 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b350 20 20 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e         pX->bSpan
2b360 49 73 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20  IsTab = 1;.     
2b370 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b380 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
2b390 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b  ee(db, zToFree);
2b3a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b3b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2b3c0 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b  f( !tableSeen ){
2b3d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
2b3e0 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  TName ){.       
2b3f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2b400 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
2b410 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22   such table: %s"
2b420 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  , zTName);.     
2b430 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2b440 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2b450 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2b460 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69  "no tables speci
2b470 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  fied");.        
2b480 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2b490 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2b4a0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2b4b0 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74  elete(db, pEList
2b4c0 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74  );.    p->pEList
2b4d0 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 69   = pNew;.  }.  i
2b4e0 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 7b 0a  f( p->pEList ){.
2b4f0 20 20 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73      if( p->pELis
2b500 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69  t->nExpr>db->aLi
2b510 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
2b520 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
2b530 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2b540 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
2b550 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72  any columns in r
2b560 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 20  esult set");.   
2b570 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
2b580 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ort;.    }.    i
2b590 66 28 20 28 65 6c 69 73 74 46 6c 61 67 73 20 26  f( (elistFlags &
2b5a0 20 28 45 50 5f 48 61 73 46 75 6e 63 7c 45 50 5f   (EP_HasFunc|EP_
2b5b0 53 75 62 71 75 65 72 79 29 29 21 3d 30 20 29 7b  Subquery))!=0 ){
2b5c0 0a 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  .      p->selFla
2b5d0 67 73 20 7c 3d 20 53 46 5f 43 6f 6d 70 6c 65 78  gs |= SF_Complex
2b5e0 52 65 73 75 6c 74 3b 0a 20 20 20 20 7d 0a 20 20  Result;.    }.  
2b5f0 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
2b600 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
2b610 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20  * No-op routine 
2b620 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72  for the parse-tr
2b630 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a  ee walker..**.**
2b640 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
2b650 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72  ne is the Walker
2b660 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74  .xExprCallback t
2b670 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  hen expression t
2b680 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b  rees.** are walk
2b690 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61  ed without any a
2b6a0 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b  ctions being tak
2b6b0 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e  en at each node.
2b6c0 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a    Presumably,.**
2b6d0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2b6e0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 57  ne is used for W
2b6f0 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
2b700 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c  ack then .** Wal
2b710 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
2b720 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f  ack is set to do
2b730 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75   something usefu
2b740 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20  l for every .** 
2b750 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20  subquery in the 
2b760 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a  parser tree..*/.
2b770 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 57  int sqlite3ExprW
2b780 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a  alkNoop(Walker *
2b790 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e  NotUsed, Expr *N
2b7a0 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
2b7b0 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
2b7c0 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
2b7d0 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
2b7e0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
2b7f0 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20  * No-op routine 
2b800 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72  for the parse-tr
2b810 65 65 20 77 61 6c 6b 65 72 20 66 6f 72 20 53 45  ee walker for SE
2b820 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
2b830 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20  .** subquery in 
2b840 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65 2e  the parser tree.
2b850 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
2b860 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 28 57 61  electWalkNoop(Wa
2b870 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53  lker *NotUsed, S
2b880 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29  elect *NotUsed2)
2b890 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2b8a0 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
2b8b0 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
2b8c0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2b8d0 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  .}..#if SQLITE_D
2b8e0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 6c 77 61 79  EBUG./*.** Alway
2b8f0 73 20 61 73 73 65 72 74 2e 20 20 54 68 69 73 20  s assert.  This 
2b900 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
2b910 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2b920 70 72 6f 76 65 73 20 74 68 61 74 20 74 68 65 0a  proves that the.
2b930 2a 2a 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  ** xSelectCallba
2b940 63 6b 32 20 69 73 20 6e 65 76 65 72 20 69 6e 76  ck2 is never inv
2b950 6f 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oked..*/.void sq
2b960 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41  lite3SelectWalkA
2b970 73 73 65 72 74 32 28 57 61 6c 6b 65 72 20 2a 4e  ssert2(Walker *N
2b980 6f 74 55 73 65 64 2c 20 53 65 6c 65 63 74 20 2a  otUsed, Select *
2b990 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
2b9a0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
2b9b0 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
2b9c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 20 29  );.  assert( 0 )
2b9d0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a 2a  ;.}.#endif./*.**
2b9e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65   This routine "e
2b9f0 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54  xpands" a SELECT
2ba00 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61   statement and a
2ba10 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75 65  ll of its subque
2ba20 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64  ries..** For add
2ba30 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
2ba40 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d  ion on what it m
2ba50 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22  eans to "expand"
2ba60 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61   a SELECT.** sta
2ba70 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20  tement, see the 
2ba80 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73  comment on the s
2ba90 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b  electExpand work
2baa0 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76  er callback abov
2bab0 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69  e..**.** Expandi
2bac0 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ng a SELECT stat
2bad0 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72  ement is the fir
2bae0 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65  st step in proce
2baf0 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43  ssing a.** SELEC
2bb00 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  T statement.  Th
2bb10 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
2bb20 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e  nt must be expan
2bb30 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61  ded before.** na
2bb40 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73  me resolution is
2bb50 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a   performed..**.*
2bb60 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  * If anything go
2bb70 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72  es wrong, an err
2bb80 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72  or message is wr
2bb90 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73  itten into pPars
2bba0 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  e..** The callin
2bbb0 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64  g function can d
2bbc0 65 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65  etect the proble
2bbd0 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  m by looking at 
2bbe0 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20  pParse->nErr.** 
2bbf0 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64  and/or pParse->d
2bc00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e  b->mallocFailed.
2bc10 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2bc20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
2bc30 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  and(Parse *pPars
2bc40 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
2bc50 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ct){.  Walker w;
2bc60 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
2bc70 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
2bc80 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
2bc90 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
2bca0 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59   if( OK_IF_ALWAY
2bcb0 53 5f 54 52 55 45 28 70 50 61 72 73 65 2d 3e 68  S_TRUE(pParse->h
2bcc0 61 73 43 6f 6d 70 6f 75 6e 64 29 20 29 7b 0a 20  asCompound) ){. 
2bcd0 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c     w.xSelectCall
2bce0 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f  back = convertCo
2bcf0 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75  mpoundSelectToSu
2bd00 62 71 75 65 72 79 3b 0a 20 20 20 20 77 2e 78 53  bquery;.    w.xS
2bd10 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
2bd20 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57   0;.    sqlite3W
2bd30 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
2bd40 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e  elect);.  }.  w.
2bd50 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
2bd60 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  = selectExpander
2bd70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
2bd80 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50  lback2 = selectP
2bd90 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c 69 74 65  opWith;.  sqlite
2bda0 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
2bdb0 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69  pSelect);.}...#i
2bdc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2bdd0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
2bde0 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65   This is a Walke
2bdf0 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
2be00 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74  k callback for t
2be10 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  he sqlite3Select
2be20 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e  TypeInfo().** in
2be30 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46  terface..**.** F
2be40 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61  or each FROM-cla
2be50 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61 64  use subquery, ad
2be60 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61  d Column.zType a
2be70 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a  nd Column.zColl.
2be80 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ** information t
2be90 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  o the Table stru
2bea0 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
2beb0 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
2bec0 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20   set.** of that 
2bed0 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
2bee0 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
2bef0 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
2bf00 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
2bf10 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74  et was construct
2bf20 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45  ed.** by selectE
2bf30 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74 68  xpander() but th
2bf40 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  e type and colla
2bf50 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
2bf60 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20   was omitted.** 
2bf70 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65  at that point be
2bf80 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65 72  cause identifier
2bf90 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65  s had not yet be
2bfa0 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68  en resolved.  Th
2bfb0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
2bfc0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64   called after id
2bfd0 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74  entifier resolut
2bfe0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
2bff0 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53 75 62  oid selectAddSub
2c000 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61  queryTypeInfo(Wa
2c010 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
2c020 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
2c030 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e  se *pParse;.  in
2c040 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  t i;.  SrcList *
2c050 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
2c060 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2c070 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72  *pFrom;..  asser
2c080 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
2c090 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a   SF_Resolved );.
2c0a0 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
2c0b0 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
2c0c0 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 3b 0a 20  ypeInfo)==0 );. 
2c0d0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
2c0e0 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a  SF_HasTypeInfo;.
2c0f0 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
2c100 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 70 54  er->pParse;.  pT
2c110 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
2c120 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  ;.  for(i=0, pFr
2c130 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
2c140 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
2c150 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
2c160 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2c170 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
2c180 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
2c190 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  !=0 );.    if( (
2c1a0 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
2c1b0 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
2c1c0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
2c1d0 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
2c1e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
2c1f0 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
2c200 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
2c210 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
2c220 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 20  .      if( pSel 
2c230 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
2c240 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29  ( pSel->pPrior )
2c250 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
2c260 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 71  rior;.        sq
2c270 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f  lite3SelectAddCo
2c280 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
2c290 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
2c2a0 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20  b, pSel);.      
2c2b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  }.    }.  }.}.#e
2c2c0 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ndif.../*.** Thi
2c2d0 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64  s routine adds d
2c2e0 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  atatype and coll
2c2f0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  ating sequence i
2c300 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a  nformation to.**
2c310 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
2c320 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f  tures of all FRO
2c330 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
2c340 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45  ies in a.** SELE
2c350 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
2c360 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75  .** Use this rou
2c370 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20  tine after name 
2c380 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73  resolution..*/.s
2c390 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
2c3a0 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49  e3SelectAddTypeI
2c3b0 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
2c3c0 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
2c3d0 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ct){.#ifndef SQL
2c3e0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
2c3f0 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  Y.  Walker w;.  
2c400 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2c410 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  k = sqlite3Selec
2c420 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78  tWalkNoop;.  w.x
2c430 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
2c440 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  = selectAddSubqu
2c450 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77  eryTypeInfo;.  w
2c460 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2c470 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
2c480 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Noop;.  w.pParse
2c490 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c   = pParse;.  sql
2c4a0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
2c4b0 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e  w, pSelect);.#en
2c4c0 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  dif.}.../*.** Th
2c4d0 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
2c4e0 75 70 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  up a SELECT stat
2c4f0 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73  ement for proces
2c500 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f  sing.  The.** fo
2c510 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d  llowing is accom
2c520 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  plished:.**.**  
2c530 20 20 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f     *  VDBE Curso
2c540 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73  r numbers are as
2c550 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52  signed to all FR
2c560 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  OM-clause terms.
2c570 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d  .**     *  Ephem
2c580 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63  eral Table objec
2c590 74 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66  ts are created f
2c5a0 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  or all FROM-clau
2c5b0 73 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  se subqueries..*
2c5c0 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20  *     *  ON and 
2c5d0 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72  USING clauses ar
2c5e0 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57  e shifted into W
2c5f0 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a  HERE statements.
2c600 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61  **     *  Wildca
2c610 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42  rds "*" and "TAB
2c620 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20  LE.*" in result 
2c630 73 65 74 73 20 61 72 65 20 65 78 70 61 6e 64 65  sets are expande
2c640 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65  d..**     *  Ide
2c650 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78 70 72  ntifiers in expr
2c660 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68  ession are match
2c670 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a  ed to tables..**
2c680 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2c690 20 61 63 74 73 20 72 65 63 75 72 73 69 76 65 6c   acts recursivel
2c6a0 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72  y on all subquer
2c6b0 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 53  ies within the S
2c6c0 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ELECT..*/.void s
2c6d0 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
2c6e0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2c6f0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
2c700 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
2c710 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
2c720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c730 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
2c740 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
2c750 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  . */.  NameConte
2c760 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a  xt *pOuterNC  /*
2c770 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
2c780 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29  r container */.)
2c790 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
2c7a0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
2c7b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
2c7c0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
2c7d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2c7e0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
2c7f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2c800 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65  HasTypeInfo ) re
2c810 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53  turn;.  sqlite3S
2c820 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61 72  electExpand(pPar
2c830 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50  se, p);.  if( pP
2c840 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50  arse->nErr || pP
2c850 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
2c860 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
2c870 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
2c880 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61  eSelectNames(pPa
2c890 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43  rse, p, pOuterNC
2c8a0 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
2c8b0 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d  >nErr || pParse-
2c8c0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2c8d0 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  d ) return;.  sq
2c8e0 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
2c8f0 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  peInfo(pParse, p
2c900 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65  );.}../*.** Rese
2c910 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  t the aggregate 
2c920 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a  accumulator..**.
2c930 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65  ** The aggregate
2c940 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20   accumulator is 
2c950 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20  a set of memory 
2c960 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a  cells that hold.
2c970 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
2c980 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61  results while ca
2c990 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67  lculating an agg
2c9a0 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a  regate.  This.**
2c9b0 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
2c9c0 65 73 20 63 6f 64 65 20 74 68 61 74 20 73 74 6f  es code that sto
2c9d0 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c  res NULLs in all
2c9e0 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79   of those memory
2c9f0 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74  .** cells..*/.st
2ca00 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41  atic void resetA
2ca10 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
2ca20 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
2ca30 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
2ca40 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
2ca50 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
2ca60 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
2ca70 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a  fo_func *pFunc;.
2ca80 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70 41 67    int nReg = pAg
2ca90 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70  gInfo->nFunc + p
2caa0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
2cab0 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 30 20  ;.  if( nReg==0 
2cac0 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64 65 66  ) return;.#ifdef
2cad0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
2cae0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61  /* Verify that a
2caf0 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67 69 73  ll AggInfo regis
2cb00 74 65 72 73 20 61 72 65 20 77 69 74 68 69 6e 20  ters are within 
2cb10 74 68 65 20 72 61 6e 67 65 20 73 70 65 63 69 66  the range specif
2cb20 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67 67 49  ied by.  ** AggI
2cb30 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e  nfo.mnReg..AggIn
2cb40 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73  fo.mxReg */.  as
2cb50 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41 67 67  sert( nReg==pAgg
2cb60 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67  Info->mxReg-pAgg
2cb70 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b  Info->mnReg+1 );
2cb80 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
2cb90 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
2cba0 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
2cbb0 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  t( pAggInfo->aCo
2cbc0 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49  l[i].iMem>=pAggI
2cbd0 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20  nfo->mnReg.     
2cbe0 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d      && pAggInfo-
2cbf0 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70  >aCol[i].iMem<=p
2cc00 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29  AggInfo->mxReg )
2cc10 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
2cc20 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
2cc30 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  nc; i++){.    as
2cc40 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e  sert( pAggInfo->
2cc50 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70  aFunc[i].iMem>=p
2cc60 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20  AggInfo->mnReg. 
2cc70 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49          && pAggI
2cc80 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d  nfo->aFunc[i].iM
2cc90 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  em<=pAggInfo->mx
2cca0 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Reg );.  }.#endi
2ccb0 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  f.  sqlite3VdbeA
2ccc0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp3(v, OP_Null
2ccd0 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d  , 0, pAggInfo->m
2cce0 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  nReg, pAggInfo->
2ccf0 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28 70 46  mxReg);.  for(pF
2cd00 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46  unc=pAggInfo->aF
2cd10 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67  unc, i=0; i<pAgg
2cd20 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
2cd30 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20  , pFunc++){.    
2cd40 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  if( pFunc->iDist
2cd50 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
2cd60 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e   Expr *pE = pFun
2cd70 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  c->pExpr;.      
2cd80 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2cd90 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
2cda0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
2cdb0 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c      if( pE->x.pL
2cdc0 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e  ist==0 || pE->x.
2cdd0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  pList->nExpr!=1 
2cde0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2cdf0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2ce00 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67 67  e, "DISTINCT agg
2ce10 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61 76  regates must hav
2ce20 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a  e exactly one ".
2ce30 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67 75             "argu
2ce40 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20  ment");.        
2ce50 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
2ce60 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
2ce70 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49  se{.        KeyI
2ce80 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
2ce90 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
2cea0 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e  ist(pParse, pE->
2ceb0 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a  x.pList, 0, 0);.
2cec0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2ced0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2cee0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
2cef0 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c  Func->iDistinct,
2cf00 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
2cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
2cf30 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
2cf40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2cf50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
2cf60 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c   the OP_AggFinal
2cf70 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65  ize opcode for e
2cf80 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66  very aggregate f
2cf90 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  unction.** in th
2cfa0 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74  e AggInfo struct
2cfb0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
2cfc0 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46  oid finalizeAggF
2cfd0 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a  unctions(Parse *
2cfe0 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
2cff0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
2d000 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2d010 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
2d020 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
2d030 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72  _func *pF;.  for
2d040 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
2d050 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
2d060 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
2d070 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70  , pF++){.    Exp
2d080 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
2d090 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  F->pExpr->x.pLis
2d0a0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  t;.    assert( !
2d0b0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2d0c0 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  pF->pExpr, EP_xI
2d0d0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
2d0e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d0f0 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c  2(v, OP_AggFinal
2d100 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73  , pF->iMem, pLis
2d110 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
2d120 20 3a 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74   : 0);.    sqlit
2d130 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
2d140 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  , pF->pFunc, P4_
2d150 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a  FUNCDEF);.  }.}.
2d160 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
2d170 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65  e accumulator me
2d180 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  mory cells for a
2d190 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65  n aggregate base
2d1a0 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72  d on.** the curr
2d1b0 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
2d1c0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
2d1d0 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75  oid updateAccumu
2d1e0 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
2d1f0 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
2d200 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
2d210 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
2d220 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  be;.  int i;.  i
2d230 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20  nt regHit = 0;. 
2d240 20 69 6e 74 20 61 64 64 72 48 69 74 54 65 73 74   int addrHitTest
2d250 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41   = 0;.  struct A
2d260 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
2d270 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
2d280 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41  o_col *pC;..  pA
2d290 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
2d2a0 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d  de = 1;.  for(i=
2d2b0 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
2d2c0 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
2d2d0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
2d2e0 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41  F++){.    int nA
2d2f0 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  rg;.    int addr
2d300 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Next = 0;.    in
2d310 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78  t regAgg;.    Ex
2d320 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
2d330 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
2d340 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
2d350 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2d360 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
2d370 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2d380 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
2d390 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74      nArg = pList
2d3a0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
2d3b0 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47  egAgg = sqlite3G
2d3c0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
2d3d0 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20  se, nArg);.     
2d3e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
2d3f0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
2d400 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20   pList, regAgg, 
2d410 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44  0, SQLITE_ECEL_D
2d420 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  UP);.    }else{.
2d430 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a        nArg = 0;.
2d440 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 30        regAgg = 0
2d450 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d460 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  pF->iDistinct>=0
2d470 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65   ){.      addrNe
2d480 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
2d490 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
2d4a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 41      testcase( nA
2d4b0 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45 72 72  rg==0 );  /* Err
2d4c0 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a  or condition */.
2d4d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2d4e0 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a 20 41  nArg>1 );   /* A
2d4f0 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  lso an error */.
2d500 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e        codeDistin
2d510 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69  ct(pParse, pF->i
2d520 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65  Distinct, addrNe
2d530 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a  xt, 1, regAgg);.
2d540 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
2d550 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ->pFunc->funcFla
2d560 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
2d570 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
2d580 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
2d590 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72  l = 0;.      str
2d5a0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
2d5b0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
2d5c0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73  int j;.      ass
2d5d0 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
2d5e0 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66    /* pList!=0 if
2d5f0 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e   pF->pFunc has N
2d600 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20  EEDCOLL */.     
2d610 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
2d620 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c  pList->a; !pColl
2d630 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c   && j<nArg; j++,
2d640 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2d650 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2d660 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
2d670 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
2d680 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
2d690 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
2d6a0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
2d6b0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
2d6c0 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
2d6d0 20 20 20 20 20 20 69 66 28 20 72 65 67 48 69 74        if( regHit
2d6e0 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d  ==0 && pAggInfo-
2d6f0 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20  >nAccumulator ) 
2d700 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73  regHit = ++pPars
2d710 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
2d720 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2d730 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
2d740 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63  regHit, 0, 0, (c
2d750 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
2d760 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a  COLLSEQ);.    }.
2d770 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2d780 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 53  ddOp3(v, OP_AggS
2d790 74 65 70 30 2c 20 30 2c 20 72 65 67 41 67 67 2c  tep0, 0, regAgg,
2d7a0 20 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20   pF->iMem);.    
2d7b0 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
2d7c0 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63  dP4(v, pF->pFunc
2d7d0 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
2d7e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2d7f0 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41  angeP5(v, (u8)nA
2d800 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
2d810 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
2d820 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
2d830 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20  regAgg, nArg);. 
2d840 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2d850 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
2d860 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29  e, regAgg, nArg)
2d870 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65  ;.    if( addrNe
2d880 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  xt ){.      sqli
2d890 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2d8a0 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29  bel(v, addrNext)
2d8b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2d8c0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
2d8d0 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  arse);.    }.  }
2d8e0 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f  ..  /* Before po
2d8f0 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63  pulating the acc
2d900 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65  umulator registe
2d910 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f  rs, clear the co
2d920 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a  lumn cache..  **
2d930 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
2d940 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75 69 72  ny of the requir
2d950 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73  ed column values
2d960 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 72 65   are already pre
2d970 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65  sent .  ** in re
2d980 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33  gisters, sqlite3
2d990 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75  ExprCode() may u
2d9a0 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63  se OP_SCopy to c
2d9b0 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20  opy the value.  
2d9c0 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20  ** to pC->iMem. 
2d9d0 42 75 74 20 62 79 20 74 68 65 20 74 69 6d 65 20  But by the time 
2d9e0 74 68 65 20 76 61 6c 75 65 20 69 73 20 75 73 65  the value is use
2d9f0 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  d, the original 
2da00 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61  register.  ** ma
2da10 79 20 68 61 76 65 20 62 65 65 6e 20 75 73 65 64  y have been used
2da20 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74  , invalidating t
2da30 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75  he underlying bu
2da40 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65  ffer holding the
2da50 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c  .  ** text or bl
2da60 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69  ob value. See ti
2da70 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63 62 35  cket [883034dcb5
2da80 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f  ]..  **.  ** Ano
2da90 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f  ther solution wo
2daa0 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65  uld be to change
2dab0 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73   the OP_SCopy us
2dac0 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65  ed to copy cache
2dad0 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f  d.  ** values to
2dae0 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a   an OP_Copy..  *
2daf0 2f 0a 20 20 69 66 28 20 72 65 67 48 69 74 20 29  /.  if( regHit )
2db00 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54 65 73  {.    addrHitTes
2db10 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
2db20 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp1(v, OP_If, 
2db30 72 65 67 48 69 74 29 3b 20 56 64 62 65 43 6f 76  regHit); VdbeCov
2db40 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
2db50 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2db60 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
2db70 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67   for(i=0, pC=pAg
2db80 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70  gInfo->aCol; i<p
2db90 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75  AggInfo->nAccumu
2dba0 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b  lator; i++, pC++
2dbb0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
2dbc0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
2dbd0 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d  C->pExpr, pC->iM
2dbe0 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49  em);.  }.  pAggI
2dbf0 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
2dc00 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  = 0;.  sqlite3Ex
2dc10 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2dc20 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72  rse);.  if( addr
2dc30 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73  HitTest ){.    s
2dc40 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2dc50 72 65 28 76 2c 20 61 64 64 72 48 69 74 54 65 73  re(v, addrHitTes
2dc60 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
2dc70 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50   Add a single OP
2dc80 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63  _Explain instruc
2dc90 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45  tion to the VDBE
2dca0 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69   to explain a si
2dcb0 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29  mple.** count(*)
2dcc0 20 71 75 65 72 79 20 28 22 53 45 4c 45 43 54 20   query ("SELECT 
2dcd0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54  count(*) FROM pT
2dce0 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ab")..*/.#ifndef
2dcf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
2dd00 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64  LAIN.static void
2dd10 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f   explainSimpleCo
2dd20 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  unt(.  Parse *pP
2dd30 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
2dd40 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
2dd50 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
2dd60 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
2dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dd80 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72  Table being quer
2dd90 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ied */.  Index *
2dda0 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20  pIdx            
2ddb0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2ddc0 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69  x used to optimi
2ddd0 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c  ze scan, or NULL
2dde0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61   */.){.  if( pPa
2ddf0 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
2de00 29 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f 76 65  ){.    int bCove
2de10 72 20 3d 20 28 70 49 64 78 21 3d 30 20 26 26 20  r = (pIdx!=0 && 
2de20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  (HasRowid(pTab) 
2de30 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79  || !IsPrimaryKey
2de40 49 6e 64 65 78 28 70 49 64 78 29 29 29 3b 0a 20  Index(pIdx)));. 
2de50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 78     sqlite3VdbeEx
2de60 70 6c 61 69 6e 28 70 50 61 72 73 65 2c 20 30 2c  plain(pParse, 0,
2de70 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25   "SCAN TABLE %s%
2de80 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54  s%s",.        pT
2de90 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
2dea0 20 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53     bCover ? " US
2deb0 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  ING COVERING IND
2dec0 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20  EX " : "",.     
2ded0 20 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78     bCover ? pIdx
2dee0 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20  ->zName : "".   
2def0 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   );.  }.}.#else.
2df00 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
2df10 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c  SimpleCount(a,b,
2df20 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  c).#endif../*.**
2df30 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2df40 28 29 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64  () callback used
2df50 20 62 79 20 68 61 76 69 6e 67 54 6f 57 68 65 72   by havingToWher
2df60 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e()..**.** If th
2df70 65 20 6e 6f 64 65 20 70 61 73 73 65 64 20 74 6f  e node passed to
2df80 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 69 73   the callback is
2df90 20 61 20 54 4b 5f 41 4e 44 20 6e 6f 64 65 2c 20   a TK_AND node, 
2dfa0 72 65 74 75 72 6e 20 0a 2a 2a 20 57 52 43 5f 43  return .** WRC_C
2dfb0 6f 6e 74 69 6e 75 65 20 74 6f 20 74 65 6c 6c 20  ontinue to tell 
2dfc0 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
2dfd0 29 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  ) to iterate thr
2dfe0 6f 75 67 68 20 63 68 69 6c 64 20 6e 6f 64 65 73  ough child nodes
2dff0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
2e000 65 2c 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72  e, return WRC_Pr
2e010 75 6e 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  une. In this cas
2e020 65 2c 20 61 6c 73 6f 20 63 68 65 63 6b 20 69 66  e, also check if
2e030 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 65 78 70   the .** sub-exp
2e040 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20  ression matches 
2e050 74 68 65 20 63 72 69 74 65 72 69 61 20 66 6f 72  the criteria for
2e060 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20   being moved to 
2e070 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61  the WHERE.** cla
2e080 75 73 65 2e 20 49 66 20 73 6f 2c 20 61 64 64 20  use. If so, add 
2e090 69 74 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  it to the WHERE 
2e0a0 63 6c 61 75 73 65 20 61 6e 64 20 72 65 70 6c 61  clause and repla
2e0b0 63 65 20 74 68 65 20 73 75 62 2d 65 78 70 72 65  ce the sub-expre
2e0c0 73 73 69 6f 6e 0a 2a 2a 20 77 69 74 68 69 6e 20  ssion.** within 
2e0d0 74 68 65 20 48 41 56 49 4e 47 20 65 78 70 72 65  the HAVING expre
2e0e0 73 73 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e  ssion with a con
2e0f0 73 74 61 6e 74 20 22 31 22 2e 0a 2a 2f 0a 73 74  stant "1"..*/.st
2e100 61 74 69 63 20 69 6e 74 20 68 61 76 69 6e 67 54  atic int havingT
2e110 6f 57 68 65 72 65 45 78 70 72 43 62 28 57 61 6c  oWhereExprCb(Wal
2e120 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
2e130 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66  pr *pExpr){.  if
2e140 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
2e150 41 4e 44 20 29 7b 0a 20 20 20 20 53 65 6c 65 63  AND ){.    Selec
2e160 74 20 2a 70 53 20 3d 20 70 57 61 6c 6b 65 72 2d  t *pS = pWalker-
2e170 3e 75 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >u.pSelect;.    
2e180 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
2e190 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70  sConstantOrGroup
2e1a0 42 79 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72  By(pWalker->pPar
2e1b0 73 65 2c 20 70 45 78 70 72 2c 20 70 53 2d 3e 70  se, pExpr, pS->p
2e1c0 47 72 6f 75 70 42 79 29 20 29 7b 0a 20 20 20 20  GroupBy) ){.    
2e1d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2e1e0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2d  pWalker->pParse-
2e1f0 3e 64 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20  >db;.      Expr 
2e200 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
2e210 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
2e220 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74 65  INTEGER, &sqlite
2e230 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30  3IntTokens[1], 0
2e240 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
2e250 77 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  w ){.        Exp
2e260 72 20 2a 70 57 68 65 72 65 20 3d 20 70 53 2d 3e  r *pWhere = pS->
2e270 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 20 20  pWhere;.        
2e280 53 57 41 50 28 45 78 70 72 2c 20 2a 70 4e 65 77  SWAP(Expr, *pNew
2e290 2c 20 2a 70 45 78 70 72 29 3b 0a 20 20 20 20 20  , *pExpr);.     
2e2a0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
2e2b0 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 57 68  3ExprAnd(db, pWh
2e2c0 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  ere, pNew);.    
2e2d0 20 20 20 20 70 53 2d 3e 70 57 68 65 72 65 20 3d      pS->pWhere =
2e2e0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70   pNew;.        p
2e2f0 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
2e300 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
2e310 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
2e320 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74  Prune;.  }.  ret
2e330 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2e340 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  ;.}../*.** Trans
2e350 66 65 72 20 65 6c 69 67 69 62 6c 65 20 74 65 72  fer eligible ter
2e360 6d 73 20 66 72 6f 6d 20 74 68 65 20 48 41 56 49  ms from the HAVI
2e370 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 71  NG clause of a q
2e380 75 65 72 79 2c 20 77 68 69 63 68 20 69 73 0a 2a  uery, which is.*
2e390 2a 20 70 72 6f 63 65 73 73 65 64 20 61 66 74 65  * processed afte
2e3a0 72 20 67 72 6f 75 70 69 6e 67 2c 20 74 6f 20 74  r grouping, to t
2e3b0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
2e3c0 20 77 68 69 63 68 20 69 73 20 70 72 6f 63 65 73   which is proces
2e3d0 73 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 67 72  sed before.** gr
2e3e0 6f 75 70 69 6e 67 2e 20 46 6f 72 20 65 78 61 6d  ouping. For exam
2e3f0 70 6c 65 2c 20 74 68 65 20 71 75 65 72 79 3a 0a  ple, the query:.
2e400 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  **.**   SELECT *
2e410 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57   FROM <tables> W
2e420 48 45 52 45 20 61 3d 3f 20 47 52 4f 55 50 20 42  HERE a=? GROUP B
2e430 59 20 62 20 48 41 56 49 4e 47 20 62 3d 3f 20 41  Y b HAVING b=? A
2e440 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e  ND c=?.**.** can
2e450 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73   be rewritten as
2e460 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
2e470 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e   * FROM <tables>
2e480 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 62   WHERE a=? AND b
2e490 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48 41  =? GROUP BY b HA
2e4a0 56 49 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 41  VING c=?.**.** A
2e4b0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 48 41 56   term of the HAV
2e4c0 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ING expression i
2e4d0 73 20 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 74  s eligible for t
2e4e0 72 61 6e 73 66 65 72 20 69 66 20 69 74 20 63 6f  ransfer if it co
2e4f0 6e 73 69 73 74 73 0a 2a 2a 20 65 6e 74 69 72 65  nsists.** entire
2e500 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20  ly of constants 
2e510 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 73 20  and expressions 
2e520 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 47 52  that are also GR
2e530 4f 55 50 20 42 59 20 74 65 72 6d 73 20 74 68 61  OUP BY terms tha
2e540 74 0a 2a 2a 20 75 73 65 20 74 68 65 20 22 42 49  t.** use the "BI
2e550 4e 41 52 59 22 20 63 6f 6c 6c 61 74 69 6f 6e 20  NARY" collation 
2e560 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  sequence..*/.sta
2e570 74 69 63 20 76 6f 69 64 20 68 61 76 69 6e 67 54  tic void havingT
2e580 6f 57 68 65 72 65 28 50 61 72 73 65 20 2a 70 50  oWhere(Parse *pP
2e590 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
2e5a0 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b  {.  Walker sWalk
2e5b0 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57  er;.  memset(&sW
2e5c0 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  alker, 0, sizeof
2e5d0 28 73 57 61 6c 6b 65 72 29 29 3b 0a 20 20 73 57  (sWalker));.  sW
2e5e0 61 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d 20 70  alker.pParse = p
2e5f0 50 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72  Parse;.  sWalker
2e600 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2e610 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 45 78   havingToWhereEx
2e620 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  prCb;.  sWalker.
2e630 75 2e 70 53 65 6c 65 63 74 20 3d 20 70 3b 0a 20  u.pSelect = p;. 
2e640 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2e650 28 26 73 57 61 6c 6b 65 72 2c 20 70 2d 3e 70 48  (&sWalker, p->pH
2e660 61 76 69 6e 67 29 3b 0a 23 69 66 20 53 45 4c 45  aving);.#if SELE
2e670 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
2e680 20 20 69 66 28 20 73 57 61 6c 6b 65 72 2e 65 43    if( sWalker.eC
2e690 6f 64 65 20 26 26 20 28 73 71 6c 69 74 65 33 53  ode && (sqlite3S
2e6a0 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
2e6b0 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 53 45  00)!=0 ){.    SE
2e6c0 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
2e6d0 70 50 61 72 73 65 2c 70 2c 28 22 4d 6f 76 65 20  pParse,p,("Move 
2e6e0 48 41 56 49 4e 47 20 74 65 72 6d 73 20 69 6e 74  HAVING terms int
2e6f0 6f 20 57 48 45 52 45 3a 5c 6e 22 29 29 3b 0a 20  o WHERE:\n"));. 
2e700 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2e710 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
2e720 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
2e730 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
2e740 73 65 65 20 69 66 20 74 68 65 20 70 54 68 69 73  see if the pThis
2e750 20 65 6e 74 72 79 20 6f 66 20 70 54 61 62 4c 69   entry of pTabLi
2e760 73 74 20 69 73 20 61 20 73 65 6c 66 2d 6a 6f 69  st is a self-joi
2e770 6e 20 6f 66 20 61 20 70 72 69 6f 72 20 76 69 65  n of a prior vie
2e780 77 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 2c 20  w..** If it is, 
2e790 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20  then return the 
2e7a0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 66 6f 72  SrcList_item for
2e7b0 20 74 68 65 20 70 72 69 6f 72 20 76 69 65 77 2e   the prior view.
2e7c0 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 0a    If it is not,.
2e7d0 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30  ** then return 0
2e7e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
2e7f0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2e800 2a 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28  *isSelfJoinView(
2e810 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
2e820 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
2e830 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 73 65  /* Search for se
2e840 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20 74 68 69 73  lf-joins in this
2e850 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
2e860 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2e870 5f 69 74 65 6d 20 2a 70 54 68 69 73 20 20 20 2f  _item *pThis   /
2e880 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70 72 69  * Search for pri
2e890 6f 72 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  or reference to 
2e8a0 74 68 69 73 20 73 75 62 71 75 65 72 79 20 2a 2f  this subquery */
2e8b0 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63  .){.  struct Src
2e8c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2e8d0 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 20 3d 20  ;.  for(pItem = 
2e8e0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74  pTabList->a; pIt
2e8f0 65 6d 3c 70 54 68 69 73 3b 20 70 49 74 65 6d 2b  em<pThis; pItem+
2e900 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65  +){.    if( pIte
2e910 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20  m->pSelect==0 ) 
2e920 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2e930 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43  ( pItem->fg.viaC
2e940 6f 72 6f 75 74 69 6e 65 20 29 20 63 6f 6e 74 69  oroutine ) conti
2e950 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74  nue;.    if( pIt
2e960 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 20 63  em->zName==0 ) c
2e970 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2e980 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
2e990 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  (pItem->zDatabas
2e9a0 65 2c 20 70 54 68 69 73 2d 3e 7a 44 61 74 61 62  e, pThis->zDatab
2e9b0 61 73 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  ase)!=0 ) contin
2e9c0 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ue;.    if( sqli
2e9d0 74 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65  te3_stricmp(pIte
2e9e0 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 68 69 73 2d  m->zName, pThis-
2e9f0 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 20 63 6f 6e  >zName)!=0 ) con
2ea00 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
2ea10 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2ea20 65 28 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  e(0, .          
2ea30 70 54 68 69 73 2d 3e 70 53 65 6c 65 63 74 2d 3e  pThis->pSelect->
2ea40 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 70  pWhere, pItem->p
2ea50 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c 20  Select->pWhere, 
2ea60 2d 31 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  -1) .    ){.    
2ea70 20 20 2f 2a 20 54 68 65 20 76 69 65 77 20 77 61    /* The view wa
2ea80 73 20 6d 6f 64 69 66 69 65 64 20 62 79 20 73 6f  s modified by so
2ea90 6d 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a  me other optimiz
2eaa0 61 74 69 6f 6e 20 73 75 63 68 20 61 73 0a 20 20  ation such as.  
2eab0 20 20 20 20 2a 2a 20 70 75 73 68 44 6f 77 6e 57      ** pushDownW
2eac0 68 65 72 65 54 65 72 6d 73 28 29 20 2a 2f 0a 20  hereTerms() */. 
2ead0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2eae0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
2eaf0 70 49 74 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74  pItem;.  }.  ret
2eb00 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66  urn 0;.}..#ifdef
2eb10 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56   SQLITE_COUNTOFV
2eb20 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IEW_OPTIMIZATION
2eb30 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
2eb40 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 71 75  o transform a qu
2eb50 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a  ery of the form.
2eb60 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
2eb70 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 28 53  count(*) FROM (S
2eb80 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20  ELECT x FROM t1 
2eb90 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
2eba0 20 79 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a   y FROM t2).**.*
2ebb0 2a 20 49 6e 74 6f 20 74 68 69 73 3a 0a 2a 2a 0a  * Into this:.**.
2ebc0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 28 53 45  **    SELECT (SE
2ebd0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2ebe0 4f 4d 20 74 31 29 2b 28 53 45 4c 45 43 54 20 63  OM t1)+(SELECT c
2ebf0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29  ount(*) FROM t2)
2ec00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73  .**.** The trans
2ec10 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 6c 79 20 77  formation only w
2ec20 6f 72 6b 73 20 69 66 20 61 6c 6c 20 6f 66 20 74  orks if all of t
2ec30 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
2ec40 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
2ec50 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
2ec60 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 66  s a UNION ALL of
2ec70 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72   two or more ter
2ec80 6d 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 72 65  ms.**   *  There
2ec90 20 69 73 20 6e 6f 20 57 48 45 52 45 20 6f 72 20   is no WHERE or 
2eca0 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49  GROUP BY or HAVI
2ecb0 4e 47 20 63 6c 61 75 73 65 73 20 6f 6e 20 74 68  NG clauses on th
2ecc0 65 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20  e subqueries.** 
2ecd0 20 20 2a 20 20 54 68 65 20 6f 75 74 65 72 20 71    *  The outer q
2ece0 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65  uery is a simple
2ecf0 20 63 6f 75 6e 74 28 2a 29 0a 2a 2a 0a 2a 2a 20   count(*).**.** 
2ed00 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2ed10 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
2ed20 69 73 20 75 6e 64 65 72 74 61 6b 65 6e 2e 0a 2a  is undertaken..*
2ed30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
2ed40 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a 61  ntOfViewOptimiza
2ed50 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
2ed60 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
2ed70 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 2c 20    Select *pSub, 
2ed80 2a 70 50 72 69 6f 72 3b 0a 20 20 45 78 70 72 20  *pPrior;.  Expr 
2ed90 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72 20 2a  *pExpr;.  Expr *
2eda0 70 43 6f 75 6e 74 3b 0a 20 20 73 71 6c 69 74 65  pCount;.  sqlite
2edb0 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 28 70 2d  3 *db;.  if( (p-
2edc0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
2edd0 67 67 72 65 67 61 74 65 29 3d 3d 30 20 29 20 72  ggregate)==0 ) r
2ede0 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54 68  eturn 0;   /* Th
2edf0 69 73 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  is is an aggrega
2ee00 74 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  te */.  if( p->p
2ee10 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
2ee20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
2ee30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e            /* Sin
2ee40 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  gle result colum
2ee50 6e 20 2a 2f 0a 20 20 70 45 78 70 72 20 3d 20 70  n */.  pExpr = p
2ee60 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
2ee70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70  Expr;.  if( pExp
2ee80 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55  r->op!=TK_AGG_FU
2ee90 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20  NCTION ) return 
2eea0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  0;        /* Res
2eeb0 75 6c 74 20 69 73 20 61 6e 20 61 67 67 72 65 67  ult is an aggreg
2eec0 61 74 65 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ate */.  if( sql
2eed0 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 45 78  ite3_stricmp(pEx
2eee0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 63 6f  pr->u.zToken,"co
2eef0 75 6e 74 22 29 20 29 20 72 65 74 75 72 6e 20 30  unt") ) return 0
2ef00 3b 20 20 2f 2a 20 49 73 20 63 6f 75 6e 74 28 29  ;  /* Is count()
2ef10 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
2ef20 3e 78 2e 70 4c 69 73 74 21 3d 30 20 29 20 72 65  >x.pList!=0 ) re
2ef30 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
2ef40 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
2ef50 62 65 20 63 6f 75 6e 74 28 2a 29 20 2a 2f 0a 20  be count(*) */. 
2ef60 20 69 66 28 20 70 2d 3e 70 53 72 63 2d 3e 6e 53   if( p->pSrc->nS
2ef70 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  rc!=1 ) return 0
2ef80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ef90 20 20 20 2f 2a 20 4f 6e 65 20 74 61 62 6c 65 20     /* One table 
2efa0 69 6e 20 46 52 4f 4d 20 20 2a 2f 0a 20 20 70 53  in FROM  */.  pS
2efb0 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ub = p->pSrc->a[
2efc0 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66  0].pSelect;.  if
2efd0 28 20 70 53 75 62 3d 3d 30 20 29 20 72 65 74 75  ( pSub==0 ) retu
2efe0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
2eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f000 2f 2a 20 54 68 65 20 46 52 4f 4d 20 69 73 20 61  /* The FROM is a
2f010 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
2f020 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d  f( pSub->pPrior=
2f030 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
2f040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f050 20 2f 2a 20 4d 75 73 74 20 62 65 20 61 20 63 6f   /* Must be a co
2f060 6d 70 6f 75 6e 64 20 72 79 20 2a 2f 0a 20 20 64  mpound ry */.  d
2f070 6f 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  o{.    if( pSub-
2f080 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 70  >op!=TK_ALL && p
2f090 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 20 72 65  Sub->pPrior ) re
2f0a0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 75 73 74  turn 0;  /* Must
2f0b0 20 62 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 2a 2f   be UNION ALL */
2f0c0 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
2f0d0 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
2f0e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f0f0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 57 48 45         /* No WHE
2f100 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  RE clause */.   
2f110 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
2f120 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
2f130 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  te ) return 0;  
2f140 20 20 20 2f 2a 20 4e 6f 74 20 61 6e 20 61 67 67     /* Not an agg
2f150 72 65 67 61 74 65 20 2a 2f 0a 20 20 20 20 70 53  regate */.    pS
2f160 75 62 20 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f  ub = pSub->pPrio
2f170 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
2f180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f190 2f 2a 20 52 65 70 65 61 74 20 6f 76 65 72 20 63  /* Repeat over c
2f1a0 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 7d 77 68  ompound */.  }wh
2f1b0 69 6c 65 28 20 70 53 75 62 20 29 3b 0a 0a 20 20  ile( pSub );..  
2f1c0 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
2f1d0 68 69 73 20 70 6f 69 6e 74 20 74 68 65 6e 20 69  his point then i
2f1e0 74 20 69 73 20 4f 4b 20 74 6f 20 70 65 72 66 6f  t is OK to perfo
2f1f0 72 6d 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d  rm the transform
2f200 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d  ation */..  db =
2f210 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
2f220 43 6f 75 6e 74 20 3d 20 70 45 78 70 72 3b 0a 20  Count = pExpr;. 
2f230 20 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 70 53   pExpr = 0;.  pS
2f240 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ub = p->pSrc->a[
2f250 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 70 2d  0].pSelect;.  p-
2f260 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
2f270 65 63 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ect = 0;.  sqlit
2f280 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
2f290 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20  db, p->pSrc);.  
2f2a0 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  p->pSrc = sqlite
2f2b0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
2f2c0 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  arse->db, sizeof
2f2d0 28 2a 70 2d 3e 70 53 72 63 29 29 3b 0a 20 20 77  (*p->pSrc));.  w
2f2e0 68 69 6c 65 28 20 70 53 75 62 20 29 7b 0a 20 20  hile( pSub ){.  
2f2f0 20 20 45 78 70 72 20 2a 70 54 65 72 6d 3b 0a 20    Expr *pTerm;. 
2f300 20 20 20 70 50 72 69 6f 72 20 3d 20 70 53 75 62     pPrior = pSub
2f310 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 53  ->pPrior;.    pS
2f320 75 62 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a  ub->pPrior = 0;.
2f330 20 20 20 20 70 53 75 62 2d 3e 70 4e 65 78 74 20      pSub->pNext 
2f340 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73  = 0;.    pSub->s
2f350 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67  elFlags |= SF_Ag
2f360 67 72 65 67 61 74 65 3b 0a 20 20 20 20 70 53 75  gregate;.    pSu
2f370 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  b->selFlags &= ~
2f380 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 20  SF_Compound;.   
2f390 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f   pSub->nSelectRo
2f3a0 77 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  w = 0;.    sqlit
2f3b0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
2f3c0 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  (db, pSub->pELis
2f3d0 74 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  t);.    pTerm = 
2f3e0 70 50 72 69 6f 72 20 3f 20 73 71 6c 69 74 65 33  pPrior ? sqlite3
2f3f0 45 78 70 72 44 75 70 28 64 62 2c 20 70 43 6f 75  ExprDup(db, pCou
2f400 6e 74 2c 20 30 29 20 3a 20 70 43 6f 75 6e 74 3b  nt, 0) : pCount;
2f410 0a 20 20 20 20 70 53 75 62 2d 3e 70 45 4c 69 73  .    pSub->pELis
2f420 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
2f430 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
2f440 2c 20 30 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  , 0, pTerm);.   
2f450 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33   pTerm = sqlite3
2f460 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2f470 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 29 3b 0a  _SELECT, 0, 0);.
2f480 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72      sqlite3PExpr
2f490 41 64 64 53 65 6c 65 63 74 28 70 50 61 72 73 65  AddSelect(pParse
2f4a0 2c 20 70 54 65 72 6d 2c 20 70 53 75 62 29 3b 0a  , pTerm, pSub);.
2f4b0 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30      if( pExpr==0
2f4c0 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 20   ){.      pExpr 
2f4d0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 65 6c  = pTerm;.    }el
2f4e0 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72 20  se{.      pExpr 
2f4f0 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2f500 50 61 72 73 65 2c 20 54 4b 5f 50 4c 55 53 2c 20  Parse, TK_PLUS, 
2f510 70 54 65 72 6d 2c 20 70 45 78 70 72 29 3b 0a 20  pTerm, pExpr);. 
2f520 20 20 20 7d 0a 20 20 20 20 70 53 75 62 20 3d 20     }.    pSub = 
2f530 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 70 2d  pPrior;.  }.  p-
2f540 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
2f550 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 70  xpr = pExpr;.  p
2f560 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
2f570 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 0a 23 69  F_Aggregate;..#i
2f580 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
2f590 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
2f5a0 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
2f5b0 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53 45   0x400 ){.    SE
2f5c0 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c  LECTTRACE(0x400,
2f5d0 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72  pParse,p,("After
2f5e0 20 63 6f 75 6e 74 2d 6f 66 2d 76 69 65 77 20 6f   count-of-view o
2f5f0 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 5c 6e 22 29  ptimization:\n")
2f600 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
2f610 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2f620 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
2f630 66 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  f.  return 1;.}.
2f640 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2f650 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54  _COUNTOFVIEW_OPT
2f660 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a  IMIZATION */../*
2f670 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
2f680 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e for the SELECT
2f690 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e   statement given
2f6a0 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65   in the p argume
2f6b0 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nt.  .**.** The 
2f6c0 72 65 73 75 6c 74 73 20 61 72 65 20 72 65 74 75  results are retu
2f6d0 72 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  rned according t
2f6e0 6f 20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74  o the SelectDest
2f6f0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53   structure..** S
2f700 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73  ee comments in s
2f710 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66  qliteInt.h for f
2f720 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69  urther informati
2f730 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
2f740 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
2f750 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
2f760 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72  ors.  If any err
2f770 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75  ors are.** encou
2f780 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20  ntered, then an 
2f790 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
2f7a0 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66  r message is lef
2f7b0 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  t in.** pParse->
2f7c0 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
2f7d0 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
2f7e0 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65   NOT free the Se
2f7f0 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70  lect structure p
2f800 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a  assed in.  The.*
2f810 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * calling functi
2f820 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74  on needs to do t
2f830 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  hat..*/.int sqli
2f840 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72  te3Select(.  Par
2f850 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2f860 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
2f870 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
2f880 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
2f890 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
2f8a0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
2f8b0 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
2f8c0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
2f8d0 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  t      /* What t
2f8e0 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75  o do with the qu
2f8f0 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
2f900 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
2f910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2f920 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
2f930 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
2f940 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72  fo;     /* Retur
2f950 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68  n from sqlite3Wh
2f960 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20  ereBegin() */.  
2f970 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
2f980 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
2f990 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e  rtual machine un
2f9a0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
2f9b0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b   */.  int isAgg;
2f9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f9d0 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
2f9e0 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
2f9f0 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
2fa00 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 30 3b  ist *pEList = 0;
2fa10 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
2fa20 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
2fa30 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
2fa40 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
2fa50 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
2fa60 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
2fa70 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
2fa80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2fa90 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2faa0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
2fab0 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
2fac0 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47  pBy;    /* The G
2fad0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
2fae0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
2faf0 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b    Expr *pHaving;
2fb00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2fb10 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20  HAVING clause.  
2fb20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
2fb30 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20   int rc = 1;    
2fb40 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
2fb50 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20   to return from 
2fb60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
2fb70 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 73  .  DistinctCtx s
2fb80 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66  Distinct; /* Inf
2fb90 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65  o on how to code
2fba0 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
2fbb0 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43  yword */.  SortC
2fbc0 74 78 20 73 53 6f 72 74 3b 20 20 20 20 20 20 20  tx sSort;       
2fbd0 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77    /* Info on how
2fbe0 20 74 6f 20 63 6f 64 65 20 74 68 65 20 4f 52 44   to code the ORD
2fbf0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
2fc00 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e    AggInfo sAggIn
2fc10 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f  fo;      /* Info
2fc20 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20  rmation used by 
2fc30 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
2fc40 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b  s */.  int iEnd;
2fc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fc60 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
2fc70 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79  end of the query
2fc80 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
2fc90 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
2fca0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
2fcb0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
2fcc0 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 4f 72  rList *pMinMaxOr
2fcd0 64 65 72 42 79 20 3d 20 30 3b 20 20 2f 2a 20 41  derBy = 0;  /* A
2fce0 64 64 65 64 20 4f 52 44 45 52 20 42 59 20 66 6f  dded ORDER BY fo
2fcf0 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65 72 69 65  r min/max querie
2fd00 73 20 2a 2f 0a 20 20 75 38 20 6d 69 6e 4d 61 78  s */.  u8 minMax
2fd10 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20 20  Flag;           
2fd20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 66 6f        /* Flag fo
2fd30 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65 72 69 65  r min/max querie
2fd40 73 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61  s */..  db = pPa
2fd50 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73  rse->db;.  v = s
2fd60 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
2fd70 61 72 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  arse);.  if( p==
2fd80 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
2fd90 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
2fda0 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74  >nErr ){.    ret
2fdb0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
2fdc0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
2fdd0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
2fde0 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
2fdf0 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
2fe00 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f  memset(&sAggInfo
2fe10 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67  , 0, sizeof(sAgg
2fe20 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45  Info));.#if SELE
2fe30 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
2fe40 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
2fe50 70 50 61 72 73 65 2c 70 2c 20 28 22 62 65 67 69  pParse,p, ("begi
2fe60 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22  n processing:\n"
2fe70 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 45 78  , pParse->addrEx
2fe80 70 6c 61 69 6e 29 29 3b 0a 20 20 69 66 28 20 73  plain));.  if( s
2fe90 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
2fea0 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
2feb0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2fec0 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2fed0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
2fee0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2fef0 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2ff00 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46  eDest!=SRT_DistF
2ff10 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ifo );.  assert(
2ff20 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
2ff30 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
2ff40 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61  =SRT_Fifo );.  a
2ff50 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2ff60 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2ff70 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 51  eDest!=SRT_DistQ
2ff80 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74  ueue );.  assert
2ff90 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
2ffa0 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2ffb0 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20  !=SRT_Queue );. 
2ffc0 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
2ffd0 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
2ffe0 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74      assert(pDest
2fff0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69  ->eDest==SRT_Exi
30000 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  sts || pDest->eD
30010 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c  est==SRT_Union |
30020 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  | .           pD
30030 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
30040 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d  Except || pDest-
30050 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63  >eDest==SRT_Disc
30060 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ard ||.         
30070 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
30080 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44  SRT_Queue  || pD
30090 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
300a0 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20  DistFifo ||.    
300b0 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
300c0 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
300d0 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ue || pDest->eDe
300e0 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20  st==SRT_Fifo);. 
300f0 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42     /* If ORDER B
30100 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65  Y makes no diffe
30110 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74  rence in the out
30120 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72  put then neither
30130 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53   does.    ** DIS
30140 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20  TINCT so it can 
30150 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20  be removed too. 
30160 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
30170 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
30180 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
30190 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
301a0 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   0;.    p->selFl
301b0 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
301c0 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nct;.  }.  sqlit
301d0 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
301e0 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65  rse, p, 0);.  me
301f0 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30 2c 20  mset(&sSort, 0, 
30200 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a  sizeof(sSort));.
30210 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
30220 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
30230 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
30240 70 53 72 63 3b 0a 20 20 69 66 28 20 70 50 61 72  pSrc;.  if( pPar
30250 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
30260 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
30270 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
30280 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  end;.  }.  asser
30290 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
302a0 29 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d  );.  isAgg = (p-
302b0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
302c0 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 23 69  ggregate)!=0;.#i
302d0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
302e0 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
302f0 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
30300 20 30 78 31 30 34 20 29 7b 0a 20 20 20 20 53 45   0x104 ){.    SE
30310 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 34 2c  LECTTRACE(0x104,
30320 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74 65  pParse,p, ("afte
30330 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
30340 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  n:\n"));.    sql
30350 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
30360 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
30370 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
30380 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
30390 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67  _Output ){.    g
303a0 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
303b0 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  es(pParse, p);. 
303c0 20 7d 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20   }..  /* Try to 
303d0 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61  various optimiza
303e0 74 69 6f 6e 73 20 28 66 6c 61 74 74 65 6e 69 6e  tions (flattenin
303f0 67 20 73 75 62 71 75 65 72 69 65 73 2c 20 61 6e  g subqueries, an
30400 64 20 73 74 72 65 6e 67 74 68 0a 20 20 2a 2a 20  d strength.  ** 
30410 72 65 64 75 63 74 69 6f 6e 20 6f 66 20 6a 6f 69  reduction of joi
30420 6e 20 6f 70 65 72 61 74 6f 72 73 29 20 69 6e 20  n operators) in 
30430 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
30440 75 70 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  up into the main
30450 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66 20   query.  */.#if 
30460 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
30470 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
30480 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
30490 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66  E_OMIT_VIEW).  f
304a0 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69  or(i=0; !p->pPri
304b0 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74  or && i<pTabList
304c0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
304d0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
304e0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
304f0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a  pTabList->a[i];.
30500 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
30510 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63   = pItem->pSelec
30520 74 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  t;.    Table *pT
30530 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
30540 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  ;..    /* Conver
30550 74 20 4c 45 46 54 20 4a 4f 49 4e 20 69 6e 74 6f  t LEFT JOIN into
30560 20 4a 4f 49 4e 20 69 66 20 74 68 65 72 65 20 61   JOIN if there a
30570 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  re terms of the 
30580 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20 20 20  right table.    
30590 2a 2a 20 6f 66 20 74 68 65 20 4c 45 46 54 20 4a  ** of the LEFT J
305a0 4f 49 4e 20 75 73 65 64 20 69 6e 20 74 68 65 20  OIN used in the 
305b0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20  WHERE clause..  
305c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49    */.    if( (pI
305d0 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
305e0 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20   & JT_LEFT)!=0. 
305f0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78      && sqlite3Ex
30600 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c  prImpliesNonNull
30610 52 6f 77 28 70 2d 3e 70 57 68 65 72 65 2c 20 70  Row(p->pWhere, p
30620 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20  Item->iCursor). 
30630 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
30640 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
30650 51 4c 49 54 45 5f 53 69 6d 70 6c 69 66 79 4a 6f  QLITE_SimplifyJo
30660 69 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  in).    ){.     
30670 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
30680 30 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20  00,pParse,p,.   
30690 20 20 20 20 20 20 20 20 20 20 20 20 20 28 22 4c               ("L
306a0 45 46 54 2d 4a 4f 49 4e 20 73 69 6d 70 6c 69 66  EFT-JOIN simplif
306b0 69 65 73 20 74 6f 20 4a 4f 49 4e 20 6f 6e 20 74  ies to JOIN on t
306c0 65 72 6d 20 25 64 5c 6e 22 2c 69 29 29 3b 0a 20  erm %d\n",i));. 
306d0 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6a       pItem->fg.j
306e0 6f 69 6e 74 79 70 65 20 26 3d 20 7e 28 4a 54 5f  ointype &= ~(JT_
306f0 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 29 3b 0a  LEFT|JT_OUTER);.
30700 20 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45        unsetJoinE
30710 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70  xpr(p->pWhere, p
30720 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
30730 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f      }..    /* No
30740 20 66 75 74 68 65 72 20 61 63 74 69 6f 6e 20 69   futher action i
30750 66 20 74 68 69 73 20 74 65 72 6d 20 6f 66 20 74  f this term of t
30760 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
30770 73 20 6e 6f 20 61 20 73 75 62 71 75 65 72 79 20  s no a subquery 
30780 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d  */.    if( pSub=
30790 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
307a0 20 20 20 20 2f 2a 20 43 61 74 63 68 20 6d 69 73      /* Catch mis
307b0 6d 61 74 63 68 20 69 6e 20 74 68 65 20 64 65 63  match in the dec
307c0 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66  lared columns of
307d0 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20   a view and the 
307e0 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
307f0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
30800 53 45 4c 45 43 54 20 6f 6e 20 74 68 65 20 52 48  SELECT on the RH
30810 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61  S */.    if( pTa
30820 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70  b->nCol!=pSub->p
30830 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
30840 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
30850 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65  orMsg(pParse, "e
30860 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d  xpected %d colum
30870 6e 73 20 66 6f 72 20 27 25 73 27 20 62 75 74 20  ns for '%s' but 
30880 67 6f 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20  got %d",.       
30890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
308a0 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d  Tab->nCol, pTab-
308b0 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45  >zName, pSub->pE
308c0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
308d0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
308e0 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  end;.    }..    
308f0 2f 2a 20 44 6f 20 6e 6f 74 20 74 72 79 20 74 6f  /* Do not try to
30900 20 66 6c 61 74 74 65 6e 20 61 6e 20 61 67 67 72   flatten an aggr
30910 65 67 61 74 65 20 73 75 62 71 75 65 72 79 2e 0a  egate subquery..
30920 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6c      **.    ** Fl
30930 61 74 74 65 6e 69 6e 67 20 61 6e 20 61 67 67 72  attening an aggr
30940 65 67 61 74 65 20 73 75 62 71 75 65 72 79 20 69  egate subquery i
30950 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
30960 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
30970 72 79 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  ry.    ** is not
30980 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66   a join.  But if
30990 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
309a0 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2c 20   is not a join, 
309b0 74 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72  then the subquer
309c0 79 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65  y.    ** will be
309d0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
309e0 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 61 6e 64  a co-routine and
309f0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61 64 76   there is no adv
30a00 61 6e 74 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  antage to.    **
30a10 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 74   flattening in t
30a20 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  hat case..    */
30a30 0a 20 20 20 20 69 66 28 20 28 70 53 75 62 2d 3e  .    if( (pSub->
30a40 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
30a50 67 72 65 67 61 74 65 29 21 3d 30 20 29 20 63 6f  gregate)!=0 ) co
30a60 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
30a70 72 74 28 20 70 53 75 62 2d 3e 70 47 72 6f 75 70  rt( pSub->pGroup
30a80 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a  By==0 );..    /*
30a90 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   If the outer qu
30aa0 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 22  ery contains a "
30ab0 63 6f 6d 70 6c 65 78 22 20 72 65 73 75 6c 74 20  complex" result 
30ac0 73 65 74 20 28 74 68 61 74 20 69 73 2c 0a 20 20  set (that is,.  
30ad0 20 20 2a 2a 20 69 66 20 74 68 65 20 72 65 73 75    ** if the resu
30ae0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75  lt set of the ou
30af0 74 65 72 20 71 75 65 72 79 20 75 73 65 73 20 66  ter query uses f
30b00 75 6e 63 74 69 6f 6e 73 20 6f 72 20 73 75 62 71  unctions or subq
30b10 75 65 72 69 65 73 29 0a 20 20 20 20 2a 2a 20 61  ueries).    ** a
30b20 6e 64 20 69 66 20 74 68 65 20 73 75 62 71 75 65  nd if the subque
30b30 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 4f  ry contains an O
30b40 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
30b50 6e 64 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20  nd if.    ** it 
30b60 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e  will be implemen
30b70 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
30b80 69 6e 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ine, then do not
30b90 20 66 6c 61 74 74 65 6e 2e 20 20 54 68 69 73 0a   flatten.  This.
30ba0 20 20 20 20 2a 2a 20 72 65 73 74 72 69 63 74 69      ** restricti
30bb0 6f 6e 20 61 6c 6c 6f 77 73 20 53 51 4c 20 63 6f  on allows SQL co
30bc0 6e 73 74 72 75 63 74 73 20 6c 69 6b 65 20 74 68  nstructs like th
30bd0 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  is:.    **.    *
30be0 2a 20 20 53 45 4c 45 43 54 20 65 78 70 65 6e 73  *  SELECT expens
30bf0 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 78 29 0a  ive_function(x).
30c00 20 20 20 20 2a 2a 20 20 20 20 46 52 4f 4d 20 28      **    FROM (
30c10 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61  SELECT x FROM ta
30c20 62 20 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d  b ORDER BY y LIM
30c30 49 54 20 31 30 29 3b 0a 20 20 20 20 2a 2a 0a 20  IT 10);.    **. 
30c40 20 20 20 2a 2a 20 54 68 65 20 65 78 70 65 6e 73     ** The expens
30c50 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69  ive_function() i
30c60 73 20 6f 6e 6c 79 20 63 6f 6d 70 75 74 65 64 20  s only computed 
30c70 6f 6e 20 74 68 65 20 31 30 20 72 6f 77 73 20 74  on the 10 rows t
30c80 68 61 74 0a 20 20 20 20 2a 2a 20 61 72 65 20 6f  hat.    ** are o
30c90 75 74 70 75 74 2c 20 72 61 74 68 65 72 20 74 68  utput, rather th
30ca0 61 6e 20 65 76 65 72 79 20 72 6f 77 20 6f 66 20  an every row of 
30cb0 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  the table..    *
30cc0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 71  *.    ** The req
30cd0 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68  uirement that th
30ce0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61  e outer query ha
30cf0 76 65 20 61 20 63 6f 6d 70 6c 65 78 20 72 65 73  ve a complex res
30d00 75 6c 74 20 73 65 74 0a 20 20 20 20 2a 2a 20 6d  ult set.    ** m
30d10 65 61 6e 73 20 74 68 61 74 20 66 6c 61 74 74 65  eans that flatte
30d20 6e 69 6e 67 20 64 6f 65 73 20 6f 63 63 75 72 20  ning does occur 
30d30 6f 6e 20 73 69 6d 70 6c 65 72 20 53 51 4c 20 63  on simpler SQL c
30d40 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 74 68 6f  onstraints witho
30d50 75 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 78  ut.    ** the ex
30d60 70 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e  pensive_function
30d70 28 29 20 6c 69 6b 65 3a 0a 20 20 20 20 2a 2a 0a  () like:.    **.
30d80 20 20 20 20 2a 2a 20 20 53 45 4c 45 43 54 20 78      **  SELECT x
30d90 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20   FROM (SELECT x 
30da0 46 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20 42  FROM tab ORDER B
30db0 59 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20  Y y LIMIT 10);. 
30dc0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
30dd0 75 62 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 0a  ub->pOrderBy!=0.
30de0 20 20 20 20 20 26 26 20 69 3d 3d 30 0a 20 20 20       && i==0.   
30df0 20 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67    && (p->selFlag
30e00 73 20 26 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65  s & SF_ComplexRe
30e10 73 75 6c 74 29 21 3d 30 0a 20 20 20 20 20 26 26  sult)!=0.     &&
30e20 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63   (pTabList->nSrc
30e30 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==1.         || 
30e40 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e  (pTabList->a[1].
30e50 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f  fg.jointype&(JT_
30e60 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21  LEFT|JT_CROSS))!
30e70 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0).    ){.     
30e80 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
30e90 0a 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65  ..    if( flatte
30ea0 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65  nSubquery(pParse
30eb0 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 29 20 29  , p, i, isAgg) )
30ec0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
30ed0 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20  subquery can be 
30ee0 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74  absorbed into it
30ef0 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20  s parent. */.   
30f00 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d     i = -1;.    }
30f10 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
30f20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28  p->pSrc;.    if(
30f30 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
30f40 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
30f50 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 21 49 67  end;.    if( !Ig
30f60 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
30f70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73  Dest) ){.      s
30f80 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
30f90 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
30fa0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23   }.  }.#endif..#
30fb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
30fc0 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
30fd0 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63  CT.  /* Handle c
30fe0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
30ff0 74 61 74 65 6d 65 6e 74 73 20 75 73 69 6e 67 20  tatements using 
31000 74 68 65 20 73 65 70 61 72 61 74 65 20 6d 75 6c  the separate mul
31010 74 69 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20  tiSelect().  ** 
31020 70 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a  procedure..  */.
31030 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
31040 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  ){.    rc = mult
31050 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
31060 70 2c 20 70 44 65 73 74 29 3b 0a 23 69 66 20 53  p, pDest);.#if S
31070 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
31080 45 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ED.    SELECTTRA
31090 43 45 28 30 78 31 2c 70 50 61 72 73 65 2c 70 2c  CE(0x1,pParse,p,
310a0 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73  ("end compound-s
310b0 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67  elect processing
310c0 5c 6e 22 29 29 3b 0a 20 20 20 20 69 66 28 20 28  \n"));.    if( (
310d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
310e0 63 65 20 26 20 30 78 32 30 30 30 29 21 3d 30 20  ce & 0x2000)!=0 
310f0 26 26 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50  && ExplainQueryP
31100 6c 61 6e 50 61 72 65 6e 74 28 70 50 61 72 73 65  lanParent(pParse
31110 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
31120 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
31130 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
31140 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
31150 66 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29  f( p->pNext==0 )
31160 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
31170 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  nPop(pParse);.  
31180 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
31190 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 6f  .#endif..  /* Fo
311a0 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74  r each term in t
311b0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20  he FROM clause, 
311c0 64 6f 20 74 77 6f 20 74 68 69 6e 67 73 3a 0a 20  do two things:. 
311d0 20 2a 2a 20 28 31 29 20 41 75 74 68 6f 72 69 7a   ** (1) Authoriz
311e0 65 64 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20  ed unreferenced 
311f0 74 61 62 6c 65 73 0a 20 20 2a 2a 20 28 32 29 20  tables.  ** (2) 
31200 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
31210 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
31220 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  s.  */.  for(i=0
31230 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
31240 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
31250 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
31260 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
31270 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
31280 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
31290 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
312a0 62 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  b;.#if !defined(
312b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
312c0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
312d0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
312e0 45 57 29 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  EW).    const ch
312f0 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
31300 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 0a 20  ntext;.#endif.. 
31310 20 20 20 2f 2a 20 49 73 73 75 65 20 53 51 4c 49     /* Issue SQLI
31320 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a  TE_READ authoriz
31330 61 74 69 6f 6e 73 20 77 69 74 68 20 61 20 66 61  ations with a fa
31340 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66  ke column name f
31350 6f 72 20 61 6e 79 0a 20 20 20 20 2a 2a 20 74 61  or any.    ** ta
31360 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 72 65  bles that are re
31370 66 65 72 65 6e 63 65 64 20 62 75 74 20 66 72 6f  ferenced but fro
31380 6d 20 77 68 69 63 68 20 6e 6f 20 76 61 6c 75 65  m which no value
31390 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 2e  s are extracted.
313a0 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 73  .    ** Examples
313b0 20 6f 66 20 77 68 65 72 65 20 74 68 65 73 65 20   of where these 
313c0 6b 69 6e 64 73 20 6f 66 20 6e 75 6c 6c 20 53 51  kinds of null SQ
313d0 4c 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72  LITE_READ author
313e0 69 7a 61 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20  izations.    ** 
313f0 77 6f 75 6c 64 20 6f 63 63 75 72 3a 0a 20 20 20  would occur:.   
31400 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53   **.    **     S
31410 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
31420 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 53 51 4c  ROM t1;   -- SQL
31430 49 54 45 5f 52 45 41 44 20 74 31 2e 22 22 0a 20  ITE_READ t1."". 
31440 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54     **     SELECT
31450 20 74 31 2e 2a 20 46 52 4f 4d 20 74 31 2c 20 74   t1.* FROM t1, t
31460 32 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52  2;   -- SQLITE_R
31470 45 41 44 20 74 32 2e 22 22 0a 20 20 20 20 2a 2a  EAD t2."".    **
31480 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 61 6b 65  .    ** The fake
31490 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
314a0 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
314b0 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
314c0 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 6f 0a   for a table to.
314d0 20 20 20 20 2a 2a 20 68 61 76 65 20 61 20 63 6f      ** have a co
314e0 6c 75 6d 6e 20 6e 61 6d 65 64 20 62 79 20 74 68  lumn named by th
314f0 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20  e empty string, 
31500 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
31510 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
31520 0a 20 20 20 20 2a 2a 20 64 69 73 74 69 6e 67 75  .    ** distingu
31530 69 73 68 20 62 65 74 77 65 65 6e 20 61 6e 20 75  ish between an u
31540 6e 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c  nreferenced tabl
31550 65 20 61 6e 64 20 61 6e 20 61 63 74 75 61 6c 20  e and an actual 
31560 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
31570 0a 20 20 20 20 2a 2a 20 22 22 20 63 6f 6c 75 6d  .    ** "" colum
31580 6e 2e 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  n. The original 
31590 64 65 73 69 67 6e 20 77 61 73 20 66 6f 72 20 74  design was for t
315a0 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e  he fake column n
315b0 61 6d 65 20 74 6f 20 62 65 20 61 20 4e 55 4c 4c  ame to be a NULL
315c0 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77  ,.    ** which w
315d0 6f 75 6c 64 20 62 65 20 75 6e 61 6d 62 69 67 75  ould be unambigu
315e0 6f 75 73 2e 20 20 42 75 74 20 6c 65 67 61 63 79  ous.  But legacy
315f0 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63   authorization c
31600 61 6c 6c 62 61 63 6b 73 20 6d 69 67 68 74 0a 20  allbacks might. 
31610 20 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 65     ** assume the
31620 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
31630 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 73 65 67  non-NULL and seg
31640 66 61 75 6c 74 2e 20 20 54 68 65 20 75 73 65 20  fault.  The use 
31650 6f 66 20 61 6e 20 65 6d 70 74 79 0a 20 20 20 20  of an empty.    
31660 2a 2a 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  ** string for th
31670 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61  e fake column na
31680 6d 65 20 73 65 65 6d 73 20 73 61 66 65 72 2e 0a  me seems safer..
31690 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
316a0 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30  Item->colUsed==0
316b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
316c0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
316d0 65 2c 20 53 51 4c 49 54 45 5f 52 45 41 44 2c 20  e, SQLITE_READ, 
316e0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 22 22  pItem->zName, ""
316f0 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  , pItem->zDataba
31700 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  se);.    }..#if 
31710 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
31720 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
31730 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
31740 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20  E_OMIT_VIEW).   
31750 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
31760 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
31770 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
31780 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2f 0a  M clause.    */.
31790 20 20 20 20 70 53 75 62 20 3d 20 70 49 74 65 6d      pSub = pItem
317a0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
317b0 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e  f( pSub==0 ) con
317c0 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53  tinue;..    /* S
317d0 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64  ometimes the cod
317e0 65 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79  e for a subquery
317f0 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
31800 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ed more than.   
31810 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65   ** once, if the
31820 20 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72   subquery is par
31830 74 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  t of the WHERE c
31840 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20  lause in a LEFT 
31850 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72  JOIN,.    ** for
31860 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68   example.  In th
31870 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20  at case, do not 
31880 72 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  regenerate the c
31890 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a  ode to manifest.
318a0 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72      ** a view or
318b0 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
318c0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76  to implement a v
318d0 69 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20  iew.  The first 
318e0 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20  instance.    ** 
318f0 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74  is sufficient, t
31900 68 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75  hough the subrou
31910 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74  tine to manifest
31920 20 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e   the view does n
31930 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  eed.    ** to be
31940 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20   invoked again. 
31950 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  */.    if( pItem
31960 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b  ->addrFillSub ){
31970 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
31980 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
31990 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
319a0 2f 2a 20 54 68 65 20 73 75 62 72 6f 75 74 69 6e  /* The subroutin
319b0 65 20 74 68 61 74 20 6d 61 6e 69 66 65 73 74 73  e that manifests
319c0 20 74 68 65 20 76 69 65 77 20 6d 69 67 68 74 20   the view might 
319d0 62 65 20 61 20 6f 6e 65 2d 74 69 6d 65 20 72 6f  be a one-time ro
319e0 75 74 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 2a  utine,.        *
319f0 2a 20 6f 72 20 69 74 20 6d 69 67 68 74 20 6e 65  * or it might ne
31a00 65 64 20 74 6f 20 62 65 20 72 65 72 75 6e 20 6f  ed to be rerun o
31a10 6e 20 65 61 63 68 20 69 74 65 72 61 74 69 6f 6e  n each iteration
31a20 20 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20   because it.    
31a30 20 20 20 20 2a 2a 20 65 6e 63 6f 64 65 73 20 61      ** encodes a
31a40 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
31a50 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  uery. */.       
31a60 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
31a70 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
31a80 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
31a90 62 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f  b)->opcode==OP_O
31aa0 6e 63 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73  nce );.        s
31ab0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
31ac0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49  (v, OP_Gosub, pI
31ad0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
31ae0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
31af0 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ub);.      }.   
31b00 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
31b10 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
31b20 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67  ment Parse.nHeig
31b30 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74  ht by the height
31b40 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
31b50 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
31b60 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20  * tree referred 
31b70 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
31b80 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
31b90 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
31ba0 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
31bb0 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
31bc0 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
31bd0 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
31be0 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
31bf0 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
31c00 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
31c10 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
31c20 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
31c30 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
31c40 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
31c50 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
31c60 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
31c70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
31c80 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
31c90 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
31ca0 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
31cb0 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  /* Make copies o
31cc0 66 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45  f constant WHERE
31cd0 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e  -clause terms in
31ce0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
31cf0 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73   down.    ** ins
31d00 69 64 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ide the subquery
31d10 2e 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70  .  This can help
31d20 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f   the subquery to
31d30 20 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69   run more effici
31d40 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ently..    */.  
31d50 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
31d60 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
31d70 4c 49 54 45 5f 50 75 73 68 44 6f 77 6e 29 0a 20  LITE_PushDown). 
31d80 20 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e 57      && pushDownW
31d90 68 65 72 65 54 65 72 6d 73 28 70 50 61 72 73 65  hereTerms(pParse
31da0 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57 68 65 72  , pSub, p->pWher
31db0 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e, pItem->iCurso
31dc0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
31dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70                (p
31de0 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  Item->fg.jointyp
31df0 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
31e00 29 0a 20 20 20 20 29 7b 0a 23 69 66 20 53 45 4c  ).    ){.#if SEL
31e10 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
31e20 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
31e30 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
31e40 30 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  0x100 ){.       
31e50 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
31e60 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
31e70 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65  ter WHERE-clause
31e80 20 70 75 73 68 2d 64 6f 77 6e 3a 5c 6e 22 29 29   push-down:\n"))
31e90 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
31ea0 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
31eb0 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, p, 0);.      
31ec0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  }.#endif.    }el
31ed0 73 65 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  se{.      SELECT
31ee0 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
31ef0 73 65 2c 70 2c 28 22 50 75 73 68 2d 64 6f 77 6e  se,p,("Push-down
31f00 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 5c 6e 22   not possible\n"
31f10 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a  ));.    }..    z
31f20 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
31f30 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
31f40 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 50 61  Context;.    pPa
31f50 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
31f60 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  t = pItem->zName
31f70 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
31f80 74 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  te code to imple
31f90 6d 65 6e 74 20 74 68 65 20 73 75 62 71 75 65 72  ment the subquer
31fa0 79 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  y.    **.    ** 
31fb0 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
31fc0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
31fd0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 66 20 74   co-routine if t
31fe0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 0a 20  he subquery is. 
31ff0 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64     ** guaranteed
32000 20 74 6f 20 62 65 20 74 68 65 20 6f 75 74 65 72   to be the outer
32010 20 6c 6f 6f 70 20 28 73 6f 20 74 68 61 74 20 69   loop (so that i
32020 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
32030 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 6d  to be.    ** com
32040 70 75 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 20  puted more than 
32050 6f 6e 63 65 29 0a 20 20 20 20 2a 2a 0a 20 20 20  once).    **.   
32060 20 2a 2a 20 54 4f 44 4f 3a 20 41 72 65 20 74 68   ** TODO: Are th
32070 65 72 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ere other reason
32080 73 20 62 65 73 69 64 65 20 28 31 29 20 74 6f 20  s beside (1) to 
32090 75 73 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65  use a co-routine
320a0 0a 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  .    ** implemen
320b0 74 61 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20  tation?.    */. 
320c0 20 20 20 69 66 28 20 69 3d 3d 30 0a 20 20 20 20     if( i==0.    
320d0 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e   && (pTabList->n
320e0 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  Src==1.         
320f0 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d     || (pTabList-
32100 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  >a[1].fg.jointyp
32110 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  e&(JT_LEFT|JT_CR
32120 4f 53 53 29 29 21 3d 30 29 20 20 2f 2a 20 28 31  OSS))!=0)  /* (1
32130 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20  ) */.    ){.    
32140 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61    /* Implement a
32150 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74   co-routine that
32160 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73   will return a s
32170 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
32180 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
32190 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76   set on each inv
321a0 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ocation..      *
321b0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
321c0 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
321d0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
321e0 31 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20 70  1;.     .      p
321f0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
32200 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
32210 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
32220 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
32230 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70  InitCoroutine, p
32240 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c  Item->regReturn,
32250 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
32260 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
32270 28 76 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d  (v, "%s", pItem-
32280 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
32290 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64        pItem->add
322a0 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54  rFillSub = addrT
322b0 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  op;.      sqlite
322c0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
322d0 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75  &dest, SRT_Corou
322e0 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
322f0 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 45  Return);.      E
32300 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
32310 28 70 50 61 72 73 65 2c 20 31 2c 20 22 43 4f 2d  (pParse, 1, "CO-
32320 52 4f 55 54 49 4e 45 20 30 78 25 70 22 2c 20 70  ROUTINE 0x%p", p
32330 53 75 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sub));.      sql
32340 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
32350 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b  e, pSub, &dest);
32360 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54  .      pItem->pT
32370 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
32380 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f   pSub->nSelectRo
32390 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  w;.      pItem->
323a0 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
323b0 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  = 1;.      pItem
323c0 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65  ->regResult = de
323d0 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20  st.iSdst;.      
323e0 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f  sqlite3VdbeEndCo
323f0 72 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65 6d  routine(v, pItem
32400 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
32410 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
32420 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
32430 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  op-1);.      sql
32440 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
32450 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20  Cache(pParse);. 
32460 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32470 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
32480 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
32490 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d  ll fill an ephem
324a0 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a  eral table with.
324b0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e        ** the con
324c0 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62  tent of this sub
324d0 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61  query.  pItem->a
324e0 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20  ddrFillSub will 
324f0 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74  point.      ** t
32500 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  o the address of
32510 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 73   the generated s
32520 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65  ubroutine.  pIte
32530 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20  m->regReturn.   
32540 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73     ** is a regis
32550 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ter allocated to
32560 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75   hold the subrou
32570 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72  tine return addr
32580 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ess.      */.   
32590 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a     int topAddr;.
325a0 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64        int onceAd
325b0 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  dr = 0;.      in
325c0 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20  t retAddr;.     
325d0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
325e0 69 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a 20  item *pPrior;.. 
325f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
32600 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d  em->addrFillSub=
32610 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65  =0 );.      pIte
32620 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  m->regReturn = +
32630 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
32640 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73       topAddr = s
32650 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
32660 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
32670 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  0, pItem->regRet
32680 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65  urn);.      pIte
32690 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
326a0 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20   topAddr+1;.    
326b0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
326c0 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20  isCorrelated==0 
326d0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
326e0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
326f0 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20   not correlated 
32700 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f  and if we are no
32710 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20  t inside of.    
32720 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72      ** a trigger
32730 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e  , then we only n
32740 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
32750 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
32760 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20  subquery.       
32770 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20   ** once. */.   
32780 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20       onceAddr = 
32790 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
327a0 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56  0(v, OP_Once); V
327b0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
327c0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
327d0 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61  ent((v, "materia
327e0 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49  lize \"%s\"", pI
327f0 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
32800 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
32810 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f  .        VdbeNoo
32820 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61  pComment((v, "ma
32830 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22  terialize \"%s\"
32840 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
32850 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d  zName));.      }
32860 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20  .      pPrior = 
32870 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 70  isSelfJoinView(p
32880 54 61 62 4c 69 73 74 2c 20 70 49 74 65 6d 29 3b  TabList, pItem);
32890 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f  .      if( pPrio
328a0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
328b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
328c0 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 49  , OP_OpenDup, pI
328d0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50  tem->iCursor, pP
328e0 72 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  rior->iCursor);.
328f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
32900 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 21  pPrior->pSelect!
32910 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53  =0 );.        pS
32920 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d  ub->nSelectRow =
32930 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74   pPrior->pSelect
32940 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
32950 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32960 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
32970 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
32980 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49  SRT_EphemTab, pI
32990 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
329a0 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75         ExplainQu
329b0 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
329c0 20 31 2c 20 22 4d 41 54 45 52 49 41 4c 49 5a 45   1, "MATERIALIZE
329d0 20 30 78 25 70 22 2c 20 70 53 75 62 29 29 3b 0a   0x%p", pSub));.
329e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
329f0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
32a00 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ub, &dest);.    
32a10 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 6d 2d    }.      pItem-
32a20 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73  >pTab->nRowLogEs
32a30 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63  t = pSub->nSelec
32a40 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20  tRow;.      if( 
32a50 6f 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69 74  onceAddr ) sqlit
32a60 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
32a70 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20  , onceAddr);.   
32a80 20 20 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c     retAddr = sql
32a90 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
32aa0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74  , OP_Return, pIt
32ab0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
32ac0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
32ad0 74 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20  t((v, "end %s", 
32ae0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
32af0 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  me));.      sqli
32b00 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
32b10 76 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41  v, topAddr, retA
32b20 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ddr);.      sqli
32b30 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
32b40 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20  ache(pParse);.  
32b50 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
32b60 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
32b70 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
32b80 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
32b90 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65  ght -= sqlite3Se
32ba0 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
32bb0 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a  );.    pParse->z
32bc0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
32bd0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
32be0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
32bf0 2a 20 56 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e  * Various elemen
32c00 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ts of the SELECT
32c10 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63   copied into loc
32c20 61 6c 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72  al variables for
32c30 0a 20 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63  .  ** convenienc
32c40 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20  e */.  pEList = 
32c50 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57 68  p->pEList;.  pWh
32c60 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
32c70 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
32c80 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
32c90 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
32ca0 67 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69  g;.  sDistinct.i
32cb0 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46  sTnct = (p->selF
32cc0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
32cd0 63 74 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c  ct)!=0;..#if SEL
32ce0 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
32cf0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
32d00 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30  lectTrace & 0x40
32d10 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
32d20 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73  RACE(0x400,pPars
32d30 65 2c 70 2c 28 22 41 66 74 65 72 20 61 6c 6c 20  e,p,("After all 
32d40 46 52 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c  FROM-clause anal
32d50 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  ysis:\n"));.    
32d60 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
32d70 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
32d80 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
32d90 65 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f  ef SQLITE_COUNTO
32da0 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49  FVIEW_OPTIMIZATI
32db0 4f 4e 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  ON.  if( Optimiz
32dc0 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
32dd0 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61   SQLITE_QueryFla
32de0 74 74 65 6e 65 72 7c 53 51 4c 49 54 45 5f 43 6f  ttener|SQLITE_Co
32df0 75 6e 74 4f 66 56 69 65 77 29 0a 20 20 20 26 26  untOfView).   &&
32e00 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69   countOfViewOpti
32e10 6d 69 7a 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  mization(pParse,
32e20 20 70 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28   p).  ){.    if(
32e30 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
32e40 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
32e50 65 6e 64 3b 0a 20 20 20 20 70 45 4c 69 73 74 20  end;.    pEList 
32e60 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  = p->pEList;.   
32e70 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
32e80 53 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  Src;.  }.#endif.
32e90 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65  .  /* If the que
32ea0 72 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 77  ry is DISTINCT w
32eb0 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
32ec0 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  but is not an ag
32ed0 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20  gregate, and .  
32ee0 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63 74  ** if the select
32ef0 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73 61 6d  -list is the sam
32f00 65 20 61 73 20 74 68 65 20 4f 52 44 45 52 20 42  e as the ORDER B
32f10 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69  Y list, then thi
32f20 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e  s query.  ** can
32f30 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73   be rewritten as
32f40 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20   a GROUP BY. In 
32f50 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69  other words, thi
32f60 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
32f70 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
32f80 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52   xyz FROM ... OR
32f90 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a  DER BY xyz.  **.
32fa0 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72    ** is transfor
32fb0 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  med to:.  **.  *
32fc0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a  *     SELECT xyz
32fd0 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20   FROM ... GROUP 
32fe0 42 59 20 78 79 7a 20 4f 52 44 45 52 20 42 59 20  BY xyz ORDER BY 
32ff0 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  xyz.  **.  ** Th
33000 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73  e second form is
33010 20 70 72 65 66 65 72 72 65 64 20 61 73 20 61 20   preferred as a 
33020 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72  single index (or
33030 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79   temp-table) may
33040 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66   be .  ** used f
33050 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45  or both the ORDE
33060 52 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  R BY and DISTINC
33070 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73  T processing. As
33080 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a   originally .  *
33090 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20 71 75  * written the qu
330a0 65 72 79 20 6d 75 73 74 20 75 73 65 20 61 20 74  ery must use a t
330b0 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74  emp-table for at
330c0 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68   least one of th
330d0 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59  e ORDER .  ** BY
330e0 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61   and DISTINCT, a
330f0 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73  nd an index or s
33100 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62  eparate temp-tab
33110 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  le for the other
33120 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  ..  */.  if( (p-
33130 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
33140 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
33150 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
33160 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69  inct .   && sqli
33170 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
33180 72 65 28 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  re(sSort.pOrderB
33190 79 2c 20 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d  y, pEList, -1)==
331a0 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65  0.  ){.    p->se
331b0 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69  lFlags &= ~SF_Di
331c0 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 47 72 6f  stinct;.    pGro
331d0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
331e0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
331f0 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69  ListDup(db, pELi
33200 73 74 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 4e  st, 0);.    /* N
33210 6f 74 69 63 65 20 74 68 61 74 20 65 76 65 6e 20  otice that even 
33220 74 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69  thought SF_Disti
33230 6e 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65  nct has been cle
33240 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c  ared from p->sel
33250 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68  Flags,.    ** th
33260 65 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  e sDistinct.isTn
33270 63 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e  ct is still set.
33280 20 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20    Hence, isTnct 
33290 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20  represents the. 
332a0 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73     ** original s
332b0 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46  etting of the SF
332c0 5f 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20  _Distinct flag, 
332d0 6e 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  not the current 
332e0 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61  setting */.    a
332f0 73 73 65 72 74 28 20 73 44 69 73 74 69 6e 63 74  ssert( sDistinct
33300 2e 69 73 54 6e 63 74 20 29 3b 0a 0a 23 69 66 20  .isTnct );..#if 
33310 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
33320 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69  LED.    if( sqli
33330 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
33340 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20   0x400 ){.      
33350 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30  SELECTTRACE(0x40
33360 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 54 72 61  0,pParse,p,("Tra
33370 6e 73 66 6f 72 6d 20 44 49 53 54 49 4e 43 54 20  nsform DISTINCT 
33380 69 6e 74 6f 20 47 52 4f 55 50 20 42 59 3a 5c 6e  into GROUP BY:\n
33390 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
333a0 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
333b0 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d  (0, p, 0);.    }
333c0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
333d0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
333e0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
333f0 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e  , then create an
33400 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
33410 20 74 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20   to.  ** do the 
33420 73 6f 72 74 69 6e 67 2e 20 20 42 75 74 20 74 68  sorting.  But th
33430 69 73 20 73 6f 72 74 69 6e 67 20 65 70 68 65 6d  is sorting ephem
33440 65 72 61 6c 20 69 6e 64 65 78 20 6d 69 67 68 74  eral index might
33450 20 65 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65 69   end up.  ** bei
33460 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65  ng unused if the
33470 20 64 61 74 61 20 63 61 6e 20 62 65 20 65 78 74   data can be ext
33480 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f  racted in pre-so
33490 72 74 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a  rted order..  **
334a0 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20   If that is the 
334b0 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 4f  case, then the O
334c0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
334d0 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c  instruction will
334e0 20 62 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64   be.  ** changed
334f0 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f   to an OP_Noop o
33500 6e 63 65 20 77 65 20 66 69 67 75 72 65 20 6f 75  nce we figure ou
33510 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69  t that the sorti
33520 6e 67 20 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a  ng index is.  **
33530 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68   not needed.  Th
33540 65 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  e sSort.addrSort
33550 49 6e 64 65 78 20 76 61 72 69 61 62 6c 65 20 69  Index variable i
33560 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69  s used to facili
33570 74 61 74 65 0a 20 20 2a 2a 20 74 68 61 74 20 63  tate.  ** that c
33580 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  hange..  */.  if
33590 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
335a0 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
335b0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70  *pKeyInfo;.    p
335c0 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
335d0 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
335e0 61 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64  arse, sSort.pOrd
335f0 65 72 42 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d  erBy, 0, pEList-
33600 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 53 6f  >nExpr);.    sSo
33610 72 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50  rt.iECursor = pP
33620 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
33630 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74    sSort.addrSort
33640 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71  Index =.      sq
33650 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
33660 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
33670 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73  ral,.          s
33680 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73  Sort.iECursor, s
33690 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e  Sort.pOrderBy->n
336a0 45 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e  Expr+1+pEList->n
336b0 45 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20  Expr, 0,.       
336c0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
336d0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20  fo, P4_KEYINFO. 
336e0 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b       );.  }else{
336f0 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53  .    sSort.addrS
33700 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20  ortIndex = -1;. 
33710 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
33720 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
33730 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
33740 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
33750 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
33760 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
33770 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
33780 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
33790 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
337a0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
337b0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70  Dest->iSDParm, p
337c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
337d0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
337e0 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20   limiter..  */. 
337f0 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56   iEnd = sqlite3V
33800 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
33810 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
33820 61 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69  ags & SF_FixedLi
33830 6d 69 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  mit)==0 ){.    p
33840 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 33  ->nSelectRow = 3
33850 32 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f  20;  /* 4 billio
33860 6e 20 72 6f 77 73 20 2a 2f 0a 20 20 7d 0a 20 20  n rows */.  }.  
33870 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
33880 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
33890 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d   iEnd);.  if( p-
338a0 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53  >iLimit==0 && sS
338b0 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
338c0 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x>=0 ){.    sqli
338d0 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63  te3VdbeChangeOpc
338e0 6f 64 65 28 76 2c 20 73 53 6f 72 74 2e 61 64 64  ode(v, sSort.add
338f0 72 53 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53  rSortIndex, OP_S
33900 6f 72 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20  orterOpen);.    
33910 73 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20  sSort.sortFlags 
33920 7c 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53  |= SORTFLAG_UseS
33930 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  orter;.  }..  /*
33940 20 4f 70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72   Open an ephemer
33950 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  al index to use 
33960 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
33970 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
33980 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
33990 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  F_Distinct ){.  
339a0 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54    sDistinct.tabT
339b0 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
339c0 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69  ab++;.    sDisti
339d0 6e 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73  nct.addrTnct = s
339e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
339f0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
33a00 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
33a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62     sDistinct.tab
33a30 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  Tnct, 0, 0,.    
33a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a50 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
33a60 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
33a70 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ist(pParse, p->p
33a80 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20  EList,0,0),.    
33a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33aa0 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49           P4_KEYI
33ab0 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  NFO);.    sqlite
33ac0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
33ad0 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
33ae0 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  );.    sDistinct
33af0 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45  .eTnctType = WHE
33b00 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
33b10 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DERED;.  }else{.
33b20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
33b30 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f  nctType = WHERE_
33b40 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20  DISTINCT_NOOP;. 
33b50 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67   }..  if( !isAgg
33b60 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20   && pGroupBy==0 
33b70 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67  ){.    /* No agg
33b80 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
33b90 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59   and no GROUP BY
33ba0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75   clause */.    u
33bb0 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  16 wctrlFlags = 
33bc0 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63  (sDistinct.isTnc
33bd0 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  t ? WHERE_WANT_D
33be0 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a 20 20  ISTINCT : 0);.  
33bf0 20 20 61 73 73 65 72 74 28 20 57 48 45 52 45 5f    assert( WHERE_
33c00 55 53 45 5f 4c 49 4d 49 54 3d 3d 53 46 5f 46 69  USE_LIMIT==SF_Fi
33c10 78 65 64 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20  xedLimit );.    
33c20 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 70 2d  wctrlFlags |= p-
33c30 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46  >selFlags & SF_F
33c40 69 78 65 64 4c 69 6d 69 74 3b 0a 0a 20 20 20 20  ixedLimit;..    
33c50 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74  /* Begin the dat
33c60 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20  abase scan. */. 
33c70 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31     SELECTTRACE(1
33c80 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68 65 72  ,pParse,p,("Wher
33c90 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20 20  eBegin\n"));.   
33ca0 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
33cb0 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
33cc0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
33cd0 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64  here, sSort.pOrd
33ce0 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
33cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d00 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c 20       p->pEList, 
33d10 77 63 74 72 6c 46 6c 61 67 73 2c 20 70 2d 3e 6e  wctrlFlags, p->n
33d20 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20  SelectRow);.    
33d30 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
33d40 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
33d50 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
33d60 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
33d70 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d  unt(pWInfo) < p-
33d80 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20  >nSelectRow ){. 
33d90 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
33da0 6f 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  ow = sqlite3Wher
33db0 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28  eOutputRowCount(
33dc0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
33dd0 20 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74     if( sDistinct
33de0 2e 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69 74  .isTnct && sqlit
33df0 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63  e3WhereIsDistinc
33e00 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20  t(pWInfo) ){.   
33e10 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
33e20 63 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  ctType = sqlite3
33e30 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28  WhereIsDistinct(
33e40 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
33e50 20 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72     if( sSort.pOr
33e60 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73  derBy ){.      s
33e70 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73 71  Sort.nOBSat = sq
33e80 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65  lite3WhereIsOrde
33e90 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  red(pWInfo);.   
33ea0 20 20 20 73 53 6f 72 74 2e 62 4f 72 64 65 72 65     sSort.bOrdere
33eb0 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20 73 71 6c  dInnerLoop = sql
33ec0 69 74 65 33 57 68 65 72 65 4f 72 64 65 72 65 64  ite3WhereOrdered
33ed0 49 6e 6e 65 72 4c 6f 6f 70 28 70 57 49 6e 66 6f  InnerLoop(pWInfo
33ee0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 53 6f  );.      if( sSo
33ef0 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74  rt.nOBSat==sSort
33f00 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  .pOrderBy->nExpr
33f10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72   ){.        sSor
33f20 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  t.pOrderBy = 0;.
33f30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
33f40 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67     /* If sorting
33f50 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20   index that was 
33f60 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69  created by a pri
33f70 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
33f80 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74  ral .    ** inst
33f90 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70  ruction ended up
33fa0 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65   not being neede
33fb0 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74  d, then change t
33fc0 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
33fd0 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ral.    ** into 
33fe0 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20  an OP_Noop..    
33ff0 2a 2f 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74  */.    if( sSort
34000 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d  .addrSortIndex>=
34010 30 20 26 26 20 73 53 6f 72 74 2e 70 4f 72 64 65  0 && sSort.pOrde
34020 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
34030 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
34040 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74  eToNoop(v, sSort
34050 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  .addrSortIndex);
34060 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
34070 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
34080 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20  inner loop. */. 
34090 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
340a0 4c 69 73 74 3d 3d 70 45 4c 69 73 74 20 29 3b 0a  List==pEList );.
340b0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
340c0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d  oop(pParse, p, -
340d0 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73  1, &sSort, &sDis
340e0 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
340f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34100 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f    sqlite3WhereCo
34110 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e  ntinueLabel(pWIn
34120 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  fo),.           
34130 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
34140 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28  WhereBreakLabel(
34150 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 2f  pWInfo));..    /
34160 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61  * End the databa
34170 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  se scan loop..  
34180 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
34190 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
341a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
341b0 2a 20 54 68 69 73 20 63 61 73 65 20 77 68 65 6e  * This case when
341c0 20 74 68 65 72 65 20 65 78 69 73 74 20 61 67 67   there exist agg
341d0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
341e0 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63   or a GROUP BY c
341f0 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20  lause.    ** or 
34200 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65  both */.    Name
34210 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
34220 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
34230 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61  for processing a
34240 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61  ggregate informa
34250 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tion */.    int 
34260 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iAMem;          
34270 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
34280 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67  ress for storing
34290 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
342a0 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d  Y */.    int iBM
342b0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
342c0 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
342d0 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47  s for previous G
342e0 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
342f0 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20  nt iUseFlag;    
34300 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
34310 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69  s holding flag i
34320 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61  ndicating that a
34330 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20  t least.        
34340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34350 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68  ** one row of th
34360 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61  e input to the a
34370 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65  ggregator has be
34380 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  en.             
34390 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72             ** pr
343a0 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69  ocessed */.    i
343b0 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20  nt iAbortFlag;  
343c0 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
343d0 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71  s which causes q
343e0 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f  uery abort if po
343f0 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e  sitive */.    in
34400 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20  t groupBySort;  
34410 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66    /* Rows come f
34420 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52  rom source in GR
34430 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a  OUP BY order */.
34440 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b      int addrEnd;
34450 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
34460 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  f processing for
34470 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a   this SELECT */.
34480 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62      int sortPTab
34490 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64   = 0;   /* Pseud
344a0 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64  otable used to d
344b0 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65  ecode sorting re
344c0 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  sults */.    int
344d0 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20   sortOut = 0;   
344e0 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73   /* Output regis
344f0 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72  ter from the sor
34500 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  ter */.    int o
34510 72 64 65 72 42 79 47 72 70 20 3d 20 30 3b 20 2f  rderByGrp = 0; /
34520 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 47 52  * True if the GR
34530 4f 55 50 20 42 59 20 61 6e 64 20 4f 52 44 45 52  OUP BY and ORDER
34540 20 42 59 20 61 72 65 20 74 68 65 20 73 61 6d 65   BY are the same
34550 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f   */..    /* Remo
34560 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61  ve any and all a
34570 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20 74  liases between t
34580 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
34590 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f  d the.    ** GRO
345a0 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  UP BY clause..  
345b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
345c0 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69  oupBy ){.      i
345d0 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  nt k;           
345e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
345f0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
34600 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
34610 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
34620 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  m;  /* For loopi
34630 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73 69  ng over expressi
34640 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a  on in a list */.
34650 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e  .      for(k=p->
34660 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
34670 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  Item=p->pEList->
34680 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74  a; k>0; k--, pIt
34690 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
346a0 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73  Item->u.x.iAlias
346b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
346c0 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70      for(k=pGroup
346d0 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  By->nExpr, pItem
346e0 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e  =pGroupBy->a; k>
346f0 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; k--, pItem++)
34700 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  {.        pItem-
34710 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b  >u.x.iAlias = 0;
34720 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
34730 73 73 65 72 74 28 20 36 36 3d 3d 73 71 6c 69 74  ssert( 66==sqlit
34740 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b  e3LogEst(100) );
34750 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
34760 65 6c 65 63 74 52 6f 77 3e 36 36 20 29 20 70 2d  electRow>66 ) p-
34770 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 36 36  >nSelectRow = 66
34780 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
34790 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71     assert( 0==sq
347a0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20 29  lite3LogEst(1) )
347b0 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  ;.      p->nSele
347c0 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d  ctRow = 0;.    }
347d0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
347e0 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55  e is both a GROU
347f0 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45  P BY and an ORDE
34800 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20  R BY clause and 
34810 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a 20  they are.    ** 
34820 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20  identical, then 
34830 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62  it may be possib
34840 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  le to disable th
34850 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
34860 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  e .    ** on the
34870 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74 68   grounds that th
34880 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c 20  e GROUP BY will 
34890 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20 74  cause elements t
348a0 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20 20  o come out .    
348b0 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  ** in the correc
348c0 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73 6f  t order. It also
348d0 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20 47   may not - the G
348e0 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75 73  ROUP BY might us
348f0 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  e a.    ** datab
34900 61 73 65 20 69 6e 64 65 78 20 74 68 61 74 20 63  ase index that c
34910 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65  auses rows to be
34920 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
34930 72 20 61 73 20 72 65 71 75 69 72 65 64 0a 20 20  r as required.  
34940 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74    ** but not act
34950 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69  ually sorted. Ei
34960 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64  ther way, record
34970 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
34980 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  he.    ** ORDER 
34990 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20  BY and GROUP BY 
349a0 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65 20  clauses are the 
349b0 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20  same by setting 
349c0 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20  the orderByGrp. 
349d0 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20     ** variable. 
349e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
349f0 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
34a00 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f  re(pGroupBy, sSo
34a10 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29  rt.pOrderBy, -1)
34a20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64  ==0 ){.      ord
34a30 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20  erByGrp = 1;.   
34a40 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61   }. .    /* Crea
34a50 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75  te a label to ju
34a60 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61  mp to when we wa
34a70 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20  nt to abort the 
34a80 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64  query */.    add
34a90 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  rEnd = sqlite3Vd
34aa0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
34ab0 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
34ac0 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
34ad0 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
34ae0 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72  MN and make entr
34af0 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41  ies in.    ** sA
34b00 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54  ggInfo for all T
34b10 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
34b20 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  odes in expressi
34b30 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ons of the.    *
34b40 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
34b50 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  nt..    */.    m
34b60 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
34b70 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
34b80 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
34b90 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
34ba0 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
34bb0 74 3b 0a 20 20 20 20 73 4e 43 2e 75 4e 43 2e 70  t;.    sNC.uNC.p
34bc0 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49  AggInfo = &sAggI
34bd0 6e 66 6f 3b 0a 20 20 20 20 56 56 41 5f 4f 4e 4c  nfo;.    VVA_ONL
34be0 59 28 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 3d  Y( sNC.ncFlags =
34bf0 20 4e 43 5f 55 41 67 67 49 6e 66 6f 3b 20 29 0a   NC_UAggInfo; ).
34c00 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52      sAggInfo.mnR
34c10 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
34c20 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  m+1;.    sAggInf
34c30 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
34c40 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47   = pGroupBy ? pG
34c50 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a 20  roupBy->nExpr : 
34c60 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  0;.    sAggInfo.
34c70 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
34c80 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBy;.    sqlite3
34c90 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
34ca0 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29  st(&sNC, pEList)
34cb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
34cc0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
34cd0 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72 64  &sNC, sSort.pOrd
34ce0 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  erBy);.    if( p
34cf0 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
34d00 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
34d10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
34d20 70 57 68 65 72 65 3d 3d 70 2d 3e 70 57 68 65 72  pWhere==p->pWher
34d30 65 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  e );.        ass
34d40 65 72 74 28 20 70 48 61 76 69 6e 67 3d 3d 70 2d  ert( pHaving==p-
34d50 3e 70 48 61 76 69 6e 67 20 29 3b 0a 20 20 20 20  >pHaving );.    
34d60 20 20 20 20 61 73 73 65 72 74 28 20 70 47 72 6f      assert( pGro
34d70 75 70 42 79 3d 3d 70 2d 3e 70 47 72 6f 75 70 42  upBy==p->pGroupB
34d80 79 20 29 3b 0a 20 20 20 20 20 20 20 20 68 61 76  y );.        hav
34d90 69 6e 67 54 6f 57 68 65 72 65 28 70 50 61 72 73  ingToWhere(pPars
34da0 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70  e, p);.        p
34db0 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72  Where = p->pWher
34dc0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
34dd0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
34de0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
34df0 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20  NC, pHaving);.  
34e00 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
34e10 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20  .nAccumulator = 
34e20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
34e30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 47 72  ;.    if( p->pGr
34e40 6f 75 70 42 79 3d 3d 30 20 26 26 20 70 2d 3e 70  oupBy==0 && p->p
34e50 48 61 76 69 6e 67 3d 3d 30 20 26 26 20 73 41 67  Having==0 && sAg
34e60 67 49 6e 66 6f 2e 6e 46 75 6e 63 3d 3d 31 20 29  gInfo.nFunc==1 )
34e70 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78 46 6c  {.      minMaxFl
34e80 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79  ag = minMaxQuery
34e90 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  (db, sAggInfo.aF
34ea0 75 6e 63 5b 30 5d 2e 70 45 78 70 72 2c 20 26 70  unc[0].pExpr, &p
34eb0 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 29 3b 0a  MinMaxOrderBy);.
34ec0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34ed0 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20 57 48   minMaxFlag = WH
34ee0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
34ef0 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  AL;.    }.    fo
34f00 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
34f10 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  o.nFunc; i++){. 
34f20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
34f30 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 73 41  prHasProperty(sA
34f40 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
34f50 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
34f60 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e  ect) );.      sN
34f70 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f  C.ncFlags |= NC_
34f80 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 20  InAggFunc;.     
34f90 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
34fa0 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
34fb0 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
34fc0 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  i].pExpr->x.pLis
34fd0 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63  t);.      sNC.nc
34fe0 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41  Flags &= ~NC_InA
34ff0 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20  ggFunc;.    }.  
35000 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67    sAggInfo.mxReg
35010 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   = pParse->nMem;
35020 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
35030 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
35040 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 23 69 66   select_end;.#if
35050 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
35060 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c  BLED.    if( sql
35070 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
35080 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20  & 0x400 ){.     
35090 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 53   int ii;.      S
350a0 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30  ELECTTRACE(0x400
350b0 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65  ,pParse,p,("Afte
350c0 72 20 61 67 67 72 65 67 61 74 65 20 61 6e 61 6c  r aggregate anal
350d0 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  ysis:\n"));.    
350e0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
350f0 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
35100 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
35110 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  ; ii<sAggInfo.nC
35120 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20  olumn; ii++){.  
35130 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
35140 75 67 50 72 69 6e 74 66 28 22 61 67 67 2d 63 6f  ugPrintf("agg-co
35150 6c 75 6d 6e 5b 25 64 5d 20 69 4d 65 6d 3d 25 64  lumn[%d] iMem=%d
35160 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
35170 20 69 69 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43   ii, sAggInfo.aC
35180 6f 6c 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20  ol[ii].iMem);.  
35190 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
351a0 65 56 69 65 77 45 78 70 72 28 30 2c 20 73 41 67  eViewExpr(0, sAg
351b0 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 70  gInfo.aCol[ii].p
351c0 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
351d0 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  }.      for(ii=0
351e0 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46  ; ii<sAggInfo.nF
351f0 75 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  unc; ii++){.    
35200 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
35210 50 72 69 6e 74 66 28 22 61 67 67 2d 66 75 6e 63  Printf("agg-func
35220 5b 25 64 5d 3a 20 69 4d 65 6d 3d 25 64 5c 6e 22  [%d]: iMem=%d\n"
35230 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69  ,.            ii
35240 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
35250 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20  [ii].iMem);.    
35260 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
35270 69 65 77 45 78 70 72 28 30 2c 20 73 41 67 67 49  iewExpr(0, sAggI
35280 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 70 45  nfo.aFunc[ii].pE
35290 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  xpr, 0);.      }
352a0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .    }.#endif...
352b0 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e      /* Processin
352c0 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73  g for aggregates
352d0 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69   with GROUP BY i
352e0 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74  s very different
352f0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68   and.    ** much
35300 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68   more complex th
35310 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77 69  an aggregates wi
35320 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59  thout a GROUP BY
35330 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
35340 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
35350 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
35360 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67  Info;  /* Keying
35370 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
35380 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c   the group by cl
35390 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
353a0 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
353b0 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70    /* A-vs-B comp
353c0 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a  arision jump */.
353d0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75        int addrOu
353e0 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61  tputRow;  /* Sta
353f0 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65  rt of subroutine
35400 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
35410 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20  result row */.  
35420 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75      int regOutpu
35430 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72  tRow;   /* Retur
35440 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
35450 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75  er for output su
35460 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  broutine */.    
35470 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f    int addrSetAbo
35480 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65  rt;   /* Set the
35490 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20   abort flag and 
354a0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20  return */.      
354b0 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  int addrTopOfLoo
354c0 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68  p;  /* Top of th
354d0 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  e input loop */.
354e0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f        int addrSo
354f0 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65  rtingIdx; /* The
35500 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
35510 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e  l for the sortin
35520 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  g index */.     
35530 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20   int addrReset; 
35540 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
35550 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67  ne for resetting
35560 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
35570 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
35580 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  gReset;       /*
35590 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
355a0 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65 73  register for res
355b0 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  et subroutine */
355c0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
355d0 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42  ere is a GROUP B
355e0 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68  Y clause we migh
355f0 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67  t need a sorting
35600 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20   index to.      
35610 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e  ** implement it.
35620 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20    Allocate that 
35630 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f  sorting index no
35640 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20  w.  If it turns 
35650 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  out.      ** tha
35660 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  t we do not need
35670 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74   it after all, t
35680 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  he OP_SorterOpen
35690 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20   instruction.   
356a0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f     ** will be co
356b0 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e  nverted into a N
356c0 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a  oop.  .      */.
356d0 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
356e0 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72  ortingIdx = pPar
356f0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
35700 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
35710 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
35720 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
35730 79 2c 20 30 2c 20 73 41 67 67 49 6e 66 6f 2e 6e  y, 0, sAggInfo.n
35740 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61  Column);.      a
35750 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  ddrSortingIdx = 
35760 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
35770 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  4(v, OP_SorterOp
35780 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  en, .          s
35790 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
357a0 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f  dx, sAggInfo.nSo
357b0 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20  rtingColumn, .  
357c0 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61 72          0, (char
357d0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
357e0 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20  EYINFO);..      
357f0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  /* Initialize me
35800 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75  mory locations u
35810 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20  sed by GROUP BY 
35820 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73  aggregate proces
35830 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sing.      */.  
35840 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b      iUseFlag = +
35850 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
35860 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20       iAbortFlag 
35870 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
35880 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75  ;.      regOutpu
35890 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tRow = ++pParse-
358a0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
358b0 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
358c0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
358d0 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52  l(v);.      regR
358e0 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  eset = ++pParse-
358f0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
35900 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33  rReset = sqlite3
35910 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
35920 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20  ;.      iAMem = 
35930 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
35940 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
35950 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
35960 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->nExpr;.      i
35970 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  BMem = pParse->n
35980 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
35990 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
359a0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
359b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
359c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
359d0 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74  teger, 0, iAbort
359e0 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
359f0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c  eComment((v, "cl
35a00 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29  ear abort flag")
35a10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
35a20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
35a30 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73  _Integer, 0, iUs
35a40 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
35a50 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
35a60 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61  ndicate accumula
35a70 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20  tor empty"));.  
35a80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
35a90 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp3(v, OP_Null
35aa0 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65  , 0, iAMem, iAMe
35ab0 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  m+pGroupBy->nExp
35ac0 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r-1);..      /* 
35ad0 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61  Begin a loop tha
35ae0 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61  t will extract a
35af0 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69  ll source rows i
35b00 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
35b10 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
35b20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77  might involve tw
35b30 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73  o separate loops
35b40 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74   with an OP_Sort
35b50 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a   in between, or.
35b60 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
35b70 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f  t be a single lo
35b80 6f 70 20 74 68 61 74 20 75 73 65 73 20 61 6e 20  op that uses an 
35b90 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63 74  index to extract
35ba0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20   information.   
35bb0 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67     ** in the rig
35bc0 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69  ht order to begi
35bd0 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f  n with..      */
35be0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
35bf0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
35c00 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
35c10 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
35c20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
35c30 70 50 61 72 73 65 2c 70 2c 28 22 57 68 65 72 65  pParse,p,("Where
35c40 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20 20 20  Begin\n"));.    
35c50 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
35c60 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
35c70 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
35c80 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c  Where, pGroupBy,
35c90 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 57 48   0,.          WH
35ca0 45 52 45 5f 47 52 4f 55 50 42 59 20 7c 20 28 6f  ERE_GROUPBY | (o
35cb0 72 64 65 72 42 79 47 72 70 20 3f 20 57 48 45 52  rderByGrp ? WHER
35cc0 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 3a 20  E_SORTBYGROUP : 
35cd0 30 29 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  0), 0.      );. 
35ce0 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d       if( pWInfo=
35cf0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
35d00 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  _end;.      if( 
35d10 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72  sqlite3WhereIsOr
35d20 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3d 3d 70  dered(pWInfo)==p
35d30 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 29  GroupBy->nExpr )
35d40 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
35d50 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62   optimizer is ab
35d60 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f  le to deliver ro
35d70 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f  ws in group by o
35d80 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20  rder so.        
35d90 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76  ** we do not hav
35da0 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20  e to sort.  The 
35db0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
35dc0 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20   table will be. 
35dd0 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c         ** cancel
35de0 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73  led later becaus
35df0 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  e we still need 
35e00 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49  to use the pKeyI
35e10 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nfo.        */. 
35e20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
35e30 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rt = 0;.      }e
35e40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
35e50 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20  Rows are coming 
35e60 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69  out in undetermi
35e70 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68  ned order.  We h
35e80 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20  ave to push.    
35e90 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20      ** each row 
35ea0 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69  into a sorting i
35eb0 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20  ndex, terminate 
35ec0 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a  the first loop,.
35ed0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
35ee0 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f  loop over the so
35ef0 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f  rting index in o
35f00 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  rder to get the 
35f10 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a  output.        *
35f20 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  * in sorted orde
35f30 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  r.        */.   
35f40 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65       int regBase
35f50 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  ;.        int re
35f60 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20  gRecord;.       
35f70 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
35f80 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b     int nGroupBy;
35f90 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ..        explai
35fa0 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73  nTempTable(pPars
35fb0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
35fc0 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63  (sDistinct.isTnc
35fd0 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  t && (p->selFlag
35fe0 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d  s&SF_Distinct)==
35ff0 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  0) ?.           
36000 20 20 20 20 20 20 20 20 20 22 44 49 53 54 49 4e           "DISTIN
36010 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42 59 22  CT" : "GROUP BY"
36020 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75  );..        grou
36030 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20  pBySort = 1;.   
36040 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20       nGroupBy = 
36050 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
36060 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  .        nCol = 
36070 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  nGroupBy;.      
36080 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a    j = nGroupBy;.
36090 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
360a0 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
360b0 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
360c0 20 20 20 20 20 69 66 28 20 73 41 67 67 49 6e 66       if( sAggInf
360d0 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65  o.aCol[i].iSorte
360e0 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
360f0 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b            nCol++
36100 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  ;.            j+
36110 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
36120 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36130 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74   regBase = sqlit
36140 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
36150 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Parse, nCol);.  
36160 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
36170 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
36180 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
36190 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
361a0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
361b0 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20  oupBy, regBase, 
361c0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a  0, 0);.        j
361d0 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20   = nGroupBy;.   
361e0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
361f0 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
36200 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
36210 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
36220 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41  _col *pCol = &sA
36230 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a  ggInfo.aCol[i];.
36240 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
36250 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
36260 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
36270 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b      int r1 = j +
36280 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
36290 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
362a0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f  rCodeGetColumnTo
362b0 52 65 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Reg(pParse, .   
362c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
362d0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
362e0 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43  ->pTab, pCol->iC
362f0 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61  olumn, pCol->iTa
36300 62 6c 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ble, r1);.      
36310 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
36320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
36330 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63 6f  .        regReco
36340 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
36350 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
36360 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
36370 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
36380 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
36390 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65  ase, nCol, regRe
363a0 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
363b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
363c0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  (v, OP_SorterIns
363d0 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ert, sAggInfo.so
363e0 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63  rtingIdx, regRec
363f0 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
36400 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
36410 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
36420 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
36430 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
36440 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
36450 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a  regBase, nCol);.
36460 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
36470 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
36480 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
36490 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62  o.sortingIdxPTab
364a0 20 3d 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50   = sortPTab = pP
364b0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
364c0 20 20 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20        sortOut = 
364d0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
364e0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
364f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
36500 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
36510 73 65 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c  seudo, sortPTab,
36520 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b   sortOut, nCol);
36530 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
36540 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
36550 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67  _SorterSort, sAg
36560 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
36570 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
36580 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
36590 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f  (v, "GROUP BY so
365a0 72 74 22 29 29 3b 20 56 64 62 65 43 6f 76 65 72  rt")); VdbeCover
365b0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
365c0 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74  sAggInfo.useSort
365d0 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20  ingIdx = 1;.    
365e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
365f0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
36600 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  );..      }..   
36610 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
36620 65 78 20 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  ex or temporary 
36630 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 74 68  table used by th
36640 65 20 47 52 4f 55 50 20 42 59 20 73 6f 72 74 0a  e GROUP BY sort.
36650 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6e 61        ** will na
36660 74 75 72 61 6c 6c 79 20 64 65 6c 69 76 65 72 20  turally deliver 
36670 72 6f 77 73 20 69 6e 20 74 68 65 20 6f 72 64 65  rows in the orde
36680 72 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  r required by th
36690 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20  e ORDER BY.     
366a0 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63 61 6e 63   ** clause, canc
366b0 65 6c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  el the ephemeral
366c0 20 74 61 62 6c 65 20 6f 70 65 6e 20 63 6f 64 65   table open code
366d0 64 20 65 61 72 6c 69 65 72 2e 0a 20 20 20 20 20  d earlier..     
366e0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69   **.      ** Thi
366f0 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
36700 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65  tion - the corre
36710 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64  ct answer should
36720 20 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65   result regardle
36730 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55 73 65  ss..      ** Use
36740 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75   the SQLITE_Grou
36750 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69  pByOrder flag wi
36760 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  th SQLITE_TESTCT
36770 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20 74 6f 20  RL_OPTIMIZER to 
36780 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c  .      ** disabl
36790 65 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  e this optimizat
367a0 69 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e 67 20  ion for testing 
367b0 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f 0a 20 20  purposes.  */.  
367c0 20 20 20 20 69 66 28 20 6f 72 64 65 72 42 79 47      if( orderByG
367d0 72 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69  rp && Optimizati
367e0 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
367f0 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
36800 72 29 20 0a 20 20 20 20 20 20 20 26 26 20 28 67  r) .       && (g
36810 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c 20 73 71  roupBySort || sq
36820 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f 72 74  lite3WhereIsSort
36830 65 64 28 70 57 49 6e 66 6f 29 29 0a 20 20 20 20  ed(pWInfo)).    
36840 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f    ){.        sSo
36850 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
36860 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
36870 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
36880 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  (v, sSort.addrSo
36890 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  rtIndex);.      
368a0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c  }..      /* Eval
368b0 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  uate the current
368c0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
368d0 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c  and store in b0,
368e0 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20   b1, b2....     
368f0 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72   ** (b0 is memor
36900 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d  y location iBMem
36910 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b  +0, b1 is iBMem+
36920 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  1, and so forth)
36930 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63  .      ** Then c
36940 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65  ompare the curre
36950 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
36960 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52  s against the GR
36970 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20  OUP BY terms.   
36980 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70     ** from the p
36990 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72  revious row curr
369a0 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
369b0 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20  a0, a1, a2....  
369c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
369d0 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c  rTopOfLoop = sql
369e0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
369f0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
36a00 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
36a10 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
36a20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
36a30 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
36a40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
36a50 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61  v, OP_SorterData
36a60 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
36a70 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20  ngIdx,.         
36a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a90 20 73 6f 72 74 4f 75 74 2c 20 73 6f 72 74 50 54   sortOut, sortPT
36aa0 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ab);.      }.   
36ab0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47     for(j=0; j<pG
36ac0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a  roupBy->nExpr; j
36ad0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
36ae0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
36af0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
36b00 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
36b10 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54  P_Column, sortPT
36b20 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b  ab, j, iBMem+j);
36b30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
36b40 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
36b50 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  fo.directMode = 
36b60 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  1;.          sql
36b70 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
36b80 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
36b90 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d  [j].pExpr, iBMem
36ba0 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +j);.        }. 
36bb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
36bc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
36bd0 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41  , OP_Compare, iA
36be0 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f  Mem, iBMem, pGro
36bf0 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  upBy->nExpr,.   
36c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c10 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71         (char*)sq
36c20 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
36c30 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45  pKeyInfo), P4_KE
36c40 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 61 64  YINFO);.      ad
36c50 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
36c60 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
36c70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
36c80 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
36c90 75 6d 70 2c 20 61 64 64 72 31 2b 31 2c 20 30 2c  ump, addr1+1, 0,
36ca0 20 61 64 64 72 31 2b 31 29 3b 20 56 64 62 65 43   addr1+1); VdbeC
36cb0 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20  overage(v);..   
36cc0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
36cd0 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68  ode that runs wh
36ce0 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55 50  enever the GROUP
36cf0 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20   BY changes..   
36d00 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e     ** Changes in
36d10 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 72   the GROUP BY ar
36d20 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68  e detected by th
36d30 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a  e previous code.
36d40 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20        ** block. 
36d50 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e   If there were n
36d60 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20  o changes, this 
36d70 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64  block is skipped
36d80 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
36d90 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f   ** This code co
36da0 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f  pies current gro
36db0 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62  up by terms in b
36dc0 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20  0,b1,b2,....    
36dd0 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c    ** over to a0,
36de0 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20  a1,a2.  It then 
36df0 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74  calls the output
36e00 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
36e10 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20    ** and resets 
36e20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
36e30 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
36e40 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74 69  ers in preparati
36e50 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  on.      ** for 
36e60 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42  the next GROUP B
36e70 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a  Y batch..      *
36e80 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
36e90 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
36ea0 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d  se, iBMem, iAMem
36eb0 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
36ec0 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
36ed0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
36ee0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70  P_Gosub, regOutp
36ef0 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75  utRow, addrOutpu
36f00 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62  tRow);.      Vdb
36f10 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75  eComment((v, "ou
36f20 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b  tput one row"));
36f30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
36f40 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
36f50 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67  fPos, iAbortFlag
36f60 2c 20 61 64 64 72 45 6e 64 29 3b 20 56 64 62 65  , addrEnd); Vdbe
36f70 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
36f80 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
36f90 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20  v, "check abort 
36fa0 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
36fb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
36fc0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
36fd0 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
36fe0 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
36ff0 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74  mment((v, "reset
37000 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
37010 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
37020 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  e the aggregate 
37030 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73  accumulators bas
37040 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
37050 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  t of.      ** th
37060 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20  e current row.  
37070 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
37080 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
37090 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
370a0 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
370b0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
370c0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
370d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
370e0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
370f0 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
37100 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
37110 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74  v, "indicate dat
37120 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72  a in accumulator
37130 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  "));..      /* E
37140 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  nd of the loop. 
37150 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
37160 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
37170 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37180 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
37190 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67  _SorterNext, sAg
371a0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
371b0 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29  , addrTopOfLoop)
371c0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
371d0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
371e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
371f0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
37200 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
37210 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
37220 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
37230 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20  SortingIdx);.   
37240 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f     }..      /* O
37250 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20  utput the final 
37260 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20  row of result.  
37270 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
37280 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
37290 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
372a0 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
372b0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
372c0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
372d0 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f  "output final ro
372e0 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  w"));..      /* 
372f0 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75  Jump over the su
37300 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20  broutines.      
37310 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
37320 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
37330 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  End);..      /* 
37340 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
37350 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
37360 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ts a single row 
37370 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  of the result.  
37380 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69      ** set.  Thi
37390 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72  s subroutine fir
373a0 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  st looks at the 
373b0 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55  iUseFlag.  If iU
373c0 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20  seFlag.      ** 
373d0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
373e0 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
373f0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73  he subroutine is
37400 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20   a no-op.  If.  
37410 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
37420 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20  ssing calls for 
37430 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f  the query to abo
37440 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  rt, this subrout
37450 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63  ine.      ** inc
37460 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f  rements the iAbo
37470 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f  rtFlag memory lo
37480 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65  cation before re
37490 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20  turning in.     
374a0 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67   ** order to sig
374b0 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74  nal the caller t
374c0 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a  o abort..      *
374d0 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41  /.      addrSetA
374e0 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  bort = sqlite3Vd
374f0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
37500 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
37510 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
37520 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f  Integer, 1, iAbo
37530 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
37540 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
37550 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29  set abort flag")
37560 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
37570 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
37580 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
37590 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71  utRow);.      sq
375a0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
375b0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74  Label(v, addrOut
375c0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61  putRow);.      a
375d0 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
375e0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
375f0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
37600 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
37610 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
37620 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74  UseFlag, addrOut
37630 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20  putRow+2);.     
37640 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
37650 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
37660 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79  ent((v, "Groupby
37670 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
37680 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29  r entry point"))
37690 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
376a0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
376b0 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
376c0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e  tRow);.      fin
376d0 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
376e0 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
376f0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
37700 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
37710 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
37720 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
37730 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
37740 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  LL);.      selec
37750 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
37760 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74  e, p, -1, &sSort
37770 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
37780 20 20 20 20 20 20 20 20 26 73 44 69 73 74 69 6e          &sDistin
37790 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20  ct, pDest,.     
377a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
377b0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31   addrOutputRow+1
377c0 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74 29 3b  , addrSetAbort);
377d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
377e0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
377f0 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
37800 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
37810 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
37820 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20   groupby result 
37830 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20  generator"));.. 
37840 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
37850 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
37860 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68  at will reset th
37870 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d  e group-by accum
37880 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a  ulator.      */.
37890 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
378a0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
378b0 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20   addrReset);.   
378c0 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61     resetAccumula
378d0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
378e0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
378f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
37900 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
37910 67 52 65 73 65 74 29 3b 0a 20 20 20 20 20 0a 20  gReset);.     . 
37920 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47     } /* endif pG
37930 72 6f 75 70 42 79 2e 20 20 42 65 67 69 6e 20 61  roupBy.  Begin a
37940 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
37950 20 77 69 74 68 6f 75 74 20 47 52 4f 55 50 20 42   without GROUP B
37960 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b  Y: */.    else {
37970 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
37980 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a  OMIT_BTREECOUNT.
37990 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
379a0 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  b;.      if( (pT
379b0 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75  ab = isSimpleCou
379c0 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29  nt(p, &sAggInfo)
379d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
379e0 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f  /* If isSimpleCo
379f0 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61 20  unt() returns a 
37a00 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62  pointer to a Tab
37a10 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  le structure, th
37a20 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  en.        ** th
37a30 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
37a40 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
37a50 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
37a60 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63     **   SELECT c
37a70 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
37a80 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  l>.        **.  
37a90 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74        ** where t
37aa0 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
37ab0 72 65 20 72 65 74 75 72 6e 65 64 20 72 65 70 72  re returned repr
37ac0 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62  esents table <tb
37ad0 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  l>..        **. 
37ae0 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73         ** This s
37af0 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63  tatement is so c
37b00 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73  ommon that it is
37b10 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69   optimized speci
37b20 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20  ally. The.      
37b30 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e    ** OP_Count in
37b40 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65  struction is exe
37b50 63 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20  cuted either on 
37b60 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65  the intkey table
37b70 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
37b80 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
37b90 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62  ta for table <tb
37ba0 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20  l> or on one of 
37bb0 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a  its indexes. It.
37bc0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65          ** is be
37bd0 74 74 65 72 20 74 6f 20 65 78 65 63 75 74 65 20  tter to execute 
37be0 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64  the op on an ind
37bf0 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61  ex, as indexes a
37c00 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20  re almost.      
37c10 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65    ** always spre
37c20 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70  ad across less p
37c30 61 67 65 73 20 74 68 61 6e 20 74 68 65 69 72 20  ages than their 
37c40 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
37c50 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bles..        */
37c60 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
37c70 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
37c80 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
37c90 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
37ca0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
37cb0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72    const int iCsr
37cc0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
37cd0 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  +;     /* Cursor
37ce0 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20   to scan b-tree 
37cf0 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  */.        Index
37d00 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
37d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
37d30 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
37d40 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
37d50 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
37d60 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20       /* Keyinfo 
37d70 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65  for scanned inde
37d80 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  x */.        Ind
37d90 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20  ex *pBest = 0;  
37da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37db0 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20    /* Best index 
37dc0 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a  found so far */.
37dd0 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f          int iRoo
37de0 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20  t = pTab->tnum; 
37df0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37e00 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61  Root page of sca
37e10 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a  nned b-tree */..
37e20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
37e30 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
37e40 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
37e50 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
37e60 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
37e70 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
37e80 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
37e90 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61  ..        /* Sea
37ea0 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65  rch for the inde
37eb0 78 20 74 68 61 74 20 68 61 73 20 74 68 65 20 6c  x that has the l
37ec0 6f 77 65 73 74 20 73 63 61 6e 20 63 6f 73 74 2e  owest scan cost.
37ed0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
37ee0 20 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d      ** (2011-04-
37ef0 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20  15) Do not do a 
37f00 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20  full scan of an 
37f10 75 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e  unordered index.
37f20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
37f30 20 20 20 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d      ** (2013-10-
37f40 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74  03) Do not count
37f50 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e 20   the entries in 
37f60 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e  a partial index.
37f70 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
37f80 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69      ** In practi
37f90 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ce the KeyInfo s
37fa0 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f  tructure will no
37fb0 74 20 62 65 20 75 73 65 64 2e 20 49 74 20 69 73  t be used. It is
37fc0 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a   only .        *
37fd0 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70  * passed to keep
37fe0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70   OP_OpenRead hap
37ff0 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  py..        */. 
38000 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52         if( !HasR
38010 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 42 65  owid(pTab) ) pBe
38020 73 74 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  st = sqlite3Prim
38030 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
38040 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  );.        for(p
38050 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
38060 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
38070 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
38080 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62       if( pIdx->b
38090 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20  Unordered==0.   
380a0 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d          && pIdx-
380b0 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e  >szIdxRow<pTab->
380c0 73 7a 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20  szTabRow.       
380d0 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70 50 61      && pIdx->pPa
380e0 72 74 49 64 78 57 68 65 72 65 3d 3d 30 0a 20 20  rtIdxWhere==0.  
380f0 20 20 20 20 20 20 20 20 20 26 26 20 28 21 70 42           && (!pB
38100 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49  est || pIdx->szI
38110 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49  dxRow<pBest->szI
38120 64 78 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20  dxRow).         
38130 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
38140 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20  pBest = pIdx;.  
38150 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
38160 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
38170 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pBest ){.       
38180 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74     iRoot = pBest
38190 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20  ->tnum;.        
381a0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
381b0 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
381c0 65 78 28 70 50 61 72 73 65 2c 20 70 42 65 73 74  ex(pParse, pBest
381d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
381e0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20        /* Open a 
381f0 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
38200 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50  , execute the OP
38210 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68  _Count, close th
38220 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20  e cursor. */.   
38230 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
38240 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
38250 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20  OpenRead, iCsr, 
38260 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a  iRoot, iDb, 1);.
38270 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
38280 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
38290 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
382a0 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
382b0 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  ar *)pKeyInfo, P
382c0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
382d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
382e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
382f0 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73  v, OP_Count, iCs
38300 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  r, sAggInfo.aFun
38310 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20  c[0].iMem);.    
38320 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
38330 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
38340 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  e, iCsr);.      
38350 20 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43    explainSimpleC
38360 6f 75 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61  ount(pParse, pTa
38370 62 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20  b, pBest);.     
38380 20 7d 65 6c 73 65 0a 23 65 6e 6