/ Hex Artifact Content
Login

Artifact d2046feae56970f15dd6fc89fb9193d973fbb644:


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 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a 2a 2a  in SQLite..**.**
0200: 20 24 49 64 3a 20 65 78 70 72 2e 63 2c 76 20 31   $Id: expr.c,v 1
0210: 2e 33 38 37 20 32 30 30 38 2f 30 37 2f 32 38 20  .387 2008/07/28 
0220: 31 39 3a 33 34 3a 35 33 20 64 72 68 20 45 78 70  19:34:53 drh Exp
0230: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0240: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
0250: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0260: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0270: 65 20 27 61 66 66 69 6e 69 74 79 27 20 6f 66 20  e 'affinity' of 
0280: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
0290: 45 78 70 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  Expr if any..**.
02a0: 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
02b0: 20 63 6f 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72   column, a refer
02c0: 65 6e 63 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  ence to a column
02d0: 20 76 69 61 20 61 6e 20 27 41 53 27 20 61 6c 69   via an 'AS' ali
02e0: 61 73 2c 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d  as,.** or a sub-
02f0: 73 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  select with a co
0300: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 65 74 75  lumn as the retu
0310: 72 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  rn value, then t
0320: 68 65 20 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  he .** affinity 
0330: 6f 66 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  of that column i
0340: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
0350: 72 77 69 73 65 2c 20 30 78 30 30 20 69 73 20 72  rwise, 0x00 is r
0360: 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69  eturned,.** indi
0370: 63 61 74 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69  cating no affini
0380: 74 79 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ty for the expre
0390: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ssion..**.** i.e
03a0: 2e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  . the WHERE clau
03b0: 73 65 20 65 78 70 72 65 73 73 73 69 6f 6e 73 20  se expresssions 
03c0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
03d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a   statements all.
03e0: 2a 2a 20 68 61 76 65 20 61 6e 20 61 66 66 69 6e  ** have an affin
03f0: 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ity:.**.** CREAT
0400: 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a  E TABLE t1(a);.*
0410: 2a 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  * SELECT * FROM 
0420: 74 31 20 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53  t1 WHERE a;.** S
0430: 45 4c 45 43 54 20 61 20 41 53 20 62 20 46 52 4f  ELECT a AS b FRO
0440: 4d 20 74 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a  M t1 WHERE b;.**
0450: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0460: 31 20 57 48 45 52 45 20 28 73 65 6c 65 63 74 20  1 WHERE (select 
0470: 61 20 66 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63  a from t1);.*/.c
0480: 68 61 72 20 73 71 6c 69 74 65 33 45 78 70 72 41  har sqlite3ExprA
0490: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
04a0: 78 70 72 29 7b 0a 20 20 69 6e 74 20 6f 70 20 3d  xpr){.  int op =
04b0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
04c0: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
04d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
04e0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
04f0: 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  y(pExpr->pSelect
0500: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
0510: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0520: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0530: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0540: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 72 65 74  _CAST ){.    ret
0550: 75 72 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e  urn sqlite3Affin
0560: 69 74 79 54 79 70 65 28 26 70 45 78 70 72 2d 3e  ityType(&pExpr->
0570: 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  token);.  }.#end
0580: 69 66 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70  if.  return pExp
0590: 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a  r->affinity;.}..
05a0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
05b0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
05c0: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
05d0: 70 45 78 70 72 20 74 6f 20 62 65 20 74 68 65 20  pExpr to be the 
05e0: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
05f0: 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79 20 70  uence named by p
0600: 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e 20  Token.   Return 
0610: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
0620: 20 72 65 76 69 73 65 64 20 65 78 70 72 65 73 73   revised express
0630: 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ion..** The coll
0640: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  ating sequence i
0650: 73 20 6d 61 72 6b 65 64 20 61 73 20 22 65 78 70  s marked as "exp
0660: 6c 69 63 69 74 22 20 75 73 69 6e 67 20 74 68 65  licit" using the
0670: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 0a 2a   EP_ExpCollate.*
0680: 2a 20 66 6c 61 67 2e 20 20 41 6e 20 65 78 70 6c  * flag.  An expl
0690: 69 63 69 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  icit collating s
06a0: 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 6f 76 65  equence will ove
06b0: 72 72 69 64 65 20 69 6d 70 6c 69 63 69 74 0a 2a  rride implicit.*
06c0: 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * collating sequ
06d0: 65 6e 63 65 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ences..*/.Expr *
06e0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f  sqlite3ExprSetCo
06f0: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
0700: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54  , Expr *pExpr, T
0710: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
0720: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 30 3b  char *zColl = 0;
0730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
0740: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
0750: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
0760: 63 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20  ce */.  CollSeq 
0770: 2a 70 43 6f 6c 6c 3b 0a 20 20 73 71 6c 69 74 65  *pColl;.  sqlite
0780: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
0790: 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71  db;.  zColl = sq
07a0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
07b0: 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
07c0: 20 69 66 28 20 70 45 78 70 72 20 26 26 20 7a 43   if( pExpr && zC
07d0: 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  oll ){.    pColl
07e0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
07f0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
0800: 7a 43 6f 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20 20  zColl, -1);.    
0810: 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
0820: 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20     pExpr->pColl 
0830: 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
0840: 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Expr->flags |= E
0850: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  P_ExpCollate;.  
0860: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
0870: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
0880: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 45 78  l);.  return pEx
0890: 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  pr;.}../*.** Ret
08a0: 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20  urn the default 
08b0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
08c0: 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ce for the expre
08d0: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a  ssion pExpr. If.
08e0: 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  ** there is no d
08f0: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
0900: 20 74 79 70 65 2c 20 72 65 74 75 72 6e 20 30 2e   type, return 0.
0910: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
0920: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
0930: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
0940: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43  xpr *pExpr){.  C
0950: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
0960: 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29  0;.  if( pExpr )
0970: 7b 0a 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20  {.    int op;.  
0980: 20 20 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d    pColl = pExpr-
0990: 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 6f 70 20 3d  >pColl;.    op =
09a0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20   pExpr->op;.    
09b0: 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 43 41 53 54  if( (op==TK_CAST
09c0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   || op==TK_UPLUS
09d0: 29 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20  ) && !pColl ){. 
09e0: 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
09f0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
0a00: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
0a10: 65 66 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  eft);.    }.  }.
0a20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65    if( sqlite3Che
0a30: 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ckCollSeq(pParse
0a40: 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20  , pColl) ){ .   
0a50: 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a   pColl = 0;.  }.
0a60: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
0a70: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
0a80: 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20  s an operand of 
0a90: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
0aa0: 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20  rator.  aff2 is 
0ab0: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
0ac0: 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65  nity of the othe
0ad0: 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  r operand.  This
0ae0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
0af0: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
0b00: 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
0b10: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
0b20: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  e comparison ope
0b30: 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73  rator..*/.char s
0b40: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
0b50: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
0b60: 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20  r, char aff2){. 
0b70: 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c   char aff1 = sql
0b80: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
0b90: 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61  (pExpr);.  if( a
0ba0: 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20  ff1 && aff2 ){. 
0bb0: 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73     /* Both sides
0bc0: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
0bd0: 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  on are columns. 
0be0: 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72  If one has numer
0bf0: 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  ic.    ** affini
0c00: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
0c10: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
0c20: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
0c30: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
0c40: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
0c50: 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65  (aff1) || sqlite
0c60: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
0c70: 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20  ty(aff2) ){.    
0c80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
0c90: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
0ca0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
0cb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
0cc0: 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  NONE;.    }.  }e
0cd0: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
0ce0: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
0cf0: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
0d00: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
0d10: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
0d20: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
0d30: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
0d40: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
0d50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
0d60: 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NONE;.  }else{. 
0d70: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
0d80: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
0d90: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
0da0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
0db0: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
0dc0: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
0dd0: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
0de0: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
0df0: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
0e00: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
0e10: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
0e20: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
0e30: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
0e40: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
0e50: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
0e60: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
0e70: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
0e80: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
0e90: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
0ea0: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
0eb0: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
0ec0: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
0ed0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
0ee0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
0ef0: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
0f00: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
0f10: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
0f20: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
0f30: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
0f40: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
0f50: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
0f60: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20  >op==TK_NE );.  
0f70: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
0f80: 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20  Left );.  aff = 
0f90: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
0fa0: 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ity(pExpr->pLeft
0fb0: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
0fc0: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66  pRight ){.    af
0fd0: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
0fe0: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
0ff0: 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a  ->pRight, aff);.
1000: 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 70    }.  else if( p
1010: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Expr->pSelect ){
1020: 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74  .    aff = sqlit
1030: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
1040: 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  y(pExpr->pSelect
1050: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
1060: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 0a  Expr, aff);.  }.
1070: 20 20 65 6c 73 65 20 69 66 28 20 21 61 66 66 20    else if( !aff 
1080: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c  ){.    aff = SQL
1090: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
10a0: 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  }.  return aff;.
10b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
10c0: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65  s a comparison e
10d0: 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27  xpression, eg. '
10e0: 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29  =', '<', IN(...)
10f0: 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66   etc..** idx_aff
1100: 69 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66  inity is the aff
1110: 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65  inity of an inde
1120: 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75  xed column. Retu
1130: 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68  rn true.** if th
1140: 65 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66  e index with aff
1150: 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69  inity idx_affini
1160: 74 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74  ty may be used t
1170: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74  o implement.** t
1180: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  he comparison in
1190: 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pExpr..*/.int s
11a0: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
11b0: 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70  ityOk(Expr *pExp
11c0: 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69  r, char idx_affi
11d0: 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66  nity){.  char af
11e0: 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  f = comparisonAf
11f0: 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20  finity(pExpr);. 
1200: 20 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a   switch( aff ){.
1210: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1220: 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20 20 20  AFF_NONE:.      
1230: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61  return 1;.    ca
1240: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  se SQLITE_AFF_TE
1250: 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  XT:.      return
1260: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53   idx_affinity==S
1270: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
1280: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
1290: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
12a0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
12b0: 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29  ty(idx_affinity)
12c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
12d0: 65 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c  eturn the P5 val
12e0: 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ue that should b
12f0: 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e  e used for a bin
1300: 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a  ary comparison.*
1310: 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c  * opcode (OP_Eq,
1320: 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65   OP_Ge etc.) use
1330: 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78  d to compare pEx
1340: 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a  pr1 and pExpr2..
1350: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e  */.static u8 bin
1360: 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70  aryCompareP5(Exp
1370: 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20  r *pExpr1, Expr 
1380: 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d  *pExpr2, int jum
1390: 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61  pIfNull){.  u8 a
13a0: 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74  ff = (char)sqlit
13b0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
13c0: 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20  Expr2);.  aff = 
13d0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
13e0: 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61  finity(pExpr1, a
13f0: 66 66 29 20 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  ff) | jumpIfNull
1400: 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  ;.  return aff;.
1410: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1420: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1430: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1440: 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nce that should 
1450: 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20  be used by.** a 
1460: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
1470: 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61  n operator compa
1480: 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70  ring pLeft and p
1490: 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Right..**.** If 
14a0: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78  the left hand ex
14b0: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63  pression has a c
14c0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
14d0: 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20  e type, then it 
14e0: 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65  is.** used. Othe
14f0: 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  rwise the collat
1500: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
1510: 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
1520: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
1530: 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65   used, or the de
1540: 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69  fault (BINARY) i
1550: 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65 73  f neither expres
1560: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
1570: 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a  ting.** type..**
1580: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69  .** Argument pRi
1590: 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65  ght (but not pLe
15a0: 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c  ft) may be a nul
15b0: 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68  l pointer. In th
15c0: 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69  is case,.** it i
15d0: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
15e0: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
15f0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
1600: 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72  reCollSeq(.  Par
1610: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
1620: 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45  xpr *pLeft, .  E
1630: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
1640: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
1650: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
1660: 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d   );.  if( pLeft-
1670: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1680: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61 73  ollate ){.    as
1690: 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 70 43 6f  sert( pLeft->pCo
16a0: 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  ll );.    pColl 
16b0: 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  = pLeft->pColl;.
16c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
16d0: 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 66 6c  ht && pRight->fl
16e0: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
16f0: 61 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ate ){.    asser
1700: 74 28 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c  t( pRight->pColl
1710: 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   );.    pColl = 
1720: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20  pRight->pColl;. 
1730: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c   }else{.    pCol
1740: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
1750: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1760: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21  Left);.    if( !
1770: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
1780: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1790: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
17a0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  , pRight);.    }
17b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
17c0: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  oll;.}../*.** Ge
17d0: 6e 65 72 61 74 65 20 74 68 65 20 6f 70 65 72 61  nerate the opera
17e0: 6e 64 73 20 66 6f 72 20 61 20 63 6f 6d 70 61 72  nds for a compar
17f0: 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20  ison operation. 
1800: 20 42 65 66 6f 72 65 0a 2a 2a 20 67 65 6e 65 72   Before.** gener
1810: 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 66  ating the code f
1820: 6f 72 20 65 61 63 68 20 6f 70 65 72 61 6e 64 2c  or each operand,
1830: 20 73 65 74 20 74 68 65 20 45 50 5f 41 6e 79 41   set the EP_AnyA
1840: 66 66 0a 2a 2a 20 66 6c 61 67 20 6f 6e 20 74 68  ff.** flag on th
1850: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20  e expression so 
1860: 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
1870: 61 62 6c 65 20 74 6f 20 75 73 65 64 20 61 0a 2a  able to used a.*
1880: 2a 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20  * cached column 
1890: 76 61 6c 75 65 20 74 68 61 74 20 68 61 73 20 70  value that has p
18a0: 72 65 76 69 6f 75 73 6c 79 20 75 6e 64 65 72 67  reviously underg
18b0: 6f 6e 65 20 61 6e 0a 2a 2a 20 61 66 66 69 6e 69  one an.** affini
18c0: 74 79 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 73 74  ty change..*/.st
18d0: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 43 6f  atic void codeCo
18e0: 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28 0a 20  mpareOperands(. 
18f0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1900: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
1910: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
1920: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
1930: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
1940: 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65   /* The left ope
1950: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  rand */.  int *p
1960: 52 65 67 4c 65 66 74 2c 20 20 20 20 2f 2a 20 52  RegLeft,    /* R
1970: 65 67 69 73 74 65 72 20 77 68 65 72 65 20 6c 65  egister where le
1980: 66 74 20 6f 70 65 72 61 6e 64 20 69 73 20 73 74  ft operand is st
1990: 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ored */.  int *p
19a0: 46 72 65 65 4c 65 66 74 2c 20 20 20 2f 2a 20 46  FreeLeft,   /* F
19b0: 72 65 65 20 74 68 69 73 20 72 65 67 69 73 74 65  ree this registe
19c0: 72 20 77 68 65 6e 20 64 6f 6e 65 20 2a 2f 0a 20  r when done */. 
19d0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
19e0: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
19f0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1a00: 20 2a 70 52 65 67 52 69 67 68 74 2c 20 20 20 2f   *pRegRight,   /
1a10: 2a 20 52 65 67 69 73 74 65 72 20 77 68 65 72 65  * Register where
1a20: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 69   right operand i
1a30: 73 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e  s stored */.  in
1a40: 74 20 2a 70 46 72 65 65 52 69 67 68 74 20 20 20  t *pFreeRight   
1a50: 2f 2a 20 57 72 69 74 65 20 74 65 6d 70 20 72 65  /* Write temp re
1a60: 67 69 73 74 65 72 20 66 6f 72 20 72 69 67 68 74  gister for right
1a70: 20 6f 70 65 72 61 6e 64 20 74 68 65 72 65 20 2a   operand there *
1a80: 2f 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 4c  /.){.  while( pL
1a90: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  eft->op==TK_UPLU
1aa0: 53 20 29 20 70 4c 65 66 74 20 3d 20 70 4c 65 66  S ) pLeft = pLef
1ab0: 74 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 4c 65 66  t->pLeft;.  pLef
1ac0: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 41  t->flags |= EP_A
1ad0: 6e 79 41 66 66 3b 0a 20 20 2a 70 52 65 67 4c 65  nyAff;.  *pRegLe
1ae0: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
1af0: 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1b00: 20 70 4c 65 66 74 2c 20 70 46 72 65 65 4c 65 66   pLeft, pFreeLef
1b10: 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 52 69  t);.  while( pRi
1b20: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ght->op==TK_UPLU
1b30: 53 20 29 20 70 52 69 67 68 74 20 3d 20 70 52 69  S ) pRight = pRi
1b40: 67 68 74 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 52  ght->pLeft;.  pR
1b50: 69 67 68 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  ight->flags |= E
1b60: 50 5f 41 6e 79 41 66 66 3b 0a 20 20 2a 70 52 65  P_AnyAff;.  *pRe
1b70: 67 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  gRight = sqlite3
1b80: 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1b90: 72 73 65 2c 20 70 52 69 67 68 74 2c 20 70 46 72  rse, pRight, pFr
1ba0: 65 65 52 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a  eeRight);.}../*.
1bb0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1bc0: 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69 73 6f   for a compariso
1bd0: 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73  n operator..*/.s
1be0: 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 43 6f  tatic int codeCo
1bf0: 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a  mpare(.  Parse *
1c00: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 54 68  pParse,    /* Th
1c10: 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64 20 63  e parsing (and c
1c20: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 29 20  ode generating) 
1c30: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
1c40: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 2f  r *pLeft,      /
1c50: 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65 72 61  * The left opera
1c60: 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  nd */.  Expr *pR
1c70: 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  ight,     /* The
1c80: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a   right operand *
1c90: 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20  /.  int opcode, 
1ca0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
1cb0: 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a  parison opcode *
1cc0: 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69 6e 74  /.  int in1, int
1cd0: 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73 74 65   in2, /* Registe
1ce0: 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72 61 6e  r holding operan
1cf0: 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  ds */.  int dest
1d00: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d  ,         /* Jum
1d10: 70 20 68 65 72 65 20 69 66 20 74 72 75 65 2e 20  p here if true. 
1d20: 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66   */.  int jumpIf
1d30: 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74 72  Null    /* If tr
1d40: 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69 74 68  ue, jump if eith
1d50: 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55  er operand is NU
1d60: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70  LL */.){.  int p
1d70: 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  5;.  int addr;. 
1d80: 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a 20   CollSeq *p4;.. 
1d90: 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42 69 6e   p4 = sqlite3Bin
1da0: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
1db0: 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  q(pParse, pLeft,
1dc0: 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35 20 3d   pRight);.  p5 =
1dd0: 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35   binaryCompareP5
1de0: 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20  (pLeft, pRight, 
1df0: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 61  jumpIfNull);.  a
1e00: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
1e10: 65 41 64 64 4f 70 34 28 70 50 61 72 73 65 2d 3e  eAddOp4(pParse->
1e20: 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20 69  pVdbe, opcode, i
1e30: 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c 0a 20  n2, dest, in1,. 
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
1e60: 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  )p4, P4_COLLSEQ)
1e70: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1e80: 68 61 6e 67 65 50 35 28 70 50 61 72 73 65 2d 3e  hangeP5(pParse->
1e90: 70 56 64 62 65 2c 20 70 35 29 3b 0a 20 20 69 66  pVdbe, p5);.  if
1ea0: 28 20 28 70 35 20 26 20 53 51 4c 49 54 45 5f 41  ( (p5 & SQLITE_A
1eb0: 46 46 5f 4d 41 53 4b 29 21 3d 53 51 4c 49 54 45  FF_MASK)!=SQLITE
1ec0: 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
1ed0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1ee0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
1ef0: 70 50 61 72 73 65 2c 20 69 6e 31 2c 20 31 29 3b  pParse, in1, 1);
1f00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1f10: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
1f20: 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 32 2c  nge(pParse, in2,
1f30: 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
1f40: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66 20 53  n addr;.}..#if S
1f50: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
1f60: 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65  EPTH>0./*.** Che
1f70: 63 6b 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74  ck that argument
1f80: 20 6e 48 65 69 67 68 74 20 69 73 20 6c 65 73 73   nHeight is less
1f90: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1fa0: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a  o the maximum.**
1fb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
1fc0: 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74  h allowed. If it
1fd0: 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61   is not, leave a
1fe0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
1ff0: 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f  in.** pParse..*/
2000: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
2010: 6b 45 78 70 72 48 65 69 67 68 74 28 50 61 72 73  kExprHeight(Pars
2020: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e  e *pParse, int n
2030: 48 65 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 72  Height){.  int r
2040: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2050: 20 69 6e 74 20 6d 78 48 65 69 67 68 74 20 3d 20   int mxHeight = 
2060: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d  pParse->db->aLim
2070: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
2080: 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69  EXPR_DEPTH];.  i
2090: 66 28 20 6e 48 65 69 67 68 74 3e 6d 78 48 65 69  f( nHeight>mxHei
20a0: 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ght ){.    sqlit
20b0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
20c0: 65 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70 72  e, .       "Expr
20d0: 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74  ession tree is t
20e0: 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75  oo large (maximu
20f0: 6d 20 64 65 70 74 68 20 25 64 29 22 2c 20 6d 78  m depth %d)", mx
2100: 48 65 69 67 68 74 0a 20 20 20 20 29 3b 0a 20 20  Height.    );.  
2110: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
2120: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
2130: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  n rc;.}../* The 
2140: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20  following three 
2150: 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67 68  functions, heigh
2160: 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67 68  tOfExpr(), heigh
2170: 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a  tOfExprList().**
2180: 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65 6c   and heightOfSel
2190: 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64 20  ect(), are used 
21a0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
21b0: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 0a   maximum height.
21c0: 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73  ** of any expres
21d0: 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65  sion tree refere
21e0: 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72 75  nced by the stru
21f0: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
2200: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67  the.** first arg
2210: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
2220: 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65 69  this maximum hei
2230: 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74  ght is greater t
2240: 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
2250: 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a  value pointed.**
2260: 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74 2c   to by pnHeight,
2270: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
2280: 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74 20  meter, then set 
2290: 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68 61  *pnHeight to tha
22a0: 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  t.** value..*/.s
22b0: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
22c0: 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70 2c  tOfExpr(Expr *p,
22d0: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
22e0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
22f0: 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a  if( p->nHeight>*
2300: 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20  pnHeight ){.    
2310: 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 2d    *pnHeight = p-
2320: 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a  >nHeight;.    }.
2330: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
2340: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  d heightOfExprLi
2350: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  st(ExprList *p, 
2360: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
2370: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
2380: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
2390: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
23a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67 68  ++){.      heigh
23b0: 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e  tOfExpr(p->a[i].
23c0: 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74 29  pExpr, pnHeight)
23d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
23e0: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
23f0: 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20  OfSelect(Select 
2400: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
2410: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
2420: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
2430: 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65 69  p->pWhere, pnHei
2440: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
2450: 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  OfExpr(p->pHavin
2460: 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  g, pnHeight);.  
2470: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
2480: 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67  ->pLimit, pnHeig
2490: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
24a0: 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73 65 74  fExpr(p->pOffset
24b0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
24c0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
24d0: 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48  t(p->pEList, pnH
24e0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
24f0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
2500: 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65 69 67  pGroupBy, pnHeig
2510: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
2520: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72  fExprList(p->pOr
2530: 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68 74 29  derBy, pnHeight)
2540: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65  ;.    heightOfSe
2550: 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20  lect(p->pPrior, 
2560: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d  pnHeight);.  }.}
2570: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
2580: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
2590: 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72  iable in the str
25a0: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
25b0: 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   an .** argument
25c0: 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  . An expression 
25d0: 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e  with no children
25e0: 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20  , Expr.pList or 
25f0: 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74  .** Expr.pSelect
2600: 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68 65   member has a he
2610: 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f  ight of 1. Any o
2620: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a  ther expression.
2630: 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68 74 20  ** has a height 
2640: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
2650: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
2660: 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66  ny other .** ref
2670: 65 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75  erenced Expr plu
2680: 73 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  s one..*/.static
2690: 20 76 6f 69 64 20 65 78 70 72 53 65 74 48 65 69   void exprSetHei
26a0: 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ght(Expr *p){.  
26b0: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
26c0: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
26d0: 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67  p->pLeft, &nHeig
26e0: 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45  ht);.  heightOfE
26f0: 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26  xpr(p->pRight, &
2700: 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67  nHeight);.  heig
2710: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
2720: 70 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29  pList, &nHeight)
2730: 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65  ;.  heightOfSele
2740: 63 74 28 70 2d 3e 70 53 65 6c 65 63 74 2c 20 26  ct(p->pSelect, &
2750: 6e 48 65 69 67 68 74 29 3b 0a 20 20 70 2d 3e 6e  nHeight);.  p->n
2760: 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74  Height = nHeight
2770: 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   + 1;.}../*.** S
2780: 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69  et the Expr.nHei
2790: 67 68 74 20 76 61 72 69 61 62 6c 65 20 75 73 69  ght variable usi
27a0: 6e 67 20 74 68 65 20 65 78 70 72 53 65 74 48 65  ng the exprSetHe
27b0: 69 67 68 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ight() function.
27c0: 20 49 66 0a 2a 2a 20 74 68 65 20 68 65 69 67 68   If.** the heigh
27d0: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
27e0: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  n the maximum al
27f0: 6c 6f 77 65 64 20 65 78 70 72 65 73 73 69 6f 6e  lowed expression
2800: 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65 61 76 65   depth,.** leave
2810: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
2820: 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rse..*/.void sql
2830: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
2840: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
2850: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 65 78 70   Expr *p){.  exp
2860: 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20  rSetHeight(p);. 
2870: 20 63 68 65 63 6b 45 78 70 72 48 65 69 67 68 74   checkExprHeight
2880: 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69  (pParse, p->nHei
2890: 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ght);.}../*.** R
28a0: 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
28b0: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
28c0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
28d0: 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79  referenced.** by
28e0: 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   the select stat
28f0: 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
2900: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  an argument..*/.
2910: 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
2920: 74 45 78 70 72 48 65 69 67 68 74 28 53 65 6c 65  tExprHeight(Sele
2930: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  ct *p){.  int nH
2940: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
2950: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26  ghtOfSelect(p, &
2960: 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75  nHeight);.  retu
2970: 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65  rn nHeight;.}.#e
2980: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 68  lse.  #define ch
2990: 65 63 6b 45 78 70 72 48 65 69 67 68 74 28 78 2c  eckExprHeight(x,
29a0: 79 29 0a 20 20 23 64 65 66 69 6e 65 20 65 78 70  y).  #define exp
29b0: 72 53 65 74 48 65 69 67 68 74 28 79 29 0a 23 65  rSetHeight(y).#e
29c0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
29d0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 20  AX_EXPR_DEPTH>0 
29e0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  */../*.** Constr
29f0: 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73  uct a new expres
2a00: 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65  sion node and re
2a10: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
2a20: 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a  o it.  Memory.**
2a30: 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20 69   for this node i
2a40: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
2a50: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
2a60: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
2a70: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
2a80: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
2a90: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
2aa0: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
2ab0: 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a 45 78 70  ts freed..*/.Exp
2ac0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28 0a  r *sqlite3Expr(.
2ad0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
2ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
2af0: 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44  dle for sqlite3D
2b00: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d  bMallocZero() (m
2b10: 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20  ay be null) */. 
2b20: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
2b30: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
2b40: 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  ession opcode */
2b50: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  .  Expr *pLeft, 
2b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
2b70: 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ft operand */.  
2b80: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20  Expr *pRight,   
2b90: 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
2ba0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f   operand */.  co
2bb0: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  nst Token *pToke
2bc0: 6e 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e  n     /* Argumen
2bd0: 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20  t token */.){.  
2be0: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e  Expr *pNew;.  pN
2bf0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
2c00: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
2c10: 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 69 66  eof(Expr));.  if
2c20: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
2c30: 20 2f 2a 20 57 68 65 6e 20 6d 61 6c 6c 6f 63 20   /* When malloc 
2c40: 66 61 69 6c 73 2c 20 64 65 6c 65 74 65 20 70 4c  fails, delete pL
2c50: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 20  eft and pRight. 
2c60: 45 78 70 72 65 73 73 69 6f 6e 73 20 70 61 73 73  Expressions pass
2c70: 65 64 20 74 6f 20 0a 20 20 20 20 2a 2a 20 74 68  ed to .    ** th
2c80: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  is function must
2c90: 20 61 6c 77 61 79 73 20 62 65 20 61 6c 6c 6f 63   always be alloc
2ca0: 61 74 65 64 20 77 69 74 68 20 73 71 6c 69 74 65  ated with sqlite
2cb0: 33 45 78 70 72 28 29 20 66 6f 72 20 74 68 69 73  3Expr() for this
2cc0: 20 0a 20 20 20 20 2a 2a 20 72 65 61 73 6f 6e 2e   .    ** reason.
2cd0: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c   .    */.    sql
2ce0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
2cf0: 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  b, pLeft);.    s
2d00: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
2d10: 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  (db, pRight);.  
2d20: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2d30: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b    pNew->op = op;
2d40: 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d  .  pNew->pLeft =
2d50: 20 70 4c 65 66 74 3b 0a 20 20 70 4e 65 77 2d 3e   pLeft;.  pNew->
2d60: 70 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b  pRight = pRight;
2d70: 0a 20 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20  .  pNew->iAgg = 
2d80: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e  -1;.  pNew->span
2d90: 2e 7a 20 3d 20 28 75 38 2a 29 22 22 3b 0a 20 20  .z = (u8*)"";.  
2da0: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
2db0: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
2dc0: 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ->dyn==0 );.    
2dd0: 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65  pNew->span = pNe
2de0: 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b  w->token = *pTok
2df0: 65 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  en;.  }else if( 
2e00: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 69 66 28  pLeft ){.    if(
2e10: 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   pRight ){.     
2e20: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 73 70 61   if( pRight->spa
2e30: 6e 2e 64 79 6e 3d 3d 30 20 26 26 20 70 4c 65 66  n.dyn==0 && pLef
2e40: 74 2d 3e 73 70 61 6e 2e 64 79 6e 3d 3d 30 20 29  t->span.dyn==0 )
2e50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2e60: 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c 20  3ExprSpan(pNew, 
2e70: 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70  &pLeft->span, &p
2e80: 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20  Right->span);.  
2e90: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2ea0: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20  pRight->flags & 
2eb0: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b  EP_ExpCollate ){
2ec0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
2ed0: 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f  lags |= EP_ExpCo
2ee0: 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20 70  llate;.        p
2ef0: 4e 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 52 69  New->pColl = pRi
2f00: 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20  ght->pColl;.    
2f10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2f20: 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ( pLeft->flags &
2f30: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
2f40: 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  {.      pNew->fl
2f50: 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c  ags |= EP_ExpCol
2f60: 6c 61 74 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  late;.      pNew
2f70: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d  ->pColl = pLeft-
2f80: 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  >pColl;.    }.  
2f90: 7d 0a 0a 20 20 65 78 70 72 53 65 74 48 65 69 67  }..  exprSetHeig
2fa0: 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  ht(pNew);.  retu
2fb0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
2fc0: 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c  * Works like sql
2fd0: 69 74 65 33 45 78 70 72 28 29 20 65 78 63 65 70  ite3Expr() excep
2fe0: 74 20 74 68 61 74 20 69 74 20 74 61 6b 65 73 20  t that it takes 
2ff0: 61 6e 20 65 78 74 72 61 20 50 61 72 73 65 2a 0a  an extra Parse*.
3000: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  ** argument and 
3010: 6e 6f 74 69 66 69 65 73 20 74 68 65 20 61 73 73  notifies the ass
3020: 6f 63 69 61 74 65 64 20 63 6f 6e 6e 65 63 74 69  ociated connecti
3030: 6f 6e 20 6f 62 6a 65 63 74 20 69 66 20 6d 61 6c  on object if mal
3040: 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 45 78  loc fails..*/.Ex
3050: 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72  pr *sqlite3PExpr
3060: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3070: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
3080: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
3090: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
30b0: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
30c0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
30d0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
30e0: 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   Left operand */
30f0: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
3100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
3110: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
3120: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
3130: 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75  oken     /* Argu
3140: 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b  ment token */.){
3150: 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c  .  Expr *p = sql
3160: 69 74 65 33 45 78 70 72 28 70 50 61 72 73 65 2d  ite3Expr(pParse-
3170: 3e 64 62 2c 20 6f 70 2c 20 70 4c 65 66 74 2c 20  >db, op, pLeft, 
3180: 70 52 69 67 68 74 2c 20 70 54 6f 6b 65 6e 29 3b  pRight, pToken);
3190: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
31a0: 63 68 65 63 6b 45 78 70 72 48 65 69 67 68 74 28  checkExprHeight(
31b0: 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67  pParse, p->nHeig
31c0: 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ht);.  }.  retur
31d0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  n p;.}../*.** Wh
31e0: 65 6e 20 64 6f 69 6e 67 20 61 20 6e 65 73 74 65  en doing a neste
31f0: 64 20 70 61 72 73 65 2c 20 79 6f 75 20 63 61 6e  d parse, you can
3200: 20 69 6e 63 6c 75 64 65 20 74 65 72 6d 73 20 69   include terms i
3210: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  n an expression.
3220: 2a 2a 20 74 68 61 74 20 6c 6f 6f 6b 20 6c 69 6b  ** that look lik
3230: 65 20 74 68 69 73 3a 20 20 20 23 31 20 23 32 20  e this:   #1 #2 
3240: 2e 2e 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73  ...  These terms
3250: 20 72 65 66 65 72 20 74 6f 20 72 65 67 69 73 74   refer to regist
3260: 65 72 73 0a 2a 2a 20 69 6e 20 74 68 65 20 76 69  ers.** in the vi
3270: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20  rtual machine.  
3280: 23 4e 20 69 73 20 74 68 65 20 4e 2d 74 68 20 72  #N is the N-th r
3290: 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  egister..**.** T
32a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
32b0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
32c0: 73 65 72 20 74 6f 20 64 65 61 6c 20 77 69 74 68  ser to deal with
32d0: 20 6f 6e 20 6f 66 20 74 68 6f 73 65 20 74 65 72   on of those ter
32e0: 6d 73 2e 0a 2a 2a 20 49 74 20 69 6d 6d 65 64 69  ms..** It immedi
32f0: 61 74 65 6c 79 20 67 65 6e 65 72 61 74 65 73 20  ately generates 
3300: 63 6f 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68  code to store th
3310: 65 20 76 61 6c 75 65 20 69 6e 20 61 20 6d 65 6d  e value in a mem
3320: 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ory location..**
3330: 20 54 68 65 20 72 65 74 75 72 6e 73 20 61 6e 20   The returns an 
3340: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
3350: 77 69 6c 6c 20 63 6f 64 65 20 74 6f 20 65 78 74  will code to ext
3360: 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 66  ract the value f
3370: 72 6f 6d 0a 2a 2a 20 74 68 61 74 20 6d 65 6d 6f  rom.** that memo
3380: 72 79 20 6c 6f 63 61 74 69 6f 6e 20 61 73 20 6e  ry location as n
3390: 65 65 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  eeded..*/.Expr *
33a0: 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 45  sqlite3RegisterE
33b0: 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  xpr(Parse *pPars
33c0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  e, Token *pToken
33d0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
33e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
33f0: 45 78 70 72 20 2a 70 3b 0a 20 20 69 66 28 20 70  Expr *p;.  if( p
3400: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
3410: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
3420: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3430: 22 6e 65 61 72 20 5c 22 25 54 5c 22 3a 20 73 79  "near \"%T\": sy
3440: 6e 74 61 78 20 65 72 72 6f 72 22 2c 20 70 54 6f  ntax error", pTo
3450: 6b 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ken);.    return
3460: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
3470: 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30  arse, TK_NULL, 0
3480: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 0, 0);.  }.  i
3490: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
34a0: 20 30 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   0;.  p = sqlite
34b0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
34c0: 4b 5f 52 45 47 49 53 54 45 52 2c 20 30 2c 20 30  K_REGISTER, 0, 0
34d0: 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28  , pToken);.  if(
34e0: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74   p==0 ){.    ret
34f0: 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  urn 0;  /* Mallo
3500: 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a  c failed */.  }.
3510: 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 61 74    p->iTable = at
3520: 6f 69 28 28 63 68 61 72 2a 29 26 70 54 6f 6b 65  oi((char*)&pToke
3530: 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 72 65 74 75  n->z[1]);.  retu
3540: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a  rn p;.}../*.** J
3550: 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69  oin two expressi
3560: 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44  ons using an AND
3570: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65   operator.  If e
3580: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
3590: 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65   is.** NULL, the
35a0: 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68  n just return th
35b0: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
35c0: 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  on..*/.Expr *sql
35d0: 69 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69  ite3ExprAnd(sqli
35e0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
35f0: 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67  Left, Expr *pRig
3600: 68 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74  ht){.  if( pLeft
3610: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
3620: 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73  n pRight;.  }els
3630: 65 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20  e if( pRight==0 
3640: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c  ){.    return pL
3650: 65 66 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  eft;.  }else{.  
3660: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3670: 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 4e 44 2c  Expr(db, TK_AND,
3680: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
3690: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
36a0: 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 73 70   Set the Expr.sp
36b0: 61 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  an field of the 
36c0: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
36d0: 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20   to span all.** 
36e0: 74 65 78 74 20 62 65 74 77 65 65 6e 20 74 68 65  text between the
36f0: 20 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65 6e   two given token
3700: 73 2e 20 20 42 6f 74 68 20 74 6f 6b 65 6e 73 20  s.  Both tokens 
3710: 6d 75 73 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  must be pointing
3720: 0a 2a 2a 20 61 74 20 74 68 65 20 73 61 6d 65 20  .** at the same 
3730: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  string..*/.void 
3740: 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28  sqlite3ExprSpan(
3750: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b  Expr *pExpr, Tok
3760: 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e  en *pLeft, Token
3770: 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 61 73 73   *pRight){.  ass
3780: 65 72 74 28 20 70 52 69 67 68 74 21 3d 30 20 29  ert( pRight!=0 )
3790: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66  ;.  assert( pLef
37a0: 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45  t!=0 );.  if( pE
37b0: 78 70 72 20 29 7b 0a 20 20 20 20 70 45 78 70 72  xpr ){.    pExpr
37c0: 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74  ->span.z = pLeft
37d0: 2d 3e 7a 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ->z;.    pExpr->
37e0: 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68 74 2d  span.n = pRight-
37f0: 3e 6e 20 2b 20 28 70 52 69 67 68 74 2d 3e 7a 20  >n + (pRight->z 
3800: 2d 20 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20 20 7d  - pLeft->z);.  }
3810: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
3820: 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73  uct a new expres
3830: 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20  sion node for a 
3840: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75  function with mu
3850: 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65  ltiple.** argume
3860: 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  nts..*/.Expr *sq
3870: 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f  lite3ExprFunctio
3880: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
3890: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
38a0: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
38b0: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
38c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
38d0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
38e0: 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a  sert( pToken );.
38f0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
3900: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
3910: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b   sizeof(Expr) );
3920: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
3930: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
3940: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
3950: 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64  pList); /* Avoid
3960: 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20   leaking memory 
3970: 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  when malloc fail
3980: 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  s */.    return 
3990: 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f  0;.  }.  pNew->o
39a0: 70 20 3d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3b  p = TK_FUNCTION;
39b0: 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d  .  pNew->pList =
39c0: 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74   pList;.  assert
39d0: 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30  ( pToken->dyn==0
39e0: 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 74 6f 6b 65   );.  pNew->toke
39f0: 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 70  n = *pToken;.  p
3a00: 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77  New->span = pNew
3a10: 2d 3e 74 6f 6b 65 6e 3b 0a 0a 20 20 73 71 6c 69  ->token;..  sqli
3a20: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
3a30: 28 70 50 61 72 73 65 2c 20 70 4e 65 77 29 3b 0a  (pParse, pNew);.
3a40: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
3a50: 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 61  ../*.** Assign a
3a60: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
3a70: 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f   to an expressio
3a80: 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73 20 61  n that encodes a
3a90: 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 6e 20   wildcard.** in 
3aa0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
3ab0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a   statement.  .**
3ac0: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 63 6f  .** Wildcards co
3ad0: 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69  nsisting of a si
3ae0: 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61 73 73  ngle "?" are ass
3af0: 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74 20 73  igned the next s
3b00: 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76 61 72  equential.** var
3b10: 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a  iable number..**
3b20: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
3b30: 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22   the form "?nnn"
3b40: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
3b50: 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22 2e 20  e number "nnn". 
3b60: 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65   We make.** sure
3b70: 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20 74 6f   "nnn" is not to
3b80: 6f 20 62 65 20 74 6f 20 61 76 6f 69 64 20 61 20  o be to avoid a 
3b90: 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76 69 63  denial of servic
3ba0: 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a  e attack when.**
3bb0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
3bc0: 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e  nt comes from an
3bd0: 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72 63 65   external source
3be0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
3bf0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3a  s of the form ":
3c00: 61 61 61 22 20 6f 72 20 22 24 61 61 61 22 20 61  aaa" or "$aaa" a
3c10: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
3c20: 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61  same number.** a
3c30: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69  s the previous i
3c40: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73  nstance of the s
3c50: 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f  ame wildcard.  O
3c60: 72 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  r if this is the
3c70: 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e   first.** instan
3c80: 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61  ce of the wildca
3c90: 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71  rd, the next seq
3ca0: 75 65 6e 69 61 6c 20 76 61 72 69 61 62 6c 65 20  uenial variable 
3cb0: 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73  number is.** ass
3cc0: 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  igned..*/.void s
3cd0: 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e  qlite3ExprAssign
3ce0: 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20  VarNumber(Parse 
3cf0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
3d00: 45 78 70 72 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a  Expr){.  Token *
3d10: 70 54 6f 6b 65 6e 3b 0a 20 20 73 71 6c 69 74 65  pToken;.  sqlite
3d20: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
3d30: 64 62 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  db;..  if( pExpr
3d40: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
3d50: 70 54 6f 6b 65 6e 20 3d 20 26 70 45 78 70 72 2d  pToken = &pExpr-
3d60: 3e 74 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74  >token;.  assert
3d70: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29  ( pToken->n>=1 )
3d80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
3d90: 65 6e 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 61 73  en->z!=0 );.  as
3da0: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b  sert( pToken->z[
3db0: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  0]!=0 );.  if( p
3dc0: 54 6f 6b 65 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20  Token->n==1 ){. 
3dd0: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
3de0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20  f the form "?". 
3df0: 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74   Assign the next
3e00: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
3e10: 20 2a 2f 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   */.    pExpr->i
3e20: 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65  Table = ++pParse
3e30: 2d 3e 6e 56 61 72 3b 0a 20 20 7d 65 6c 73 65 20  ->nVar;.  }else 
3e40: 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d  if( pToken->z[0]
3e50: 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 2f 2a 20  =='?' ){.    /* 
3e60: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
3e70: 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f  form "?nnn".  Co
3e80: 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61  nvert "nnn" to a
3e90: 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20  n integer and.  
3ea0: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
3eb0: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
3ec0: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  er */.    int i;
3ed0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
3ee0: 6c 65 20 3d 20 69 20 3d 20 61 74 6f 69 28 28 63  le = i = atoi((c
3ef0: 68 61 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b  har*)&pToken->z[
3f00: 31 5d 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  1]);.    testcas
3f10: 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 74  e( i==0 );.    t
3f20: 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29 3b  estcase( i==1 );
3f30: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
3f40: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
3f50: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
3f60: 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b 0a  LE_NUMBER]-1 );.
3f70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
3f80: 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  =db->aLimit[SQLI
3f90: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
3fa0: 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20  E_NUMBER] );.   
3fb0: 20 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e 64 62   if( i<1 || i>db
3fc0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
3fd0: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
3fe0: 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20 20  UMBER] ){.      
3ff0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4000: 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62 6c  pParse, "variabl
4010: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62 65  e number must be
4020: 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64 20   between ?1 and 
4030: 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ?%d",.          
4040: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
4050: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
4060: 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20 7d  _NUMBER]);.    }
4070: 0a 20 20 20 20 69 66 28 20 69 3e 70 50 61 72 73  .    if( i>pPars
4080: 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20  e->nVar ){.     
4090: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
40a0: 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  i;.    }.  }else
40b0: 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72  {.    /* Wildcar
40c0: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
40d0: 3a 61 61 61 22 20 6f 72 20 22 24 61 61 61 22 2e  :aaa" or "$aaa".
40e0: 20 20 52 65 75 73 65 20 74 68 65 20 73 61 6d 65    Reuse the same
40f0: 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
4100: 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 70   number as the p
4110: 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65 20  rior appearance 
4120: 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
4130: 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d 65  , or if the name
4140: 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65  .    ** has neve
4150: 72 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72  r appeared befor
4160: 65 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  e, reuse the sam
4170: 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  e variable numbe
4180: 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  r.    */.    int
4190: 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 70   i, n;.    n = p
41a0: 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20 20 20 66 6f  Token->n;.    fo
41b0: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
41c0: 3e 6e 56 61 72 45 78 70 72 3b 20 69 2b 2b 29 7b  >nVarExpr; i++){
41d0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b  .      Expr *pE;
41e0: 0a 20 20 20 20 20 20 69 66 28 20 28 70 45 20 3d  .      if( (pE =
41f0: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
4200: 70 72 5b 69 5d 29 21 3d 30 0a 20 20 20 20 20 20  pr[i])!=0.      
4210: 20 20 20 20 26 26 20 70 45 2d 3e 74 6f 6b 65 6e      && pE->token
4220: 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20 20 20 20 20  .n==n.          
4230: 26 26 20 6d 65 6d 63 6d 70 28 70 45 2d 3e 74 6f  && memcmp(pE->to
4240: 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  ken.z, pToken->z
4250: 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , n)==0 ){.     
4260: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
4270: 20 3d 20 70 45 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pE->iTable;. 
4280: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4290: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
42a0: 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e  if( i>=pParse->n
42b0: 56 61 72 45 78 70 72 20 29 7b 0a 20 20 20 20 20  VarExpr ){.     
42c0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
42d0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b   ++pParse->nVar;
42e0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
42f0: 65 2d 3e 6e 56 61 72 45 78 70 72 3e 3d 70 50 61  e->nVarExpr>=pPa
4300: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c  rse->nVarExprAll
4310: 6f 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  oc-1 ){.        
4320: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
4330: 41 6c 6c 6f 63 20 2b 3d 20 70 50 61 72 73 65 2d  Alloc += pParse-
4340: 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b  >nVarExprAlloc +
4350: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61   10;.        pPa
4360: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 20 3d  rse->apVarExpr =
4370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
4380: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
4390: 72 65 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  ree(.           
43a0: 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 20 20     db,.         
43b0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56       pParse->apV
43c0: 61 72 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  arExpr,.        
43d0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
43e0: 61 72 45 78 70 72 41 6c 6c 6f 63 2a 73 69 7a 65  arExprAlloc*size
43f0: 6f 66 28 70 50 61 72 73 65 2d 3e 61 70 56 61 72  of(pParse->apVar
4400: 45 78 70 72 5b 30 5d 29 0a 20 20 20 20 20 20 20  Expr[0]).       
4410: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
4420: 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d        if( !db->m
4430: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
4440: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
4450: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
4460: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
4470: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
4480: 5b 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  [pParse->nVarExp
4490: 72 2b 2b 5d 20 3d 20 70 45 78 70 72 3b 0a 20 20  r++] = pExpr;.  
44a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
44b0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
44c0: 6e 45 72 72 20 26 26 20 70 50 61 72 73 65 2d 3e  nErr && pParse->
44d0: 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  nVar>db->aLimit[
44e0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
44f0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
4500: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
4510: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
4520: 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61  o many SQL varia
4530: 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bles");.  }.}../
4540: 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79  *.** Recursively
4550: 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65   delete an expre
4560: 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76  ssion tree..*/.v
4570: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44  oid sqlite3ExprD
4580: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
4590: 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  b, Expr *p){.  i
45a0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
45b0: 3b 0a 20 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e  ;.  if( p->span.
45c0: 64 79 6e 20 29 20 73 71 6c 69 74 65 33 44 62 46  dyn ) sqlite3DbF
45d0: 72 65 65 28 64 62 2c 20 28 63 68 61 72 2a 29 70  ree(db, (char*)p
45e0: 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 69 66 28  ->span.z);.  if(
45f0: 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 20   p->token.dyn ) 
4600: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4610: 2c 20 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65  , (char*)p->toke
4620: 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  n.z);.  sqlite3E
4630: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
4640: 3e 70 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74  >pLeft);.  sqlit
4650: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
4660: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 73   p->pRight);.  s
4670: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
4680: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 73  lete(db, p->pLis
4690: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  t);.  sqlite3Sel
46a0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
46b0: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  >pSelect);.  sql
46c0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
46d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
46e0: 45 78 70 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64  Expr.token field
46f0: 20 6d 69 67 68 74 20 62 65 20 61 20 73 74 72 69   might be a stri
4700: 6e 67 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20  ng literal that 
4710: 69 73 20 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66  is quoted..** If
4720: 20 73 6f 2c 20 72 65 6d 6f 76 65 20 74 68 65 20   so, remove the 
4730: 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 2e  quotation marks.
4740: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4750: 44 65 71 75 6f 74 65 45 78 70 72 28 73 71 6c 69  DequoteExpr(sqli
4760: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
4770: 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ){.  if( ExprHas
4780: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45  AnyProperty(p, E
4790: 50 5f 44 65 71 75 6f 74 65 64 29 20 29 7b 0a 20  P_Dequoted) ){. 
47a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
47b0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
47c0: 28 70 2c 20 45 50 5f 44 65 71 75 6f 74 65 64 29  (p, EP_Dequoted)
47d0: 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e  ;.  if( p->token
47e0: 2e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73  .dyn==0 ){.    s
47f0: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
4800: 64 62 2c 20 26 70 2d 3e 74 6f 6b 65 6e 2c 20 26  db, &p->token, &
4810: 70 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20  p->token);.  }. 
4820: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
4830: 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e  (char*)p->token.
4840: 7a 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  z);.}.../*.** Th
4850: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75  e following grou
4860: 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61  p of routines ma
4870: 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f  ke deep copies o
4880: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a  f expressions,.*
4890: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
48a0: 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e  ts, ID lists, an
48b0: 64 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d select stateme
48c0: 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73  nts.  The copies
48d0: 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74   can.** be delet
48e0: 65 64 20 28 62 79 20 62 65 69 6e 67 20 70 61 73  ed (by being pas
48f0: 73 65 64 20 74 6f 20 74 68 65 69 72 20 72 65 73  sed to their res
4900: 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74  pective ...Delet
4910: 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a  e() routines).**
4920: 20 77 69 74 68 6f 75 74 20 65 66 66 65 63 74 69   without effecti
4930: 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73  ng the originals
4940: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72  ..**.** The expr
4950: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c  ession list, ID,
4960: 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74   and source list
4970: 73 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69  s return by sqli
4980: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29  te3ExprListDup()
4990: 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69  ,.** sqlite3IdLi
49a0: 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c  stDup(), and sql
49b0: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 29  ite3SrcListDup()
49c0: 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74   can not be furt
49d0: 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a  her expanded .**
49e0: 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
49f0: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c  alls to sqlite*L
4a00: 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74  istAppend() rout
4a10: 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  ines..**.** Any 
4a20: 74 61 62 6c 65 73 20 74 68 61 74 20 74 68 65 20  tables that the 
4a30: 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f  SrcList might po
4a40: 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64  int to are not d
4a50: 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a 45 78  uplicated..*/.Ex
4a60: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44  pr *sqlite3ExprD
4a70: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
4a80: 45 78 70 72 20 2a 70 29 7b 0a 20 20 45 78 70 72  Expr *p){.  Expr
4a90: 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d   *pNew;.  if( p=
4aa0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4ab0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
4ac0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
4ad0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
4ae0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
4af0: 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28  urn 0;.  memcpy(
4b00: 70 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66 28  pNew, p, sizeof(
4b10: 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70  *pNew));.  if( p
4b20: 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a  ->token.z!=0 ){.
4b30: 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e      pNew->token.
4b40: 7a 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33  z = (u8*)sqlite3
4b50: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
4b60: 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c  har*)p->token.z,
4b70: 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20   p->token.n);.  
4b80: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79    pNew->token.dy
4b90: 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n = 1;.  }else{.
4ba0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
4bb0: 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a  ->token.z==0 );.
4bc0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e    }.  pNew->span
4bd0: 2e 7a 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  .z = 0;.  pNew->
4be0: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
4bf0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
4c00: 65 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52  eft);.  pNew->pR
4c10: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
4c20: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69  prDup(db, p->pRi
4c30: 67 68 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  ght);.  pNew->pL
4c40: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
4c50: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
4c60: 70 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  pList);.  pNew->
4c70: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
4c80: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
4c90: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65  ->pSelect);.  re
4ca0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69  turn pNew;.}.voi
4cb0: 64 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f  d sqlite3TokenCo
4cc0: 70 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  py(sqlite3 *db, 
4cd0: 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65  Token *pTo, Toke
4ce0: 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  n *pFrom){.  if(
4cf0: 20 70 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c 69   pTo->dyn ) sqli
4d00: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 28 63  te3DbFree(db, (c
4d10: 68 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20  har*)pTo->z);.  
4d20: 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a  if( pFrom->z ){.
4d30: 20 20 20 20 70 54 6f 2d 3e 6e 20 3d 20 70 46 72      pTo->n = pFr
4d40: 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e  om->n;.    pTo->
4d50: 7a 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33  z = (u8*)sqlite3
4d60: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
4d70: 68 61 72 2a 29 70 46 72 6f 6d 2d 3e 7a 2c 20 70  har*)pFrom->z, p
4d80: 46 72 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54  From->n);.    pT
4d90: 6f 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65  o->dyn = 1;.  }e
4da0: 6c 73 65 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20  lse{.    pTo->z 
4db0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c  = 0;.  }.}.ExprL
4dc0: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
4dd0: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
4de0: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
4df0: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
4e00: 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78  New;.  struct Ex
4e10: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
4e20: 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20  em, *pOldItem;. 
4e30: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
4e40: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4e50: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
4e60: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
4e70: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
4e80: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
4e90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
4ea0: 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 30 3b 0a  ->iECursor = 0;.
4eb0: 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20    pNew->nExpr = 
4ec0: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
4ed0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77 2d  ->nExpr;.  pNew-
4ee0: 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c  >a = pItem = sql
4ef0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
4f00: 64 62 2c 20 20 70 2d 3e 6e 45 78 70 72 2a 73 69  db,  p->nExpr*si
4f10: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
4f20: 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20  .  if( pItem==0 
4f30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
4f40: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
4f50: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4f60: 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20  } .  pOldItem = 
4f70: 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  p->a;.  for(i=0;
4f80: 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b   i<p->nExpr; i++
4f90: 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49  , pItem++, pOldI
4fa0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
4fb0: 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a 70 4f 6c   *pNewExpr, *pOl
4fc0: 64 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d  dExpr;.    pItem
4fd0: 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65 77 45 78  ->pExpr = pNewEx
4fe0: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
4ff0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72  Dup(db, pOldExpr
5000: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78   = pOldItem->pEx
5010: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  pr);.    if( pOl
5020: 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30  dExpr->span.z!=0
5030: 20 26 26 20 70 4e 65 77 45 78 70 72 20 29 7b 0a   && pNewExpr ){.
5040: 20 20 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20        /* Always 
5050: 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
5060: 68 65 20 73 70 61 6e 20 66 6f 72 20 74 6f 70 2d  he span for top-
5070: 6c 65 76 65 6c 20 65 78 70 72 65 73 73 69 6f 6e  level expression
5080: 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  s in the.      *
5090: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
50a0: 74 2e 20 20 54 68 65 20 6c 6f 67 69 63 20 69 6e  t.  The logic in
50b0: 20 53 45 4c 45 43 54 20 70 72 6f 63 65 73 73 69   SELECT processi
50c0: 6e 67 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  ng that determin
50d0: 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  es.      ** the 
50e0: 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  names of columns
50f0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
5100: 65 74 20 6e 65 65 64 73 20 74 68 69 73 20 69 6e  et needs this in
5110: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
5120: 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43     sqlite3TokenC
5130: 6f 70 79 28 64 62 2c 20 26 70 4e 65 77 45 78 70  opy(db, &pNewExp
5140: 72 2d 3e 73 70 61 6e 2c 20 26 70 4f 6c 64 45 78  r->span, &pOldEx
5150: 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d  pr->span);.    }
5160: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
5170: 77 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 65 77  wExpr==0 || pNew
5180: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20  Expr->span.z!=0 
5190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
51a0: 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  pOldExpr->span.z
51b0: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
51c0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
51d0: 6c 65 64 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  led );.    pItem
51e0: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
51f0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
5200: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
5210: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f      pItem->sortO
5220: 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rder = pOldItem-
5230: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
5240: 70 49 74 65 6d 2d 3e 69 73 41 67 67 20 3d 20 70  pItem->isAgg = p
5250: 4f 6c 64 49 74 65 6d 2d 3e 69 73 41 67 67 3b 0a  OldItem->isAgg;.
5260: 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20      pItem->done 
5270: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
5280: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
5290: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
52a0: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
52b0: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
52c0: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
52d0: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
52e0: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
52f0: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
5300: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
5310: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
5320: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
5330: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
5340: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
5350: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
5360: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
5370: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
5380: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
5390: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
53a0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
53b0: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
53c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
53d0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
53e0: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
53f0: 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  cListDup(sqlite3
5400: 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
5410: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  ){.  SrcList *pN
5420: 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ew;.  int i;.  i
5430: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20  nt nByte;.  if( 
5440: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
5450: 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
5460: 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63  f(*p) + (p->nSrc
5470: 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61  >0 ? sizeof(p->a
5480: 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d  [0]) * (p->nSrc-
5490: 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20  1) : 0);.  pNew 
54a0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
54b0: 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65 20 29  cRaw(db, nByte )
54c0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
54d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
54e0: 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d  ew->nSrc = pNew-
54f0: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72  >nAlloc = p->nSr
5500: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
5510: 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  p->nSrc; i++){. 
5520: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
5530: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
5540: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
5550: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
5560: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
5570: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
5580: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
5590: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61     pNewItem->zDa
55a0: 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
55b0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
55c0: 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  dItem->zDatabase
55d0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
55e0: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
55f0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
5600: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
5610: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c     pNewItem->zAl
5620: 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ias = sqlite3DbS
5630: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
5640: 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
5650: 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74   pNewItem->joint
5660: 79 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ype = pOldItem->
5670: 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e  jointype;.    pN
5680: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
5690: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
56a0: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
56b0: 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d  m->isPopulated =
56c0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 50 6f 70   pOldItem->isPop
56d0: 75 6c 61 74 65 64 3b 0a 20 20 20 20 70 54 61 62  ulated;.    pTab
56e0: 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61   = pNewItem->pTa
56f0: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54  b = pOldItem->pT
5700: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
5710: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
5720: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRef++;.    }.  
5730: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c    pNewItem->pSel
5740: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
5750: 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  ectDup(db, pOldI
5760: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  tem->pSelect);. 
5770: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e     pNewItem->pOn
5780: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
5790: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
57a0: 70 4f 6e 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  pOn);.    pNewIt
57b0: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
57c0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62  ite3IdListDup(db
57d0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69  , pOldItem->pUsi
57e0: 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ng);.    pNewIte
57f0: 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c  m->colUsed = pOl
5800: 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  dItem->colUsed;.
5810: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
5820: 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c  w;.}.IdList *sql
5830: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71  ite3IdListDup(sq
5840: 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
5850: 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20  t *p){.  IdList 
5860: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
5870: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
5880: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
5890: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
58a0: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
58b0: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
58c0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
58d0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20  ;.  pNew->nId = 
58e0: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
58f0: 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61  ->nId;.  pNew->a
5900: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
5910: 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64  ocRaw(db, p->nId
5920: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
5930: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
5940: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  a==0 ){.    sqli
5950: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e  te3DbFree(db, pN
5960: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
5970: 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  0;.  }.  for(i=0
5980: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
5990: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
59a0: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
59b0: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
59c0: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  ;.    struct IdL
59d0: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
59e0: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
59f0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
5a00: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
5a10: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
5a20: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
5a30: 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70  NewItem->idx = p
5a40: 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20  OldItem->idx;.  
5a50: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
5a60: 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  .}.Select *sqlit
5a70: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
5a80: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
5a90: 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  *p){.  Select *p
5aa0: 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  New;.  if( p==0 
5ab0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
5ac0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
5ad0: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
5ae0: 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
5af0: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
5b00: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69   0;.  pNew->isDi
5b10: 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69  stinct = p->isDi
5b20: 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e  stinct;.  pNew->
5b30: 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
5b40: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
5b50: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e  p->pEList);.  pN
5b60: 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  ew->pSrc = sqlit
5b70: 65 33 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c  e3SrcListDup(db,
5b80: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65   p->pSrc);.  pNe
5b90: 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  w->pWhere = sqli
5ba0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
5bb0: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e 65  ->pWhere);.  pNe
5bc0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
5bd0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
5be0: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
5bf0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  );.  pNew->pHavi
5c00: 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ng = sqlite3Expr
5c10: 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69  Dup(db, p->pHavi
5c20: 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  ng);.  pNew->pOr
5c30: 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
5c40: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
5c50: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70  ->pOrderBy);.  p
5c60: 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b  New->op = p->op;
5c70: 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20  .  pNew->pPrior 
5c80: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
5c90: 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  up(db, p->pPrior
5ca0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  );.  pNew->pLimi
5cb0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
5cc0: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  up(db, p->pLimit
5cd0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73  );.  pNew->pOffs
5ce0: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
5cf0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  Dup(db, p->pOffs
5d00: 65 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69  et);.  pNew->iLi
5d10: 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  mit = 0;.  pNew-
5d20: 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >iOffset = 0;.  
5d30: 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c 76 65 64  pNew->isResolved
5d40: 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64   = p->isResolved
5d50: 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41 67 67 20  ;.  pNew->isAgg 
5d60: 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 70 4e  = p->isAgg;.  pN
5d70: 65 77 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20 30  ew->usesEphm = 0
5d80: 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 73 61 6c 6c  ;.  pNew->disall
5d90: 6f 77 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  owOrderBy = 0;. 
5da0: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73   pNew->pRightmos
5db0: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 61  t = 0;.  pNew->a
5dc0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
5dd0: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
5de0: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d  rOpenEphm[1] = -
5df0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  1;.  pNew->addrO
5e00: 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b  penEphm[2] = -1;
5e10: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
5e20: 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a  }.#else.Select *
5e30: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
5e40: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
5e50: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 61 73 73 65  lect *p){.  asse
5e60: 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65  rt( p==0 );.  re
5e70: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
5e80: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  .../*.** Add a n
5e90: 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
5ea0: 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72  e end of an expr
5eb0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66  ession list.  If
5ec0: 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69   pList is.** ini
5ed0: 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65  tially NULL, the
5ee0: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65  n create a new e
5ef0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
5f00: 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  */.ExprList *sql
5f10: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
5f20: 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nd(.  Parse *pPa
5f30: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
5f40: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
5f50: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
5f60: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
5f70: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
5f80: 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20  o append. Might 
5f90: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
5fa0: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
5fb0: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
5fc0: 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  on to be appende
5fd0: 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  d */.  Token *pN
5fe0: 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 2f  ame            /
5ff0: 2a 20 41 53 20 6b 65 79 77 6f 72 64 20 66 6f 72  * AS keyword for
6000: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6010: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
6020: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
6030: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
6040: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
6050: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
6060: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  ero(db, sizeof(E
6070: 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  xprList) );.    
6080: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
6090: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
60a0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  m;.    }.    ass
60b0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  ert( pList->nAll
60c0: 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69  oc==0 );.  }.  i
60d0: 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  f( pList->nAlloc
60e0: 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <=pList->nExpr )
60f0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
6100: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  rList_item *a;. 
6110: 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74     int n = pList
6120: 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a  ->nAlloc*2 + 4;.
6130: 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44      a = sqlite3D
6140: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69  bRealloc(db, pLi
6150: 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28  st->a, n*sizeof(
6160: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
6170: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
6180: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
6190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
61a0: 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20 70 4c  t->a = a;.    pL
61b0: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 3b  ist->nAlloc = n;
61c0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
61d0: 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20  List->a!=0 );.  
61e0: 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e 61  if( pExpr || pNa
61f0: 6d 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  me ){.    struct
6200: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
6210: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
6220: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b  a[pList->nExpr++
6230: 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ];.    memset(pI
6240: 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  tem, 0, sizeof(*
6250: 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74  pItem));.    pIt
6260: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
6270: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
6280: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  (db, pName);.   
6290: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
62a0: 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74  pExpr;.  }.  ret
62b0: 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d  urn pList;..no_m
62c0: 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76  em:     .  /* Av
62d0: 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f  oid leaking memo
62e0: 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73  ry if malloc has
62f0: 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71   failed. */.  sq
6300: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6310: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71  db, pExpr);.  sq
6320: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
6330: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
6340: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
6350: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
6360: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69  ession list pELi
6370: 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65  st contains more
6380: 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65   than iLimit ele
6390: 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20  ments,.** leave 
63a0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
63b0: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76   in pParse..*/.v
63c0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
63d0: 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a  istCheckLength(.
63e0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
63f0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
6400: 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ist,.  const cha
6410: 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20  r *zObject.){.  
6420: 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d  int mx = pParse-
6430: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
6440: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
6450: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
6460: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
6470: 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74  nExpr==mx );.  t
6480: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
6490: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
64a0: 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20  ==mx+1 );.  if( 
64b0: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
64c0: 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20  ->nExpr>mx ){.  
64d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
64e0: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
64f0: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25  any columns in %
6500: 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20  s", zObject);.  
6510: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
6520: 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72  e an entire expr
6530: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
6540: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
6550: 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
6560: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
6570: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
6580: 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  i;.  struct Expr
6590: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
65a0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
65b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
65c0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30  ert( pList->a!=0
65d0: 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70   || (pList->nExp
65e0: 72 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e  r==0 && pList->n
65f0: 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61  Alloc==0) );.  a
6600: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
6610: 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c  xpr<=pList->nAll
6620: 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65  oc );.  for(pIte
6630: 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
6640: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
6650: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
6660: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6670: 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
6680: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
6690: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
66a0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
66b0: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
66c0: 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b  e(db, pList->a);
66d0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
66e0: 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
66f0: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
6700: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
6710: 43 61 6c 6c 20 78 46 75 6e 63 20 66 6f 72 20 65  Call xFunc for e
6720: 61 63 68 20 6e 6f 64 65 20 76 69 73 69 74 65 64  ach node visited
6730: 2e 20 20 78 46 75 6e 63 0a 2a 2a 20 69 73 20 63  .  xFunc.** is c
6740: 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 6f 64  alled on the nod
6750: 65 20 62 65 66 6f 72 65 20 78 46 75 6e 63 20 69  e before xFunc i
6760: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
6770: 6e 6f 64 65 73 20 63 68 69 6c 64 72 65 6e 2e 0a  nodes children..
6780: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
6790: 20 76 61 6c 75 65 20 66 72 6f 6d 20 78 46 75 6e   value from xFun
67a0: 63 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  c determines whe
67b0: 74 68 65 72 20 74 68 65 20 74 72 65 65 20 77 61  ther the tree wa
67c0: 6c 6b 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 2a 2a  lk continues..**
67d0: 20 30 20 6d 65 61 6e 73 20 63 6f 6e 74 69 6e 75   0 means continu
67e0: 65 20 77 61 6c 6b 69 6e 67 20 74 68 65 20 74 72  e walking the tr
67f0: 65 65 2e 20 20 31 20 6d 65 61 6e 73 20 64 6f 20  ee.  1 means do 
6800: 6e 6f 74 20 77 61 6c 6b 20 63 68 69 6c 64 72 65  not walk childre
6810: 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 63 75 72 72  n.** of the curr
6820: 65 6e 74 20 6e 6f 64 65 20 62 75 74 20 63 6f 6e  ent node but con
6830: 74 69 6e 75 65 20 77 69 74 68 20 73 69 62 6c 69  tinue with sibli
6840: 6e 67 73 2e 20 20 32 20 6d 65 61 6e 73 20 61 62  ngs.  2 means ab
6850: 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20 74 72 65  andon.** the tre
6860: 65 20 77 61 6c 6b 20 63 6f 6d 70 6c 65 74 65 6c  e walk completel
6870: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  y..**.** The ret
6880: 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  urn value from t
6890: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 31  his routine is 1
68a0: 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20   to abandon the 
68b0: 74 72 65 65 20 77 61 6c 6b 0a 2a 2a 20 61 6e 64  tree walk.** and
68c0: 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a   0 to continue..
68d0: 2a 2a 0a 2a 2a 20 4e 4f 54 49 43 45 3a 20 20 54  **.** NOTICE:  T
68e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
68f0: 20 2a 6e 6f 74 2a 20 64 65 73 63 65 6e 64 20 69   *not* descend i
6900: 6e 74 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a  nto subqueries..
6910: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61  */.static int wa
6920: 6c 6b 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  lkExprList(ExprL
6930: 69 73 74 20 2a 2c 20 69 6e 74 20 28 2a 29 28 76  ist *, int (*)(v
6940: 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76  oid *, Expr*), v
6950: 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69 63 20 69  oid *);.static i
6960: 6e 74 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  nt walkExprTree(
6970: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
6980: 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 2a 2c   (*xFunc)(void*,
6990: 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41  Expr*), void *pA
69a0: 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  rg){.  int rc;. 
69b0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
69c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d  return 0;.  rc =
69d0: 20 28 2a 78 46 75 6e 63 29 28 70 41 72 67 2c 20   (*xFunc)(pArg, 
69e0: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 72 63  pExpr);.  if( rc
69f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77  ==0 ){.    if( w
6a00: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70  alkExprTree(pExp
6a10: 72 2d 3e 70 4c 65 66 74 2c 20 78 46 75 6e 63 2c  r->pLeft, xFunc,
6a20: 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   pArg) ) return 
6a30: 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45  1;.    if( walkE
6a40: 78 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70  xprTree(pExpr->p
6a50: 52 69 67 68 74 2c 20 78 46 75 6e 63 2c 20 70 41  Right, xFunc, pA
6a60: 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  rg) ) return 1;.
6a70: 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72      if( walkExpr
6a80: 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73  List(pExpr->pLis
6a90: 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20  t, xFunc, pArg) 
6aa0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
6ab0: 20 20 72 65 74 75 72 6e 20 72 63 3e 31 3b 0a 7d    return rc>1;.}
6ac0: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c  ../*.** Call wal
6ad0: 6b 45 78 70 72 54 72 65 65 28 29 20 66 6f 72 20  kExprTree() for 
6ae0: 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
6af0: 20 69 6e 20 6c 69 73 74 20 70 2e 0a 2a 2f 0a 73   in list p..*/.s
6b00: 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78  tatic int walkEx
6b10: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
6b20: 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63 29  *p, int (*xFunc)
6b30: 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c  (void *, Expr*),
6b40: 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
6b50: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
6b60: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
6b70: 49 74 65 6d 3b 0a 20 20 69 66 28 20 21 70 20 29  Item;.  if( !p )
6b80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72   return 0;.  for
6b90: 28 69 3d 70 2d 3e 6e 45 78 70 72 2c 20 70 49 74  (i=p->nExpr, pIt
6ba0: 65 6d 3d 70 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  em=p->a; i>0; i-
6bb0: 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
6bc0: 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65   if( walkExprTre
6bd0: 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  e(pItem->pExpr, 
6be0: 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72  xFunc, pArg) ) r
6bf0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
6c00: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
6c10: 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54  * Call walkExprT
6c20: 72 65 65 28 29 20 66 6f 72 20 65 76 65 72 79 20  ree() for every 
6c30: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 53 65  expression in Se
6c40: 6c 65 63 74 20 70 2c 20 6e 6f 74 20 69 6e 63 6c  lect p, not incl
6c50: 75 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73  uding.** express
6c60: 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 70 61  ions that are pa
6c70: 72 74 20 6f 66 20 73 75 62 2d 73 65 6c 65 63 74  rt of sub-select
6c80: 73 20 69 6e 20 61 6e 79 20 46 52 4f 4d 20 63 6c  s in any FROM cl
6c90: 61 75 73 65 20 6f 72 20 74 68 65 20 4c 49 4d 49  ause or the LIMI
6ca0: 54 0a 2a 2a 20 6f 72 20 4f 46 46 53 45 54 20 65  T.** or OFFSET e
6cb0: 78 70 72 65 73 73 69 6f 6e 73 2e 2e 0a 2a 2f 0a  xpressions...*/.
6cc0: 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 53  static int walkS
6cd0: 65 6c 65 63 74 45 78 70 72 28 53 65 6c 65 63 74  electExpr(Select
6ce0: 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63   *p, int (*xFunc
6cf0: 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29  )(void *, Expr*)
6d00: 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
6d10: 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d   walkExprList(p-
6d20: 3e 70 45 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20  >pEList, xFunc, 
6d30: 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70  pArg);.  walkExp
6d40: 72 54 72 65 65 28 70 2d 3e 70 57 68 65 72 65 2c  rTree(p->pWhere,
6d50: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20   xFunc, pArg);. 
6d60: 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d   walkExprList(p-
6d70: 3e 70 47 72 6f 75 70 42 79 2c 20 78 46 75 6e 63  >pGroupBy, xFunc
6d80: 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45  , pArg);.  walkE
6d90: 78 70 72 54 72 65 65 28 70 2d 3e 70 48 61 76 69  xprTree(p->pHavi
6da0: 6e 67 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  ng, xFunc, pArg)
6db0: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  ;.  walkExprList
6dc0: 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 78 46  (p->pOrderBy, xF
6dd0: 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 69 66  unc, pArg);.  if
6de0: 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
6df0: 20 20 20 77 61 6c 6b 53 65 6c 65 63 74 45 78 70     walkSelectExp
6e00: 72 28 70 2d 3e 70 50 72 69 6f 72 2c 20 78 46 75  r(p->pPrior, xFu
6e10: 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 20  nc, pArg);.  }. 
6e20: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
6e30: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6e40: 65 20 69 73 20 64 65 73 69 67 6e 65 64 20 61 73  e is designed as
6e50: 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61   an xFunc for wa
6e60: 6c 6b 45 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a  lkExprTree()..**
6e70: 0a 2a 2a 20 70 41 72 67 20 69 73 20 72 65 61 6c  .** pArg is real
6e80: 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
6e90: 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20  an integer.  If 
6ea0: 77 65 20 63 61 6e 20 74 65 6c 6c 20 62 79 20 6c  we can tell by l
6eb0: 6f 6f 6b 69 6e 67 0a 2a 2a 20 61 74 20 70 45 78  ooking.** at pEx
6ec0: 70 72 20 74 68 61 74 20 74 68 65 20 65 78 70 72  pr that the expr
6ed0: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74  ession that cont
6ee0: 61 69 6e 73 20 70 45 78 70 72 20 69 73 20 6e 6f  ains pExpr is no
6ef0: 74 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20  t a constant.** 
6f00: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
6f10: 20 73 65 74 20 2a 70 41 72 67 20 74 6f 20 30 20   set *pArg to 0 
6f20: 61 6e 64 20 72 65 74 75 72 6e 20 32 20 74 6f 20  and return 2 to 
6f30: 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65  abandon the tree
6f40: 20 77 61 6c 6b 2e 0a 2a 2a 20 49 66 20 70 45 78   walk..** If pEx
6f50: 70 72 20 64 6f 65 73 20 64 6f 65 73 20 6e 6f 74  pr does does not
6f60: 20 64 69 73 71 75 61 6c 69 66 79 20 74 68 65 20   disqualify the 
6f70: 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
6f80: 62 65 69 6e 67 20 61 20 63 6f 6e 73 74 61 6e 74  being a constant
6f90: 0a 2a 2a 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68  .** then do noth
6fa0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ing..**.** After
6fb0: 20 77 61 6c 6b 69 6e 67 20 74 68 65 20 77 68 6f   walking the who
6fc0: 6c 65 20 74 72 65 65 2c 20 69 66 20 6e 6f 20 6e  le tree, if no n
6fd0: 6f 64 65 73 20 61 72 65 20 66 6f 75 6e 64 20 74  odes are found t
6fe0: 68 61 74 20 64 69 73 71 75 61 6c 69 66 79 0a 2a  hat disqualify.*
6ff0: 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * the expression
7000: 20 61 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68   as constant, th
7010: 65 6e 20 77 65 20 61 73 73 75 6d 65 20 74 68 65  en we assume the
7020: 20 77 68 6f 6c 65 20 65 78 70 72 65 73 73 69 6f   whole expressio
7030: 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 74 61 6e 74  n.** is constant
7040: 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
7050: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 66  prIsConstant() f
7060: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
7070: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
7080: 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64  atic int exprNod
7090: 65 49 73 43 6f 6e 73 74 61 6e 74 28 76 6f 69 64  eIsConstant(void
70a0: 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45   *pArg, Expr *pE
70b0: 78 70 72 29 7b 0a 20 20 69 6e 74 20 2a 70 4e 20  xpr){.  int *pN 
70c0: 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 0a 20  = (int*)pArg;.. 
70d0: 20 2f 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20   /* If *pArg is 
70e0: 33 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20  3 then any term 
70f0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
7100: 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f  n that comes fro
7110: 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72  m.  ** the ON or
7120: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
7130: 66 20 61 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c  f a join disqual
7140: 69 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73  ifies the expres
7150: 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62  sion.  ** from b
7160: 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20  eing considered 
7170: 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69  constant. */.  i
7180: 66 28 20 28 2a 70 4e 29 3d 3d 33 20 26 26 20 45  f( (*pN)==3 && E
7190: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
71a0: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
71b0: 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 2a 70 4e  Join) ){.    *pN
71c0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
71d0: 20 32 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63   2;.  }..  switc
71e0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
71f0: 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20      /* Consider 
7200: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20  functions to be 
7210: 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20  constant if all 
7220: 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20  their arguments 
7230: 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20  are constant.   
7240: 20 2a 2a 20 61 6e 64 20 2a 70 41 72 67 3d 3d 32   ** and *pArg==2
7250: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
7260: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
7270: 69 66 28 20 28 2a 70 4e 29 3d 3d 32 20 29 20 72  if( (*pN)==2 ) r
7280: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f  eturn 0;.      /
7290: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  * Fall through *
72a0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  /.    case TK_ID
72b0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
72c0: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
72d0: 4b 5f 44 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  K_DOT:.    case 
72e0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
72f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
7300: 5f 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e 64 65 66  _COLUMN:.#ifndef
7310: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
7320: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
7330: 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61  K_SELECT:.    ca
7340: 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
7350: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
7360: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
7370: 43 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  CT );.      test
7380: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
7390: 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 23 65  =TK_EXISTS );.#e
73a0: 6e 64 69 66 0a 20 20 20 20 20 20 74 65 73 74 63  ndif.      testc
73b0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
73c0: 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74  TK_ID );.      t
73d0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
73e0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
73f0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7400: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44   pExpr->op==TK_D
7410: 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  OT );.      test
7420: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
7430: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
7440: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7450: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
7460: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
7470: 20 20 20 20 20 20 2a 70 4e 20 3d 20 30 3b 0a 20        *pN = 0;. 
7480: 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
7490: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20     case TK_IN:. 
74a0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
74b0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
74c0: 20 20 20 2a 70 4e 20 3d 20 30 3b 0a 20 20 20 20     *pN = 0;.    
74d0: 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
74e0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
74f0: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
7500: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
7510: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
7520: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
7530: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
7540: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
7550: 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20  .** and 0 if it 
7560: 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
7570: 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63  es or function c
7580: 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  alls..**.** For 
7590: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
75a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
75b0: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
75c0: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
75d0: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
75e0: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
75f0: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
7600: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
7610: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
7620: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
7630: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
7640: 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ant(Expr *p){.  
7650: 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20 31 3b  int isConst = 1;
7660: 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
7670: 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  p, exprNodeIsCon
7680: 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29  stant, &isConst)
7690: 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43 6f 6e  ;.  return isCon
76a0: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  st;.}../*.** Wal
76b0: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
76c0: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20  tree.  Return 1 
76d0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
76e0: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
76f0: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72   that does no or
7700: 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74 68 65  iginate from the
7710: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
7720: 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a  uses of a join..
7730: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69  ** Return 0 if i
7740: 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61  t involves varia
7750: 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e  bles or function
7760: 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20   calls or terms 
7770: 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72  from.** an ON or
7780: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
7790: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
77a0: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
77b0: 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  in(Expr *p){.  i
77c0: 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20 33 3b 0a  nt isConst = 3;.
77d0: 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70    walkExprTree(p
77e0: 2c 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73  , exprNodeIsCons
77f0: 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b  tant, &isConst);
7800: 0a 20 20 72 65 74 75 72 6e 20 69 73 43 6f 6e 73  .  return isCons
7810: 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  t!=0;.}../*.** W
7820: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
7830: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
7840: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
7850: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
7860: 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  ** or a function
7870: 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74   call with const
7880: 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ant arguments.  
7890: 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20  Return and 0 if 
78a0: 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79  there.** are any
78b0: 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   variables..**.*
78c0: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
78d0: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
78e0: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
78f0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
7900: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
7910: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
7920: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
7930: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
7940: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
7950: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
7960: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
7970: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
7980: 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ion(Expr *p){.  
7990: 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20 32 3b  int isConst = 2;
79a0: 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
79b0: 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  p, exprNodeIsCon
79c0: 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29  stant, &isConst)
79d0: 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43 6f 6e  ;.  return isCon
79e0: 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  st!=0;.}../*.** 
79f0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
7a00: 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73  n p codes a cons
7a10: 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61  tant integer tha
7a20: 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
7a30: 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  h.** to fit in a
7a40: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
7a50: 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75   return 1 and pu
7a60: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
7a70: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e  he integer.** in
7a80: 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68   *pValue.  If th
7a90: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
7aa0: 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  not an integer o
7ab0: 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62  r if it is too b
7ac0: 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  ig.** to fit in 
7ad0: 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  a signed 32-bit 
7ae0: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
7af0: 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61  0 and leave *pVa
7b00: 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  lue unchanged..*
7b10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
7b20: 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20  rIsInteger(Expr 
7b30: 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29  *p, int *pValue)
7b40: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
7b50: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26    if( p->flags &
7b60: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
7b70: 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d      *pValue = p-
7b80: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 72 65 74  >iTable;.    ret
7b90: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69  urn 1;.  }.  swi
7ba0: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
7bb0: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
7bc0: 52 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  R: {.      rc = 
7bd0: 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28  sqlite3GetInt32(
7be0: 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e  (char*)p->token.
7bf0: 7a 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  z, pValue);.    
7c00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7c10: 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
7c20: 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  : {.      rc = s
7c30: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
7c40: 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56  ger(p->pLeft, pV
7c50: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alue);.      bre
7c60: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7c70: 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
7c80: 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20        int v;.   
7c90: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
7ca0: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
7cb0: 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20  Left, &v) ){.   
7cc0: 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d       *pValue = -
7cd0: 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  v;.        rc = 
7ce0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
7cf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7d00: 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b    default: break
7d10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29  ;.  }.  if( rc )
7d20: 7b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  {.    p->op = TK
7d30: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 2d  _INTEGER;.    p-
7d40: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
7d50: 56 61 6c 75 65 3b 0a 20 20 20 20 70 2d 3e 69 54  Value;.    p->iT
7d60: 61 62 6c 65 20 3d 20 2a 70 56 61 6c 75 65 3b 0a  able = *pValue;.
7d70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
7d80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7d90: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
7da0: 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72  en string is a r
7db0: 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ow-id column nam
7dc0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
7dd0: 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63  3IsRowid(const c
7de0: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73  har *z){.  if( s
7df0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
7e00: 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29   "_ROWID_")==0 )
7e10: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
7e20: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
7e30: 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29  z, "ROWID")==0 )
7e40: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
7e50: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
7e60: 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72  z, "OID")==0 ) r
7e70: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
7e80: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n 0;.}../*.** Gi
7e90: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
7ea0: 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  a column of the 
7eb0: 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e  form X.Y.Z or Y.
7ec0: 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f  Z or just Z, loo
7ed0: 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d  k up.** that nam
7ee0: 65 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20  e in the set of 
7ef0: 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e  source tables in
7f00: 20 70 53 72 63 4c 69 73 74 20 61 6e 64 20 6d 61   pSrcList and ma
7f10: 6b 65 20 74 68 65 20 70 45 78 70 72 20 0a 2a 2a  ke the pExpr .**
7f20: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
7f30: 20 72 65 66 65 72 20 62 61 63 6b 20 74 6f 20 74   refer back to t
7f40: 68 61 74 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d  hat source colum
7f50: 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  n.  The followin
7f60: 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  g changes.** are
7f70: 20 6d 61 64 65 20 74 6f 20 70 45 78 70 72 3a 0a   made to pExpr:.
7f80: 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  **.**    pExpr->
7f90: 69 44 62 20 20 20 20 20 20 20 20 20 20 20 53 65  iDb           Se
7fa0: 74 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 64  t the index in d
7fb0: 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20  b->aDb[] of the 
7fc0: 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  database holding
7fd0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
7ff0: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78  table..**    pEx
8000: 70 72 2d 3e 69 54 61 62 6c 65 20 20 20 20 20 20  pr->iTable      
8010: 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 75 72    Set to the cur
8020: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
8030: 68 65 20 74 61 62 6c 65 20 6f 62 74 61 69 6e 65  he table obtaine
8040: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f               fro
8060: 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20  m pSrcList..**  
8070: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
8080: 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 74 68         Set to th
8090: 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
80a0: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
80b0: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f  ..**    pExpr->o
80c0: 70 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74  p            Set
80d0: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a   to TK_COLUMN..*
80e0: 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  *    pExpr->pLef
80f0: 74 20 20 20 20 20 20 20 20 20 41 6e 79 20 65 78  t         Any ex
8100: 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f  pression this po
8110: 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74  ints to is delet
8120: 65 64 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  ed.**    pExpr->
8130: 70 52 69 67 68 74 20 20 20 20 20 20 20 20 41 6e  pRight        An
8140: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69  y expression thi
8150: 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64  s points to is d
8160: 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
8170: 65 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 74 68  e pDbToken is th
8180: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
8190: 74 61 62 61 73 65 20 28 74 68 65 20 22 58 22 29  tabase (the "X")
81a0: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61  .  This value ma
81b0: 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61  y be.** NULL mea
81c0: 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d 65 20 69  ning that name i
81d0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 59 2e  s of the form Y.
81e0: 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76 61  Z or Z.  Any ava
81f0: 69 6c 61 62 6c 65 20 64 61 74 61 62 61 73 65 0a  ilable database.
8200: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 20  ** can be used. 
8210: 20 54 68 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e   The pTableToken
8220: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
8230: 74 68 65 20 74 61 62 6c 65 20 28 74 68 65 20 22  the table (the "
8240: 59 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61  Y").  This.** va
8250: 6c 75 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20  lue can be NULL 
8260: 69 66 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 61  if pDbToken is a
8270: 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54  lso NULL.  If pT
8280: 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  ableToken is NUL
8290: 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  L it.** means th
82a0: 61 74 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 74  at the form of t
82b0: 68 65 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64  he name is Z and
82c0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72   that columns fr
82d0: 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20  om any table.** 
82e0: 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a  can be used..**.
82f0: 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20 63  ** If the name c
8300: 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76 65  annot be resolve
8310: 64 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c  d unambiguously,
8320: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
8330: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
8340: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
8350: 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72  non-zero.  Retur
8360: 6e 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73  n zero on succes
8370: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
8380: 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50   lookupName(.  P
8390: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
83a0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
83b0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
83c0: 54 6f 6b 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c  Token *pDbToken,
83d0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
83e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
83f0: 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f  taining table, o
8400: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  r NULL */.  Toke
8410: 6e 20 2a 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20  n *pTableToken, 
8420: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c   /* Name of tabl
8430: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c  e containing col
8440: 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  umn, or NULL */.
8450: 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e    Token *pColumn
8460: 54 6f 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f  Token, /* Name o
8470: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f  f the column. */
8480: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
8490: 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e  pNC,    /* The n
84a0: 61 6d 65 20 63 6f 6e 74 65 78 74 20 75 73 65 64  ame context used
84b0: 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20   to resolve the 
84c0: 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  name */.  Expr *
84d0: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 2f  pExpr          /
84e0: 2a 20 4d 61 6b 65 20 74 68 69 73 20 45 58 50 52  * Make this EXPR
84f0: 20 6e 6f 64 65 20 70 6f 69 6e 74 20 74 6f 20 74   node point to t
8500: 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75  he selected colu
8510: 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  mn */.){.  char 
8520: 2a 7a 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20  *zDb = 0;       
8530: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
8540: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 22 58  atabase.  The "X
8550: 22 20 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20  " in X.Y.Z */.  
8560: 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20  char *zTab = 0; 
8570: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
8580: 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  the table.  The 
8590: 22 59 22 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20  "Y" in X.Y.Z or 
85a0: 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  Y.Z */.  char *z
85b0: 43 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Col = 0;      /*
85c0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
85d0: 75 6d 6e 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f  umn.  The "Z" */
85e0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
85f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
8600: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
8610: 74 20 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  t cnt = 0;      
8620: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8630: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
8640: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63  names */.  int c
8650: 6e 74 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20  ntTab = 0;      
8660: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74  /* Number of mat
8670: 63 68 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65  ching table name
8680: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
8690: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
86a0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
86b0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
86c0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
86d0: 6d 3b 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  m;       /* Use 
86e0: 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  for looping over
86f0: 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d 73 20   pSrcList items 
8700: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
8710: 69 73 74 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68  ist_item *pMatch
8720: 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61   = 0;  /* The ma
8730: 74 63 68 69 6e 67 20 70 53 72 63 4c 69 73 74 20  tching pSrcList 
8740: 69 74 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  item */.  NameCo
8750: 6e 74 65 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20  ntext *pTopNC = 
8760: 70 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  pNC;        /* F
8770: 69 72 73 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74  irst namecontext
8780: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   in the list */.
8790: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
87a0: 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  a = 0;          
87b0: 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66      /* Schema of
87c0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
87d0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  */..  assert( pC
87e0: 6f 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26 20 70 43  olumnToken && pC
87f0: 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b  olumnToken->z );
8800: 20 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58 2e 59   /* The Z in X.Y
8810: 2e 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c  .Z cannot be NUL
8820: 4c 20 2a 2f 0a 20 20 7a 44 62 20 3d 20 73 71 6c  L */.  zDb = sql
8830: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
8840: 6e 28 64 62 2c 20 70 44 62 54 6f 6b 65 6e 29 3b  n(db, pDbToken);
8850: 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c 69 74 65  .  zTab = sqlite
8860: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
8870: 62 2c 20 70 54 61 62 6c 65 54 6f 6b 65 6e 29 3b  b, pTableToken);
8880: 0a 20 20 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65  .  zCol = sqlite
8890: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
88a0: 62 2c 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29  b, pColumnToken)
88b0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
88c0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
88d0: 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f  goto lookupname_
88e0: 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 70 45 78 70  end;.  }..  pExp
88f0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a  r->iTable = -1;.
8900: 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20    while( pNC && 
8910: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78  cnt==0 ){.    Ex
8920: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
8930: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
8940: 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
8950: 63 4c 69 73 74 3b 0a 0a 20 20 20 20 69 66 28 20  cList;..    if( 
8960: 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20  pSrcList ){.    
8970: 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
8980: 3d 70 53 72 63 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pSrcList->a; i<
8990: 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
89a0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
89b0: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
89c0: 61 62 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ab;.        int 
89d0: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c  iDb;.        Col
89e0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 0a 20 20  umn *pCol;.  .  
89f0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 49 74        pTab = pIt
8a00: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  em->pTab;.      
8a10: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
8a20: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 44 62  0 );.        iDb
8a30: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
8a40: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
8a50: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
8a60: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
8a70: 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  ->nCol>0 );.    
8a80: 20 20 20 20 69 66 28 20 7a 54 61 62 20 29 7b 0a      if( zTab ){.
8a90: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
8aa0: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
8ab0: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
8ac0: 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49 74 65  *zTabName = pIte
8ad0: 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  m->zAlias;.     
8ae0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
8af0: 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61  e3StrICmp(zTabNa
8b00: 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63  me, zTab)!=0 ) c
8b10: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
8b20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8b30: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
8b40: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
8b50: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
8b60: 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
8b70: 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  || sqlite3StrICm
8b80: 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62  p(zTabName, zTab
8b90: 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
8ba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8bb0: 20 7a 44 62 21 3d 30 20 26 26 20 73 71 6c 69 74   zDb!=0 && sqlit
8bc0: 65 33 53 74 72 49 43 6d 70 28 64 62 2d 3e 61 44  e3StrICmp(db->aD
8bd0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44  b[iDb].zName, zD
8be0: 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  b)!=0 ){.       
8bf0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
8c00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
8c10: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8c20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
8c30: 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b 29 20 29   0==(cntTab++) )
8c40: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  {.          pExp
8c50: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65  r->iTable = pIte
8c60: 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
8c70: 20 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20        pSchema = 
8c80: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20  pTab->pSchema;. 
8c90: 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20           pMatch 
8ca0: 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20  = pItem;.       
8cb0: 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a   }.        for(j
8cc0: 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61  =0, pCol=pTab->a
8cd0: 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  Col; j<pTab->nCo
8ce0: 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; j++, pCol++){
8cf0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
8d00: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
8d10: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  ol->zName, zCol)
8d20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8d30: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
8d40: 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Coll = pTab->aCo
8d50: 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[j].zColl;.    
8d60: 20 20 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a          IdList *
8d70: 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 20 20  pUsing;.        
8d80: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
8d90: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
8da0: 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43  able = pItem->iC
8db0: 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  ursor;.         
8dc0: 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65     pMatch = pIte
8dd0: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  m;.            p
8de0: 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70  Schema = pTab->p
8df0: 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20  Schema;.        
8e00: 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
8e10: 65 20 74 68 65 20 72 6f 77 69 64 20 28 63 6f 6c  e the rowid (col
8e20: 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68 65 20  umn -1) for the 
8e30: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
8e40: 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  KEY */.         
8e50: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
8e60: 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b  n = j==pTab->iPK
8e70: 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20  ey ? -1 : j;.   
8e80: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
8e90: 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61 62 2d  affinity = pTab-
8ea0: 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74  >aCol[j].affinit
8eb0: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  y;.            i
8ec0: 66 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  f( (pExpr->flags
8ed0: 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
8ee0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8ef0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f        pExpr->pCo
8f00: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
8f10: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28  CollSeq(db, ENC(
8f20: 64 62 29 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20 30  db), zColl,-1, 0
8f30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
8f40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8f50: 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72   i<pSrcList->nSr
8f60: 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c-1 ){.         
8f70: 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 5b 31       if( pItem[1
8f80: 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
8f90: 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20  NATURAL ){.     
8fa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
8fb0: 20 74 68 69 73 20 6d 61 74 63 68 20 6f 63 63 75   this match occu
8fc0: 72 72 65 64 20 69 6e 20 74 68 65 20 6c 65 66 74  rred in the left
8fd0: 20 74 61 62 6c 65 20 6f 66 20 61 20 6e 61 74 75   table of a natu
8fe0: 72 61 6c 20 6a 6f 69 6e 2c 0a 20 20 20 20 20 20  ral join,.      
8ff0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
9000: 6e 20 73 6b 69 70 20 74 68 65 20 72 69 67 68 74  n skip the right
9010: 20 74 61 62 6c 65 20 74 6f 20 61 76 6f 69 64 20   table to avoid 
9020: 61 20 64 75 70 6c 69 63 61 74 65 20 6d 61 74 63  a duplicate matc
9030: 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  h */.           
9040: 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20       pItem++;.  
9050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2b                i+
9060: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
9070: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 55 73 69   }else if( (pUsi
9080: 6e 67 20 3d 20 70 49 74 65 6d 5b 31 5d 2e 70 55  ng = pItem[1].pU
9090: 73 69 6e 67 29 21 3d 30 20 29 7b 0a 20 20 20 20  sing)!=0 ){.    
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
90b0: 66 20 74 68 69 73 20 6d 61 74 63 68 20 6f 63 63  f this match occ
90c0: 75 72 73 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20  urs on a column 
90d0: 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 55  that is in the U
90e0: 53 49 4e 47 20 63 6c 61 75 73 65 0a 20 20 20 20  SING clause.    
90f0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
9100: 66 20 61 20 6a 6f 69 6e 2c 20 73 6b 69 70 20 74  f a join, skip t
9110: 68 65 20 73 65 61 72 63 68 20 6f 66 20 74 68 65  he search of the
9120: 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
9130: 74 68 65 20 6a 6f 69 6e 0a 20 20 20 20 20 20 20  the join.       
9140: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61           ** to a
9150: 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61 74 65  void a duplicate
9160: 20 6d 61 74 63 68 20 74 68 65 72 65 2e 20 2a 2f   match there. */
9170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9180: 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
9190: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
91a0: 20 6b 3c 70 55 73 69 6e 67 2d 3e 6e 49 64 3b 20   k<pUsing->nId; 
91b0: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
91c0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
91d0: 74 65 33 53 74 72 49 43 6d 70 28 70 55 73 69 6e  te3StrICmp(pUsin
91e0: 67 2d 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a  g->a[k].zName, z
91f0: 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col)==0 ){.     
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
9210: 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Item++;.        
9220: 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b              i++;
9230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9240: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
9260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9270: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
9280: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
9290: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
92a0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
92b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
92c0: 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
92d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
92e0: 47 45 52 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  GER.    /* If we
92f0: 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64   have not alread
9300: 79 20 72 65 73 6f 6c 76 65 64 20 74 68 65 20 6e  y resolved the n
9310: 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62 65 20  ame, then maybe 
9320: 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 61 20  .    ** it is a 
9330: 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74  new.* or old.* t
9340: 72 69 67 67 65 72 20 61 72 67 75 6d 65 6e 74 20  rigger argument 
9350: 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 2a 2f  reference.    */
9360: 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d 30 20  .    if( zDb==0 
9370: 26 26 20 7a 54 61 62 21 3d 30 20 26 26 20 63 6e  && zTab!=0 && cn
9380: 74 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  t==0 && pParse->
9390: 74 72 69 67 53 74 61 63 6b 21 3d 30 20 29 7b 0a  trigStack!=0 ){.
93a0: 20 20 20 20 20 20 54 72 69 67 67 65 72 53 74 61        TriggerSta
93b0: 63 6b 20 2a 70 54 72 69 67 67 65 72 53 74 61 63  ck *pTriggerStac
93c0: 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67  k = pParse->trig
93d0: 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 54 61 62  Stack;.      Tab
93e0: 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20  le *pTab = 0;.  
93f0: 20 20 20 20 75 33 32 20 2a 70 69 43 6f 6c 4d 61      u32 *piColMa
9400: 73 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  sk;.      if( pT
9410: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77  riggerStack->new
9420: 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c  Idx != -1 && sql
9430: 69 74 65 33 53 74 72 49 43 6d 70 28 22 6e 65 77  ite3StrICmp("new
9440: 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b  ", zTab) == 0 ){
9450: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
9460: 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67 67 65  iTable = pTrigge
9470: 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 3b 0a  rStack->newIdx;.
9480: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9490: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70  pTriggerStack->p
94a0: 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20 70  Tab );.        p
94b0: 54 61 62 20 3d 20 70 54 72 69 67 67 65 72 53 74  Tab = pTriggerSt
94c0: 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  ack->pTab;.     
94d0: 20 20 20 70 69 43 6f 6c 4d 61 73 6b 20 3d 20 26     piColMask = &
94e0: 28 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e  (pTriggerStack->
94f0: 6e 65 77 43 6f 6c 4d 61 73 6b 29 3b 0a 20 20 20  newColMask);.   
9500: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 72     }else if( pTr
9510: 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49  iggerStack->oldI
9520: 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69  dx != -1 && sqli
9530: 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22  te3StrICmp("old"
9540: 2c 20 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20  , zTab)==0 ){.  
9550: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
9560: 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74  ble = pTriggerSt
9570: 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20 20  ack->oldIdx;.   
9580: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
9590: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
95a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62   );.        pTab
95b0: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
95c0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
95d0: 70 69 43 6f 6c 4d 61 73 6b 20 3d 20 26 28 70 54  piColMask = &(pT
95e0: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64  riggerStack->old
95f0: 43 6f 6c 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20  ColMask);.      
9600: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  }..      if( pTa
9610: 62 20 29 7b 20 0a 20 20 20 20 20 20 20 20 69 6e  b ){ .        in
9620: 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  t iCol;.        
9630: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70  Column *pCol = p
9640: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20  Tab->aCol;..    
9650: 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20 70 54      pSchema = pT
9660: 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20  ab->pSchema;.   
9670: 20 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20       cntTab++;. 
9680: 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d         for(iCol=
9690: 30 3b 20 69 43 6f 6c 20 3c 20 70 54 61 62 2d 3e  0; iCol < pTab->
96a0: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 2c 20 70 43  nCol; iCol++, pC
96b0: 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20  ol++) {.        
96c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
96d0: 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
96e0: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
96f0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
9700: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 54  char *zColl = pT
9710: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
9720: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
9730: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20    cnt++;.       
9740: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
9750: 75 6d 6e 20 3d 20 69 43 6f 6c 3d 3d 70 54 61 62  umn = iCol==pTab
9760: 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 69  ->iPKey ? -1 : i
9770: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
9780: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
9790: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
97a0: 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  ol].affinity;.  
97b0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
97c0: 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
97d0: 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3d 3d 30 20  _ExpCollate)==0 
97e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
97f0: 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20   pExpr->pColl = 
9800: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
9810: 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
9820: 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20  zColl,-1, 0);.  
9830: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9840: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
9850: 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  Tab = pTab;.    
9860: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
9870: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
9880: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
9890: 43 6f 6c 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20  Col==31 );.     
98a0: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
98b0: 65 28 20 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20  e( iCol==32 );. 
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 69               *pi
98d0: 43 6f 6c 4d 61 73 6b 20 7c 3d 20 28 28 75 33 32  ColMask |= ((u32
98e0: 29 31 3c 3c 69 43 6f 6c 29 20 7c 20 28 69 43 6f  )1<<iCol) | (iCo
98f0: 6c 3e 3d 33 32 3f 30 78 66 66 66 66 66 66 66 66  l>=32?0xffffffff
9900: 3a 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  :0);.           
9910: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62   }.            b
9920: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
9930: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
9940: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
9950: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
9960: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
9970: 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ) */..    /*.   
9980: 20 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65 20   ** Perhaps the 
9990: 6e 61 6d 65 20 69 73 20 61 20 72 65 66 65 72 65  name is a refere
99a0: 6e 63 65 20 74 6f 20 74 68 65 20 52 4f 57 49 44  nce to the ROWID
99b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
99c0: 63 6e 74 3d 3d 30 20 26 26 20 63 6e 74 54 61 62  cnt==0 && cntTab
99d0: 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 49 73  ==1 && sqlite3Is
99e0: 52 6f 77 69 64 28 7a 43 6f 6c 29 20 29 7b 0a 20  Rowid(zCol) ){. 
99f0: 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20       cnt = 1;.  
9a00: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
9a10: 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  mn = -1;.      p
9a20: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Expr->affinity =
9a30: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
9a40: 47 45 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  GER;.    }..    
9a50: 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  /*.    ** If the
9a60: 20 69 6e 70 75 74 20 69 73 20 6f 66 20 74 68 65   input is of the
9a70: 20 66 6f 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a   form Z (not Y.Z
9a80: 20 6f 72 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20   or X.Y.Z) then 
9a90: 74 68 65 20 6e 61 6d 65 20 5a 0a 20 20 20 20 2a  the name Z.    *
9aa0: 2a 20 6d 69 67 68 74 20 72 65 66 65 72 20 74 6f  * might refer to
9ab0: 20 61 6e 20 72 65 73 75 6c 74 2d 73 65 74 20 61   an result-set a
9ac0: 6c 69 61 73 2e 20 20 54 68 69 73 20 68 61 70 70  lias.  This happ
9ad0: 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ens, for example
9ae0: 2c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65  , when.    ** we
9af0: 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e   are resolving n
9b00: 61 6d 65 73 20 69 6e 20 74 68 65 20 57 48 45 52  ames in the WHER
9b10: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
9b20: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e  following comman
9b30: 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d:.    **.    **
9b40: 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20       SELECT a+b 
9b50: 41 53 20 78 20 46 52 4f 4d 20 74 61 62 6c 65 20  AS x FROM table 
9b60: 57 48 45 52 45 20 78 3c 31 30 3b 0a 20 20 20 20  WHERE x<10;.    
9b70: 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 63 61 73  **.    ** In cas
9b80: 65 73 20 6c 69 6b 65 20 74 68 69 73 2c 20 72 65  es like this, re
9b90: 70 6c 61 63 65 20 70 45 78 70 72 20 77 69 74 68  place pExpr with
9ba0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
9bb0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 0a 20  xpression that. 
9bc0: 20 20 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20     ** forms the 
9bd0: 72 65 73 75 6c 74 20 73 65 74 20 65 6e 74 72 79  result set entry
9be0: 20 28 22 61 2b 62 22 20 69 6e 20 74 68 65 20 65   ("a+b" in the e
9bf0: 78 61 6d 70 6c 65 29 20 61 6e 64 20 72 65 74 75  xample) and retu
9c00: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  rn immediately..
9c10: 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
9c20: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9c30: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
9c40: 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  t should have al
9c50: 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 2a  ready been.    *
9c60: 2a 20 72 65 73 6f 6c 76 65 64 20 62 79 20 74 68  * resolved by th
9c70: 65 20 74 69 6d 65 20 74 68 65 20 57 48 45 52 45  e time the WHERE
9c80: 20 63 6c 61 75 73 65 20 69 73 20 72 65 73 6f 6c   clause is resol
9c90: 76 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ved..    */.    
9ca0: 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 28 70  if( cnt==0 && (p
9cb0: 45 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c  EList = pNC->pEL
9cc0: 69 73 74 29 21 3d 30 20 26 26 20 7a 54 61 62 3d  ist)!=0 && zTab=
9cd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
9ce0: 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e  j=0; j<pEList->n
9cf0: 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
9d00: 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20      char *zAs = 
9d10: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61  pEList->a[j].zNa
9d20: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
9d30: 7a 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65  zAs!=0 && sqlite
9d40: 33 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43  3StrICmp(zAs, zC
9d50: 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
9d60: 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 2c 20      Expr *pDup, 
9d70: 2a 70 4f 72 69 67 3b 0a 20 20 20 20 20 20 20 20  *pOrig;.        
9d80: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
9d90: 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
9da0: 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
9db0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
9dc0: 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d  t( pExpr->pList=
9dd0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
9de0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
9df0: 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20  Select==0 );.   
9e00: 20 20 20 20 20 20 20 70 4f 72 69 67 20 3d 20 70         pOrig = p
9e10: 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70  EList->a[j].pExp
9e20: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  r;.          if(
9e30: 20 21 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20   !pNC->allowAgg 
9e40: 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
9e50: 74 79 28 70 4f 72 69 67 2c 20 45 50 5f 41 67 67  ty(pOrig, EP_Agg
9e60: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
9e70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9e80: 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
9e90: 20 6f 66 20 61 6c 69 61 73 65 64 20 61 67 67 72   of aliased aggr
9ea0: 65 67 61 74 65 20 25 73 22 2c 20 7a 41 73 29 3b  egate %s", zAs);
9eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
9ec0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
9ed0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Col);.          
9ee0: 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
9ef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9f00: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
9f10: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72 69  ExprDup(db, pOri
9f20: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  g);.          if
9f30: 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
9f40: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
9f50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44  {.            pD
9f60: 75 70 2d 3e 70 43 6f 6c 6c 20 3d 20 70 45 78 70  up->pColl = pExp
9f70: 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  r->pColl;.      
9f80: 20 20 20 20 20 20 70 44 75 70 2d 3e 66 6c 61 67        pDup->flag
9f90: 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61  s |= EP_ExpColla
9fa0: 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  te;.          }.
9fb0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
9fc0: 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20  xpr->span.dyn ) 
9fd0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9fe0: 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  , (char*)pExpr->
9ff0: 73 70 61 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 20  span.z);.       
a000: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f     if( pExpr->to
a010: 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65  ken.dyn ) sqlite
a020: 33 44 62 46 72 65 65 28 64 62 2c 20 28 63 68 61  3DbFree(db, (cha
a030: 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
a040: 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  z);.          me
a050: 6d 63 70 79 28 70 45 78 70 72 2c 20 70 44 75 70  mcpy(pExpr, pDup
a060: 2c 20 73 69 7a 65 6f 66 28 2a 70 45 78 70 72 29  , sizeof(*pExpr)
a070: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
a080: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
a090: 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Dup);.          
a0a0: 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  cnt = 1;.       
a0b0: 20 20 20 70 4d 61 74 63 68 20 3d 20 30 3b 0a 20     pMatch = 0;. 
a0c0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
a0d0: 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44 62 3d   zTab==0 && zDb=
a0e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
a0f0: 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f  goto lookupname_
a100: 65 6e 64 5f 32 3b 0a 20 20 20 20 20 20 20 20 7d  end_2;.        }
a110: 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a  .      } .    }.
a120: 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20  .    /* Advance 
a130: 74 6f 20 74 68 65 20 6e 65 78 74 20 6e 61 6d 65  to the next name
a140: 20 63 6f 6e 74 65 78 74 2e 20 20 54 68 65 20 6c   context.  The l
a150: 6f 6f 70 20 77 69 6c 6c 20 65 78 69 74 20 77 68  oop will exit wh
a160: 65 6e 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a  en either.    **
a170: 20 77 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   we have a match
a180: 20 28 63 6e 74 3e 30 29 20 6f 72 20 77 68 65 6e   (cnt>0) or when
a190: 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6e   we run out of n
a1a0: 61 6d 65 20 63 6f 6e 74 65 78 74 73 2e 0a 20 20  ame contexts..  
a1b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74    */.    if( cnt
a1c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 43  ==0 ){.      pNC
a1d0: 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20   = pNC->pNext;. 
a1e0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     }.  }..  /*. 
a1f0: 20 2a 2a 20 49 66 20 58 20 61 6e 64 20 59 20 61   ** If X and Y a
a200: 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68 65  re NULL (in othe
a210: 72 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79 20  r words if only 
a220: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
a230: 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c 69  Z is.  ** suppli
a240: 65 64 29 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ed) and the valu
a250: 65 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f 73  e of Z is enclos
a260: 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f  ed in double-quo
a270: 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 5a  tes, then.  ** Z
a280: 20 69 73 20 61 20 73 74 72 69 6e 67 20 6c 69 74   is a string lit
a290: 65 72 61 6c 20 69 66 20 69 74 20 64 6f 65 73 6e  eral if it doesn
a2a0: 27 74 20 6d 61 74 63 68 20 61 6e 79 20 63 6f 6c  't match any col
a2b0: 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20 74  umn names.  In t
a2c0: 68 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20 77  hat.  ** case, w
a2d0: 65 20 6e 65 65 64 20 74 6f 20 72 65 74 75 72 6e  e need to return
a2e0: 20 72 69 67 68 74 20 61 77 61 79 20 61 6e 64 20   right away and 
a2f0: 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63 68 61  not make any cha
a300: 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45 78  nges to.  ** pEx
a310: 70 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65  pr..  **.  ** Be
a320: 63 61 75 73 65 20 6e 6f 20 72 65 66 65 72 65 6e  cause no referen
a330: 63 65 20 77 61 73 20 6d 61 64 65 20 74 6f 20 6f  ce was made to o
a340: 75 74 65 72 20 63 6f 6e 74 65 78 74 73 2c 20 74  uter contexts, t
a350: 68 65 20 70 4e 43 2d 3e 6e 52 65 66 0a 20 20 2a  he pNC->nRef.  *
a360: 2a 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74  * fields are not
a370: 20 63 68 61 6e 67 65 64 20 69 6e 20 61 6e 79 20   changed in any 
a380: 63 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20  context..  */.  
a390: 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54  if( cnt==0 && zT
a3a0: 61 62 3d 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e  ab==0 && pColumn
a3b0: 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27  Token->z[0]=='"'
a3c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
a3d0: 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 29 3b  bFree(db, zCol);
a3e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
a3f0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 6e   }..  /*.  ** cn
a400: 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 72 65  t==0 means there
a410: 20 77 61 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20   was not match. 
a420: 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74 68 65   cnt>1 means the
a430: 72 65 20 77 65 72 65 20 74 77 6f 20 6f 72 0a 20  re were two or. 
a440: 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68 65 73   ** more matches
a450: 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 77  .  Either way, w
a460: 65 20 68 61 76 65 20 61 6e 20 65 72 72 6f 72 2e  e have an error.
a470: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 21  .  */.  if( cnt!
a480: 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =1 ){.    const 
a490: 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
a4a0: 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20  zErr = cnt==0 ? 
a4b0: 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 22  "no such column"
a4c0: 20 3a 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f   : "ambiguous co
a4d0: 6c 75 6d 6e 20 6e 61 6d 65 22 3b 0a 20 20 20 20  lumn name";.    
a4e0: 69 66 28 20 7a 44 62 20 29 7b 0a 20 20 20 20 20  if( zDb ){.     
a4f0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a500: 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73  (pParse, "%s: %s
a510: 2e 25 73 2e 25 73 22 2c 20 7a 45 72 72 2c 20 7a  .%s.%s", zErr, z
a520: 44 62 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c 29 3b  Db, zTab, zCol);
a530: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
a540: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Tab ){.      sql
a550: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
a560: 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22  rse, "%s: %s.%s"
a570: 2c 20 7a 45 72 72 2c 20 7a 54 61 62 2c 20 7a 43  , zErr, zTab, zC
a580: 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ol);.    }else{.
a590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
a5a0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
a5b0: 73 3a 20 25 73 22 2c 20 7a 45 72 72 2c 20 7a 43  s: %s", zErr, zC
a5c0: 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ol);.    }.    p
a5d0: 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  TopNC->nErr++;. 
a5e0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f   }..  /* If a co
a5f0: 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c  lumn from a tabl
a600: 65 20 69 6e 20 70 53 72 63 4c 69 73 74 20 69 73  e in pSrcList is
a610: 20 72 65 66 65 72 65 6e 63 65 64 2c 20 74 68 65   referenced, the
a620: 6e 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68  n record.  ** th
a630: 69 73 20 66 61 63 74 20 69 6e 20 74 68 65 20 70  is fact in the p
a640: 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55  SrcList.a[].colU
a650: 73 65 64 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f  sed bitmask.  Co
a660: 6c 75 6d 6e 20 30 20 63 61 75 73 65 73 0a 20 20  lumn 0 causes.  
a670: 2a 2a 20 62 69 74 20 30 20 74 6f 20 62 65 20 73  ** bit 0 to be s
a680: 65 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65  et.  Column 1 se
a690: 74 73 20 62 69 74 20 31 2e 20 20 41 6e 64 20 73  ts bit 1.  And s
a6a0: 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 74 68 65  o forth.  If the
a6b0: 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d  .  ** column num
a6c0: 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
a6d0: 68 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  han the number o
a6e0: 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 62 69  f bits in the bi
a6f0: 74 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20  tmask.  ** then 
a700: 73 65 74 20 74 68 65 20 68 69 67 68 2d 6f 72 64  set the high-ord
a710: 65 72 20 62 69 74 20 6f 66 20 74 68 65 20 62 69  er bit of the bi
a720: 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66  tmask..  */.  if
a730: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
a740: 3e 3d 30 20 26 26 20 70 4d 61 74 63 68 21 3d 30  >=0 && pMatch!=0
a750: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20   ){.    int n = 
a760: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
a770: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
a780: 3d 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29  =sizeof(Bitmask)
a790: 2a 38 2d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  *8-1 );.    if( 
a7a0: 6e 3e 3d 73 69 7a 65 6f 66 28 42 69 74 6d 61 73  n>=sizeof(Bitmas
a7b0: 6b 29 2a 38 20 29 7b 0a 20 20 20 20 20 20 6e 20  k)*8 ){.      n 
a7c0: 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b  = sizeof(Bitmask
a7d0: 29 2a 38 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  )*8-1;.    }.   
a7e0: 20 61 73 73 65 72 74 28 20 70 4d 61 74 63 68 2d   assert( pMatch-
a7f0: 3e 69 43 75 72 73 6f 72 3d 3d 70 45 78 70 72 2d  >iCursor==pExpr-
a800: 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 70  >iTable );.    p
a810: 4d 61 74 63 68 2d 3e 63 6f 6c 55 73 65 64 20 7c  Match->colUsed |
a820: 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  = ((Bitmask)1)<<
a830: 6e 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b 75 70 6e 61  n;.  }..lookupna
a840: 6d 65 5f 65 6e 64 3a 0a 20 20 2f 2a 20 43 6c 65  me_end:.  /* Cle
a850: 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  an up and return
a860: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
a870: 62 46 72 65 65 28 64 62 2c 20 7a 44 62 29 3b 0a  bFree(db, zDb);.
a880: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
a890: 64 62 2c 20 7a 54 61 62 29 3b 0a 20 20 73 71 6c  db, zTab);.  sql
a8a0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
a8b0: 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  b, pExpr->pLeft)
a8c0: 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ;.  pExpr->pLeft
a8d0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
a8e0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
a8f0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
a900: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
a910: 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  0;.  pExpr->op =
a920: 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f 6f 6b   TK_COLUMN;.look
a930: 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3a 0a 20 20  upname_end_2:.  
a940: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a950: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 63  , zCol);.  if( c
a960: 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 61 73 73  nt==1 ){.    ass
a970: 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20  ert( pNC!=0 );. 
a980: 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 52 65     sqlite3AuthRe
a990: 61 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ad(pParse, pExpr
a9a0: 2c 20 70 53 63 68 65 6d 61 2c 20 70 4e 43 2d 3e  , pSchema, pNC->
a9b0: 70 53 72 63 4c 69 73 74 29 3b 0a 20 20 20 20 69  pSrcList);.    i
a9c0: 66 28 20 70 4d 61 74 63 68 20 26 26 20 21 70 4d  f( pMatch && !pM
a9d0: 61 74 63 68 2d 3e 70 53 65 6c 65 63 74 20 29 7b  atch->pSelect ){
a9e0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54  .      pExpr->pT
a9f0: 61 62 20 3d 20 70 4d 61 74 63 68 2d 3e 70 54 61  ab = pMatch->pTa
aa00: 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  b;.    }.    /* 
aa10: 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6e 52  Increment the nR
aa20: 65 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c 6c 20  ef value on all 
aa30: 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20 66 72  name contexts fr
aa40: 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f 0a 20  om TopNC up to. 
aa50: 20 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 20     ** the point 
aa60: 77 68 65 72 65 20 74 68 65 20 6e 61 6d 65 20 6d  where the name m
aa70: 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20 20 66  atched. */.    f
aa80: 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 61 73  or(;;){.      as
aa90: 73 65 72 74 28 20 70 54 6f 70 4e 43 21 3d 30 20  sert( pTopNC!=0 
aaa0: 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 2d  );.      pTopNC-
aab0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69  >nRef++;.      i
aac0: 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43 20 29  f( pTopNC==pNC )
aad0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54   break;.      pT
aae0: 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d 3e 70  opNC = pTopNC->p
aaf0: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
ab00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 65 6c  return 0;.  } el
ab10: 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  se {.    return 
ab20: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
ab30: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
ab40: 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e 20 78  designed as an x
ab50: 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70  Func for walkExp
ab60: 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 52  rTree()..**.** R
ab70: 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69 63 20  esolve symbolic 
ab80: 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f 43 4f  names into TK_CO
ab90: 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73 20 66  LUMN operators f
aba0: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  or the current.*
abb0: 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 65 78  * node in the ex
abc0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
abd0: 52 65 74 75 72 6e 20 30 20 74 6f 20 63 6f 6e 74  Return 0 to cont
abe0: 69 6e 75 65 20 74 68 65 20 73 65 61 72 63 68 20  inue the search 
abf0: 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65  down.** the tree
ac00: 20 6f 72 20 32 20 74 6f 20 61 62 6f 72 74 20 74   or 2 to abort t
ac10: 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a  he tree walk..**
ac20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ac30: 20 61 6c 73 6f 20 64 6f 65 73 20 65 72 72 6f 72   also does error
ac40: 20 63 68 65 63 6b 69 6e 67 20 61 6e 64 20 6e 61   checking and na
ac50: 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 66 6f  me resolution fo
ac60: 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61  r.** function na
ac70: 6d 65 73 2e 20 20 54 68 65 20 6f 70 65 72 61 74  mes.  The operat
ac80: 6f 72 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  or for aggregate
ac90: 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 63 68   functions is ch
aca0: 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41  anged.** to TK_A
acb0: 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a  GG_FUNCTION..*/.
acc0: 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d 65 52  static int nameR
acd0: 65 73 6f 6c 76 65 72 53 74 65 70 28 76 6f 69 64  esolverStep(void
ace0: 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45   *pArg, Expr *pE
acf0: 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74  xpr){.  NameCont
ad00: 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65  ext *pNC = (Name
ad10: 43 6f 6e 74 65 78 74 2a 29 70 41 72 67 3b 0a 20  Context*)pArg;. 
ad20: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
ad30: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
ad40: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 61 73  ) return 1;.  as
ad50: 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a  sert( pNC!=0 );.
ad60: 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e    pParse = pNC->
ad70: 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28 20 45  pParse;..  if( E
ad80: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
ad90: 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f  y(pExpr, EP_Reso
ada0: 6c 76 65 64 29 20 29 20 72 65 74 75 72 6e 20 31  lved) ) return 1
adb0: 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65  ;.  ExprSetPrope
adc0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65  rty(pExpr, EP_Re
add0: 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64 65 66  solved);.#ifndef
ade0: 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20 70 4e   NDEBUG.  if( pN
adf0: 43 2d 3e 70 53 72 63 4c 69 73 74 20 26 26 20 70  C->pSrcList && p
ae00: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 41  NC->pSrcList->nA
ae10: 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20 53 72  lloc>0 ){.    Sr
ae20: 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
ae30: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
ae40: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
ae50: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43 2d 3e  for(i=0; i<pNC->
ae60: 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
ae70: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
ae80: 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b  rt( pSrcList->a[
ae90: 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26 26  i].iCursor>=0 &&
aea0: 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pSrcList->a[i].
aeb0: 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e  iCursor<pParse->
aec0: 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  nTab);.    }.  }
aed0: 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68  .#endif.  switch
aee0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
aef0: 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71 75 6f     /* Double-quo
af00: 74 65 64 20 73 74 72 69 6e 67 73 20 28 65 78 3a  ted strings (ex:
af10: 20 22 61 62 63 22 29 20 61 72 65 20 75 73 65 64   "abc") are used
af20: 20 61 73 20 69 64 65 6e 74 69 66 69 65 72 73 20   as identifiers 
af30: 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62  if.    ** possib
af40: 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74  le.  Otherwise t
af50: 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20 73 74  hey remain as st
af60: 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65 2d 71  rings.  Single-q
af70: 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73 74 72  uoted.    ** str
af80: 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63 27 29  ings (ex: 'abc')
af90: 20 61 72 65 20 61 6c 77 61 79 73 20 73 74 72 69   are always stri
afa0: 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20 20 20  ng literals..   
afb0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
afc0: 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
afd0: 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  if( pExpr->token
afe0: 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20 62 72  .z[0]=='\'' ) br
aff0: 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  eak;.      /* Fa
b000: 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65  ll thru into the
b010: 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66 20 74   TK_ID case if t
b020: 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c 65 2d  his is a double-
b030: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 2a 2f  quoted string */
b040: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20  .    }.    /* A 
b050: 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 72 20  lone identifier 
b060: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
b070: 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a   column..    */.
b080: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 20      case TK_ID: 
b090: 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61  {.      lookupNa
b0a0: 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  me(pParse, 0, 0,
b0b0: 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20   &pExpr->token, 
b0c0: 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  pNC, pExpr);.   
b0d0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
b0e0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20 74   }.  .    /* A t
b0f0: 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f  able name and co
b100: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20 49  lumn name:     I
b110: 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61  D.ID.    ** Or a
b120: 20 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c 65   database, table
b130: 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44   and column:  ID
b140: 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20 20  .ID.ID.    */.  
b150: 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b    case TK_DOT: {
b160: 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 43  .      Token *pC
b170: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54 6f 6b  olumn;.      Tok
b180: 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20 20 20  en *pTable;.    
b190: 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20 20    Token *pDb;.  
b1a0: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
b1b0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 28 20  ;..      /* if( 
b1c0: 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 62 72  pSrcList==0 ) br
b1d0: 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20 70 52  eak; */.      pR
b1e0: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52  ight = pExpr->pR
b1f0: 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20  ight;.      if( 
b200: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  pRight->op==TK_I
b210: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  D ){.        pDb
b220: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 54   = 0;.        pT
b230: 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e 70  able = &pExpr->p
b240: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Left->token;.   
b250: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26       pColumn = &
b260: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  pRight->token;. 
b270: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b280: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67      assert( pRig
b290: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  ht->op==TK_DOT )
b2a0: 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d 20  ;.        pDb = 
b2b0: 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74  &pExpr->pLeft->t
b2c0: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 54  oken;.        pT
b2d0: 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74 2d 3e  able = &pRight->
b2e0: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
b2f0: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20        pColumn = 
b300: 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74 2d  &pRight->pRight-
b310: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a  >token;.      }.
b320: 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65        lookupName
b330: 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20 70 54  (pParse, pDb, pT
b340: 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20 70  able, pColumn, p
b350: 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  NC, pExpr);.    
b360: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b370: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76  }..    /* Resolv
b380: 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73  e function names
b390: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
b3a0: 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a   TK_CONST_FUNC:.
b3b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
b3c0: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
b3d0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
b3e0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20 20 20  pExpr->pList;   
b3f0: 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74   /* The argument
b400: 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 69   list */.      i
b410: 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70  nt n = pList ? p
b420: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  List->nExpr : 0;
b430: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
b440: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
b450: 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75    int no_such_fu
b460: 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  nc = 0;       /*
b470: 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63 68   True if no such
b480: 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73   function exists
b490: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77 72   */.      int wr
b4a0: 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30  ong_num_args = 0
b4b0: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
b4c0: 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66   wrong number of
b4d0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
b4e0: 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20 3d      int is_agg =
b4f0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
b500: 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20 61 6e  /* True if is an
b510: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
b520: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ion */.      int
b530: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 75   i;.      int au
b540: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
b550: 20 20 20 20 20 20 2f 2a 20 41 75 74 68 6f 72 69        /* Authori
b560: 7a 61 74 69 6f 6e 20 74 6f 20 75 73 65 20 74 68  zation to use th
b570: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
b580: 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20      int nId;    
b590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
b5b0: 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e 63 74  racters in funct
b5c0: 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
b5d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
b5e0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
b5f0: 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   The function na
b600: 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e  me. */.      Fun
b610: 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20  cDef *pDef;     
b620: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
b630: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
b640: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
b650: 20 20 20 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e      int enc = EN
b660: 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 20 20  C(pParse->db);  
b670: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
b680: 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20 20  encoding */..   
b690: 20 20 20 7a 49 64 20 3d 20 28 63 68 61 72 2a 29     zId = (char*)
b6a0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a  pExpr->token.z;.
b6b0: 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78 70        nId = pExp
b6c0: 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20  r->token.n;.    
b6d0: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
b6e0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
b6f0: 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49  rse->db, zId, nI
b700: 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  d, n, enc, 0);. 
b710: 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
b720: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
b730: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
b740: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
b750: 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31 2c  b, zId, nId, -1,
b760: 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
b770: 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b    if( pDef==0 ){
b780: 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75  .          no_su
b790: 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20  ch_func = 1;.   
b7a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b7b0: 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f        wrong_num_
b7c0: 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  args = 1;.      
b7d0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
b7e0: 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20  .        is_agg 
b7f0: 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30  = pDef->xFunc==0
b800: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
b810: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
b820: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
b830: 20 20 69 66 28 20 70 44 65 66 20 29 7b 0a 20 20    if( pDef ){.  
b840: 20 20 20 20 20 20 61 75 74 68 20 3d 20 73 71 6c        auth = sql
b850: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
b860: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 46 55 4e  arse, SQLITE_FUN
b870: 43 54 49 4f 4e 2c 20 30 2c 20 70 44 65 66 2d 3e  CTION, 0, pDef->
b880: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  zName, 0);.     
b890: 20 20 20 69 66 28 20 61 75 74 68 21 3d 53 51 4c     if( auth!=SQL
b8a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b8b0: 20 20 20 20 69 66 28 20 61 75 74 68 3d 3d 53 51      if( auth==SQ
b8c0: 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20  LITE_DENY ){.   
b8d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b8e0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
b8f0: 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64   "not authorized
b900: 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e   to use function
b910: 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  : %s",.         
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b930: 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66 2d             pDef-
b940: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
b950: 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b       pNC->nErr++
b960: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
b970: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
b980: 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
b990: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
b9a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b9b0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
b9c0: 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 21 70  if( is_agg && !p
b9d0: 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 29 7b 0a  NC->allowAgg ){.
b9e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b9f0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
ba00: 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
ba10: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e  gate function %.
ba20: 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29 3b  *s()", nId,zId);
ba30: 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45  .        pNC->nE
ba40: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 73  rr++;.        is
ba50: 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  _agg = 0;.      
ba60: 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63  }else if( no_suc
ba70: 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  h_func ){.      
ba80: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
ba90: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
baa0: 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a  ch function: %.*
bab0: 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20  s", nId, zId);. 
bac0: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
bad0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ++;.      }else 
bae0: 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72  if( wrong_num_ar
baf0: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  gs ){.        sq
bb00: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
bb10: 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62  arse,"wrong numb
bb20: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
bb30: 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73  to function %.*s
bb40: 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ()",.           
bb50: 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20    nId, zId);.   
bb60: 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b       pNC->nErr++
bb70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bb80: 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a 20 20  if( is_agg ){.  
bb90: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
bba0: 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  = TK_AGG_FUNCTIO
bbb0: 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e  N;.        pNC->
bbc0: 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  hasAgg = 1;.    
bbd0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
bbe0: 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f  _agg ) pNC->allo
bbf0: 77 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  wAgg = 0;.      
bc00: 66 6f 72 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e 45  for(i=0; pNC->nE
bc10: 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b  rr==0 && i<n; i+
bc20: 2b 29 7b 0a 20 20 20 20 20 20 20 20 77 61 6c 6b  +){.        walk
bc30: 45 78 70 72 54 72 65 65 28 70 4c 69 73 74 2d 3e  ExprTree(pList->
bc40: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 61 6d 65  a[i].pExpr, name
bc50: 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e  ResolverStep, pN
bc60: 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
bc70: 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20 70    if( is_agg ) p
bc80: 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 31  NC->allowAgg = 1
bc90: 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d  ;.      /* FIX M
bca0: 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78 70  E:  Compute pExp
bcb0: 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73 65  r->affinity base
bcc0: 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74 65  d on the expecte
bcd0: 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20 2a  d return.      *
bce0: 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20 66 75  * type of the fu
bcf0: 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f  nction .      */
bd00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 73  .      return is
bd10: 5f 61 67 67 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  _agg;.    }.#ifn
bd20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bd30: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
bd40: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20  e TK_SELECT:.   
bd50: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
bd60: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
bd70: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
bd80: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
bd90: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ct ){.        in
bda0: 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e 52  t nRef = pNC->nR
bdb0: 65 66 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ef;.#ifndef SQLI
bdc0: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
bdd0: 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 69        if( pNC->i
bde0: 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20  sCheck ){.      
bdf0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
be00: 4d 73 67 28 70 50 61 72 73 65 2c 22 73 75 62 71  Msg(pParse,"subq
be10: 75 65 72 69 65 73 20 70 72 6f 68 69 62 69 74 65  ueries prohibite
be20: 64 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74  d in CHECK const
be30: 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  raints");.      
be40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
be50: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
be60: 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20  Resolve(pParse, 
be70: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pExpr->pSelect, 
be80: 70 4e 43 29 3b 0a 20 20 20 20 20 20 20 20 61 73  pNC);.        as
be90: 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65 66 3e  sert( pNC->nRef>
bea0: 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20 20 20 20  =nRef );.       
beb0: 20 69 66 28 20 6e 52 65 66 21 3d 70 4e 43 2d 3e   if( nRef!=pNC->
bec0: 6e 52 65 66 20 29 7b 0a 20 20 20 20 20 20 20 20  nRef ){.        
bed0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
bee0: 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53  y(pExpr, EP_VarS
bef0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
bf00: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
bf10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
bf20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bf30: 5f 43 48 45 43 4b 0a 20 20 20 20 63 61 73 65 20  _CHECK.    case 
bf40: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
bf50: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 69 73       if( pNC->is
bf60: 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  Check ){.       
bf70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
bf80: 28 70 50 61 72 73 65 2c 22 70 61 72 61 6d 65 74  (pParse,"paramet
bf90: 65 72 73 20 70 72 6f 68 69 62 69 74 65 64 20 69  ers prohibited i
bfa0: 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  n CHECK constrai
bfb0: 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  nts");.      }. 
bfc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bfd0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  }.#endif.  }.  r
bfe0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
bff0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
c000: 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73 69  alks an expressi
c010: 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73 6f  on tree and reso
c020: 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65 73 20  lves references 
c030: 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75  to.** table colu
c040: 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20 74  mns.  Nodes of t
c050: 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f 72  he form ID.ID or
c060: 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74 6f   ID resolve into
c070: 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20   an.** index to 
c080: 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  the table in the
c090: 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64 20   table list and 
c0a0: 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 2e  a column offset.
c0b0: 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e 6f    The .** Expr.o
c0c0: 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20 6e  pcode for such n
c0d0: 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65 64 20  odes is changed 
c0e0: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54  to TK_COLUMN.  T
c0f0: 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a  he Expr.iTable.*
c100: 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67  * value is chang
c110: 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ed to the index 
c120: 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  of the reference
c130: 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c  d table in pTabL
c140: 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65 20  ist.** plus the 
c150: 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20 54  "base" value.  T
c160: 68 65 20 62 61 73 65 20 76 61 6c 75 65 20 77 69  he base value wi
c170: 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65  ll ultimately be
c180: 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42 45  come the.** VDBE
c190: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
c1a0: 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
c1b0: 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74   is pointing int
c1c0: 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  o the referenced
c1d0: 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65 20  .** table.  The 
c1e0: 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c  Expr.iColumn val
c1f0: 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  ue is changed to
c200: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
c210: 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20  e column .** of 
c220: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
c230: 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e  able.  The Expr.
c240: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f  iColumn value fo
c250: 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a  r the special.**
c260: 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73   ROWID column is
c270: 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47 45   -1.  Any INTEGE
c280: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
c290: 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61 73  lumn is tried as
c2a0: 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72   an.** alias for
c2b0: 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41 6c   ROWID..**.** Al
c2c0: 73 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e 63 74  so resolve funct
c2d0: 69 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20 63 68  ion names and ch
c2e0: 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  eck the function
c2f0: 73 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a 2a 20  s for proper.** 
c300: 75 73 61 67 65 2e 20 20 4d 61 6b 65 20 73 75 72  usage.  Make sur
c310: 65 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 6e  e all function n
c320: 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e 69  ames are recogni
c330: 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63  zed and all func
c340: 74 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20 74 68  tions.** have th
c350: 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72  e correct number
c360: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20   of arguments.  
c370: 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  Leave an error m
c380: 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61  essage.** in pPa
c390: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69 66 20  rse->zErrMsg if 
c3a0: 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69 73  anything is amis
c3b0: 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  s.  Return the n
c3c0: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
c3d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
c3e0: 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  pression contain
c3f0: 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
c400: 74 69 6f 6e 73 20 74 68 65 6e 20 73 65 74 20 74  tions then set t
c410: 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72 6f  he EP_Agg.** pro
c420: 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65 78 70  perty on the exp
c430: 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  ression..*/.int 
c440: 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
c450: 76 65 4e 61 6d 65 73 28 20 0a 20 20 4e 61 6d 65  veNames( .  Name
c460: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20  Context *pNC,   
c470: 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65      /* Namespace
c480: 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72   to resolve expr
c490: 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20  essions in. */. 
c4a0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
c4b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c4c0: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
c4d0: 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b   analyzed. */.){
c4e0: 0a 20 20 69 6e 74 20 73 61 76 65 64 48 61 73 41  .  int savedHasA
c4f0: 67 67 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  gg;..  if( pExpr
c500: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
c510: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
c520: 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 7b 0a  XPR_DEPTH>0.  {.
c530: 20 20 20 20 69 66 28 20 63 68 65 63 6b 45 78 70      if( checkExp
c540: 72 48 65 69 67 68 74 28 70 4e 43 2d 3e 70 50 61  rHeight(pNC->pPa
c550: 72 73 65 2c 20 70 45 78 70 72 2d 3e 6e 48 65 69  rse, pExpr->nHei
c560: 67 68 74 20 2b 20 70 4e 43 2d 3e 70 50 61 72 73  ght + pNC->pPars
c570: 65 2d 3e 6e 48 65 69 67 68 74 29 20 29 7b 0a 20  e->nHeight) ){. 
c580: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
c590: 20 20 20 7d 0a 20 20 20 20 70 4e 43 2d 3e 70 50     }.    pNC->pP
c5a0: 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d  arse->nHeight +=
c5b0: 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b   pExpr->nHeight;
c5c0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 61  .  }.#endif.  sa
c5d0: 76 65 64 48 61 73 41 67 67 20 3d 20 70 4e 43 2d  vedHasAgg = pNC-
c5e0: 3e 68 61 73 41 67 67 3b 0a 20 20 70 4e 43 2d 3e  >hasAgg;.  pNC->
c5f0: 68 61 73 41 67 67 20 3d 20 30 3b 0a 20 20 77 61  hasAgg = 0;.  wa
c600: 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
c610: 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74  , nameResolverSt
c620: 65 70 2c 20 70 4e 43 29 3b 0a 23 69 66 20 53 51  ep, pNC);.#if SQ
c630: 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
c640: 50 54 48 3e 30 0a 20 20 70 4e 43 2d 3e 70 50 61  PTH>0.  pNC->pPa
c650: 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20  rse->nHeight -= 
c660: 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a  pExpr->nHeight;.
c670: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4e 43  #endif.  if( pNC
c680: 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20  ->nErr>0 ){.    
c690: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
c6a0: 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72 29  pExpr, EP_Error)
c6b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 43 2d  ;.  }.  if( pNC-
c6c0: 3e 68 61 73 41 67 67 20 29 7b 0a 20 20 20 20 45  >hasAgg ){.    E
c6d0: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
c6e0: 45 78 70 72 2c 20 45 50 5f 41 67 67 29 3b 0a 20  Expr, EP_Agg);. 
c6f0: 20 7d 65 6c 73 65 20 69 66 28 20 73 61 76 65 64   }else if( saved
c700: 48 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70 4e  HasAgg ){.    pN
c710: 43 2d 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20  C->hasAgg = 1;. 
c720: 20 7d 0a 20 20 72 65 74 75 72 6e 20 45 78 70 72   }.  return Expr
c730: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
c740: 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 7d 0a  r, EP_Error);.}.
c750: 0a 2f 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  ./*.** A pointer
c760: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
c770: 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75  s structure is u
c780: 73 65 64 20 74 6f 20 70 61 73 73 20 69 6e 66 6f  sed to pass info
c790: 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 68 72 6f 75  rmation.** throu
c7a0: 67 68 20 77 61 6c 6b 45 78 70 72 54 72 65 65 20  gh walkExprTree 
c7b0: 69 6e 74 6f 20 63 6f 64 65 53 75 62 71 75 65 72  into codeSubquer
c7c0: 79 53 74 65 70 28 29 2e 0a 2a 2f 0a 74 79 70 65  yStep()..*/.type
c7d0: 64 65 66 20 73 74 72 75 63 74 20 51 75 65 72 79  def struct Query
c7e0: 43 6f 64 65 72 20 51 75 65 72 79 43 6f 64 65 72  Coder QueryCoder
c7f0: 3b 0a 73 74 72 75 63 74 20 51 75 65 72 79 43 6f  ;.struct QueryCo
c800: 64 65 72 20 7b 0a 20 20 50 61 72 73 65 20 2a 70  der {.  Parse *p
c810: 50 61 72 73 65 3b 20 20 20 20 20 20 20 2f 2a 20  Parse;       /* 
c820: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
c830: 65 78 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ext */.  NameCon
c840: 74 65 78 74 20 2a 70 4e 43 3b 20 20 20 20 2f 2a  text *pNC;    /*
c850: 20 4e 61 6d 65 73 70 61 63 65 20 6f 66 20 66 69   Namespace of fi
c860: 72 73 74 20 65 6e 63 6c 6f 73 69 6e 67 20 71 75  rst enclosing qu
c870: 65 72 79 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 64 65  ery */.};..#ifde
c880: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
c890: 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 6e 61 62  int sqlite3_enab
c8a0: 6c 65 5f 69 6e 5f 6f 70 74 20 3d 20 31 3b 0a 23  le_in_opt = 1;.#
c8b0: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 73  else.  #define s
c8c0: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 69 6e  qlite3_enable_in
c8d0: 5f 6f 70 74 20 31 0a 23 65 6e 64 69 66 0a 0a 2f  _opt 1.#endif../
c8e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
c8f0: 20 69 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   if the IN opera
c900: 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  tor optimization
c910: 20 69 73 20 65 6e 61 62 6c 65 64 20 61 6e 64 0a   is enabled and.
c920: 2a 2a 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  ** the SELECT st
c930: 61 74 65 6d 65 6e 74 20 70 20 65 78 69 73 74 73  atement p exists
c940: 20 61 6e 64 20 69 73 20 6f 66 20 74 68 65 0a 2a   and is of the.*
c950: 2a 20 73 69 6d 70 6c 65 20 66 6f 72 6d 3a 0a 2a  * simple form:.*
c960: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
c970: 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74  <column> FROM <t
c980: 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able>.**.** If t
c990: 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
c9a0: 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69   it may be possi
c9b0: 62 6c 65 20 74 6f 20 75 73 65 20 61 6e 20 65 78  ble to use an ex
c9c0: 69 73 74 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20  isting table.** 
c9d0: 6f 72 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64  or index instead
c9e0: 20 6f 66 20 67 65 6e 65 72 61 74 69 6e 67 20 61   of generating a
c9f0: 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  n epheremal tabl
ca00: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
ca10: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
ca20: 52 59 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  RY.static int is
ca30: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
ca40: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
ca50: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
ca60: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
ca70: 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  t;.  Table *pTab
ca80: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
ca90: 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 20 29  _enable_in_opt )
caa0: 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 49 4e   return 0; /* IN
cab0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 75   optimization mu
cac0: 73 74 20 62 65 20 65 6e 61 62 6c 65 64 20 2a 2f  st be enabled */
cad0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
cae0: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
caf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 69 67            /* rig
cb00: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
cb10: 49 4e 20 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a  IN is SELECT */.
cb20: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
cb30: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
cb40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
cb50: 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
cb60: 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73  T */.  if( p->is
cb70: 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
cb80: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  n 0;          /*
cb90: 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79   No DISTINCT key
cba0: 77 6f 72 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  word */.  if( p-
cbb0: 3e 69 73 41 67 67 20 29 20 72 65 74 75 72 6e 20  >isAgg ) return 
cbc0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
cbd0: 20 2f 2a 20 43 6f 6e 74 61 69 6e 73 20 6e 6f 20   /* Contains no 
cbe0: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
cbf0: 6f 6e 73 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ons */.  if( p->
cc00: 70 47 72 6f 75 70 42 79 20 29 20 72 65 74 75 72  pGroupBy ) retur
cc10: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
cc20: 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20  /* Has no GROUP 
cc30: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
cc40: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72  f( p->pLimit ) r
cc50: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
cc60: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
cc70: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a  LIMIT clause */.
cc80: 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
cc90: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
cca0: 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  f( p->pWhere ) r
ccb0: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
ccc0: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
ccd0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
cce0: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
ccf0: 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20  ;.  if( pSrc==0 
cd00: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
cd10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
cd20: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
cd30: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
cd40: 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  */.  if( pSrc->n
cd50: 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
cd60: 30 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61  0;.  if( pSrc->a
cd70: 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65  [0].pSelect ) re
cd80: 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46  turn 0;     /* F
cd90: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f  ROM clause is no
cda0: 74 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  t a subquery */.
cdb0: 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61    pTab = pSrc->a
cdc0: 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 69 66 28 20  [0].pTab;.  if( 
cdd0: 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
cde0: 20 30 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   0;.  if( pTab->
cdf0: 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  pSelect ) return
ce00: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
ce10: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e  FROM clause is n
ce20: 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69  ot a view */.  i
ce30: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
ce40: 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  b) ) return 0;  
ce50: 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
ce60: 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75  ause not a virtu
ce70: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45  al table */.  pE
ce80: 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
ce90: 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  ;.  if( pEList->
cea0: 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
ceb0: 6e 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e  n 0;       /* On
cec0: 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
ced0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
cee0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  if( pEList->a[0]
cef0: 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  .pExpr->op!=TK_C
cf00: 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
cf10: 3b 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61  ; /* Result is a
cf20: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74   column */.  ret
cf30: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
cf40: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
cf50: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a  UBQUERY */../*.*
cf60: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
cf70: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 69  is used by the i
cf80: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
cf90: 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70   the IN (...) op
cfa0: 65 72 61 74 6f 72 2e 0a 2a 2a 20 49 74 27 73 20  erator..** It's 
cfb0: 6a 6f 62 20 69 73 20 74 6f 20 66 69 6e 64 20 6f  job is to find o
cfc0: 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65  r create a b-tre
cfd0: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
cfe0: 20 6d 61 79 20 62 65 20 75 73 65 64 0a 2a 2a 20   may be used.** 
cff0: 65 69 74 68 65 72 20 74 6f 20 74 65 73 74 20 66  either to test f
d000: 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 6f 66  or membership of
d010: 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 20 6f   the (...) set o
d020: 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  r to iterate thr
d030: 6f 75 67 68 0a 2a 2a 20 69 74 73 20 6d 65 6d 62  ough.** its memb
d040: 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 64 75  ers, skipping du
d050: 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  plicates..**.** 
d060: 54 68 65 20 63 75 72 73 6f 72 20 6f 70 65 6e 65  The cursor opene
d070: 64 20 6f 6e 20 74 68 65 20 73 74 72 75 63 74 75  d on the structu
d080: 72 65 20 28 64 61 74 61 62 61 73 65 20 74 61 62  re (database tab
d090: 6c 65 2c 20 64 61 74 61 62 61 73 65 20 69 6e 64  le, database ind
d0a0: 65 78 20 0a 2a 2a 20 6f 72 20 65 70 68 65 72 6d  ex .** or epherm
d0b0: 61 6c 20 74 61 62 6c 65 29 20 69 73 20 73 74 6f  al table) is sto
d0c0: 72 65 64 20 69 6e 20 70 58 2d 3e 69 54 61 62 6c  red in pX->iTabl
d0d0: 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  e before this fu
d0e0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
d0f0: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
d100: 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20  value indicates 
d110: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 74 79  the structure ty
d120: 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  pe, as follows:.
d130: 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  **.**   IN_INDEX
d140: 5f 52 4f 57 49 44 20 2d 20 54 68 65 20 63 75 72  _ROWID - The cur
d150: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
d160: 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  n a database tab
d170: 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  le..**   IN_INDE
d180: 58 5f 49 4e 44 45 58 20 2d 20 54 68 65 20 63 75  X_INDEX - The cu
d190: 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
d1a0: 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 6e  on a database in
d1b0: 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  dex..**   IN_IND
d1c0: 45 58 5f 45 50 48 20 2d 20 20 20 54 68 65 20 63  EX_EPH -   The c
d1d0: 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
d1e0: 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20   on a specially 
d1f0: 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20  created and.**  
d200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d210: 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65    populated ephe
d220: 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  remal table..**.
d230: 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 73  ** An existing s
d240: 74 72 75 63 74 75 72 65 20 6d 61 79 20 6f 6e 6c  tructure may onl
d250: 79 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  y be used if the
d260: 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68   SELECT is of th
d270: 65 20 73 69 6d 70 6c 65 0a 2a 2a 20 66 6f 72 6d  e simple.** form
d280: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
d290: 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d  CT <column> FROM
d2a0: 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49   <table>.**.** I
d2b0: 66 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72  f prNotFound par
d2c0: 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 65  ameter is 0, the
d2d0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
d2e0: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
d2f0: 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75  iterate.** throu
d300: 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65  gh the set membe
d310: 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 61 6e 79  rs, skipping any
d320: 20 64 75 70 6c 69 63 61 74 65 73 2e 20 49 6e 20   duplicates. In 
d330: 74 68 69 73 20 63 61 73 65 20 61 6e 0a 2a 2a 20  this case an.** 
d340: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
d350: 6d 75 73 74 20 62 65 20 75 73 65 64 20 75 6e 6c  must be used unl
d360: 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64  ess the selected
d370: 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67 75 61   <column> is gua
d380: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
d390: 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72   unique - either
d3a0: 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61   because it is a
d3b0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
d3c0: 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a 20 69  Y KEY or it.** i
d3d0: 73 20 75 6e 69 71 75 65 20 62 79 20 76 69 72 74  s unique by virt
d3e0: 75 65 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69  ue of a constrai
d3f0: 6e 74 20 6f 72 20 69 6d 70 6c 69 63 69 74 20 69  nt or implicit i
d400: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ndex..**.** If t
d410: 68 65 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61  he prNotFound pa
d420: 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
d430: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63  , then the struc
d440: 74 75 72 65 20 77 69 6c 6c 20 62 65 20 75 73 65  ture will be use
d450: 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73  d .** for fast s
d460: 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  et membership te
d470: 73 74 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  sts. In this cas
d480: 65 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74  e an epheremal t
d490: 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65  able must .** be
d4a0: 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f   used unless <co
d4b0: 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49 4e 54 45  lumn> is an INTE
d4c0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
d4d0: 6f 72 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20  or an index can 
d4e0: 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20 77 69 74  .** be found wit
d4f0: 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20 69 74  h <column> as it
d500: 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  s left-most colu
d510: 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  mn..**.** When t
d520: 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  he structure is 
d530: 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 73  being used for s
d540: 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  et membership te
d550: 73 74 73 2c 20 74 68 65 20 75 73 65 72 0a 2a 2a  sts, the user.**
d560: 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77   needs to know w
d570: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
d580: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
d590: 61 69 6e 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c  ains an SQL NULL
d5a0: 20 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20 6f 72   .** value in or
d5b0: 64 65 72 20 74 6f 20 63 6f 72 72 65 63 74 6c 79  der to correctly
d5c0: 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73   evaluate expres
d5d0: 73 69 6f 6e 73 20 6c 69 6b 65 20 22 58 20 49 4e  sions like "X IN
d5e0: 20 28 59 2c 20 5a 29 22 2e 0a 2a 2a 20 49 66 20   (Y, Z)"..** If 
d5f0: 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63  there is a chanc
d600: 65 20 74 68 61 74 20 74 68 65 20 73 74 72 75 63  e that the struc
d610: 74 75 72 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e  ture may contain
d620: 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74   a NULL value at
d630: 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65  .** runtime, the
d640: 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  n a register is 
d650: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
d660: 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
d670: 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  r written.** to 
d680: 2a 70 72 4e 6f 74 46 6f 75 6e 64 2e 20 49 66 20  *prNotFound. If 
d690: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
d6a0: 63 65 20 74 68 61 74 20 74 68 65 20 73 74 72 75  ce that the stru
d6b0: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
d6c0: 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20  .** NULL value, 
d6d0: 74 68 65 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64  then *prNotFound
d6e0: 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
d6f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  ed..**.** If a r
d700: 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
d710: 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63  ated and its loc
d720: 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20  ation stored in 
d730: 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c 20 74 68 65  *prNotFound, the
d740: 6e 0a 2a 2a 20 69 74 73 20 69 6e 69 74 69 61 6c  n.** its initial
d750: 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 20   value is NULL. 
d760: 49 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  If the structure
d770: 20 64 6f 65 73 20 6e 6f 74 20 72 65 6d 61 69 6e   does not remain
d780: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72   constant.** for
d790: 20 74 68 65 20 64 75 72 61 74 69 6f 6e 20 6f 66   the duration of
d7a0: 20 74 68 65 20 71 75 65 72 79 20 28 69 2e 65 2e   the query (i.e.
d7b0: 20 74 68 65 20 73 65 74 20 69 73 20 61 20 63 6f   the set is a co
d7c0: 72 72 65 6c 61 74 65 64 20 73 75 62 2d 73 65 6c  rrelated sub-sel
d7d0: 65 63 74 29 2c 20 0a 2a 2a 20 74 68 65 20 76 61  ect), .** the va
d7e0: 6c 75 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  lue of the alloc
d7f0: 61 74 65 64 20 72 65 67 69 73 74 65 72 20 69 73  ated register is
d800: 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 65   reset to NULL e
d810: 61 63 68 20 74 69 6d 65 20 74 68 65 20 0a 2a 2a  ach time the .**
d820: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65   structure is re
d830: 70 6f 70 75 6c 61 74 65 64 2e 20 54 68 69 73 20  populated. This 
d840: 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 65  allows the calle
d850: 72 20 74 6f 20 75 73 65 20 76 64 62 65 20 63 6f  r to use vdbe co
d860: 64 65 20 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e  de .** equivalen
d870: 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t to the followi
d880: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  ng:.**.**   if( 
d890: 72 65 67 69 73 74 65 72 3d 3d 4e 55 4c 4c 20 29  register==NULL )
d8a0: 7b 0a 2a 2a 20 20 20 20 20 68 61 73 5f 6e 75 6c  {.**     has_nul
d8b0: 6c 20 3d 20 3c 74 65 73 74 20 69 66 20 64 61 74  l = <test if dat
d8c0: 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  a structure cont
d8d0: 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 20 20  ains null>.**   
d8e0: 20 20 72 65 67 69 73 74 65 72 20 3d 20 31 0a 2a    register = 1.*
d8f0: 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f  *   }.**.** in o
d900: 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 72 75  rder to avoid ru
d910: 6e 6e 69 6e 67 20 74 68 65 20 3c 74 65 73 74 20  nning the <test 
d920: 69 66 20 64 61 74 61 20 73 74 72 75 63 74 75 72  if data structur
d930: 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e  e contains null>
d940: 0a 2a 2a 20 74 65 73 74 20 6d 6f 72 65 20 6f 66  .** test more of
d950: 74 65 6e 20 74 68 61 6e 20 69 73 20 6e 65 63 65  ten than is nece
d960: 73 73 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ssary..*/.#ifnde
d970: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
d980: 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74  BQUERY.int sqlit
d990: 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 50 61  e3FindInIndex(Pa
d9a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
d9b0: 72 20 2a 70 58 2c 20 69 6e 74 20 2a 70 72 4e 6f  r *pX, int *prNo
d9c0: 74 46 6f 75 6e 64 29 7b 0a 20 20 53 65 6c 65 63  tFound){.  Selec
d9d0: 74 20 2a 70 3b 0a 20 20 69 6e 74 20 65 54 79 70  t *p;.  int eTyp
d9e0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61  e = 0;.  int iTa
d9f0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
da00: 2b 2b 3b 0a 20 20 69 6e 74 20 6d 75 73 74 42 65  ++;.  int mustBe
da10: 55 6e 69 71 75 65 20 3d 20 21 70 72 4e 6f 74 46  Unique = !prNotF
da20: 6f 75 6e 64 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ound;..  /* The 
da30: 66 6f 6c 6c 77 69 6e 67 20 69 66 28 2e 2e 2e 29  follwing if(...)
da40: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
da50: 72 75 65 20 69 66 20 74 68 65 20 53 45 4c 45 43  rue if the SELEC
da60: 54 20 69 73 20 6f 66 20 74 68 65 20 0a 20 20 2a  T is of the .  *
da70: 2a 20 73 69 6d 70 6c 65 20 66 6f 72 6d 3a 0a 20  * simple form:. 
da80: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
da90: 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f  ECT <column> FRO
daa0: 4d 20 3c 74 61 62 6c 65 3e 0a 20 20 2a 2a 0a 20  M <table>.  **. 
dab0: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
dac0: 68 65 20 63 61 73 65 2c 20 69 74 20 6d 61 79 20  he case, it may 
dad0: 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  be possible to u
dae0: 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  se an existing t
daf0: 61 62 6c 65 0a 20 20 2a 2a 20 6f 72 20 69 6e 64  able.  ** or ind
db00: 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 67 65  ex instead of ge
db10: 6e 65 72 61 74 69 6e 67 20 61 6e 20 65 70 68 65  nerating an ephe
db20: 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a  remal table..  *
db30: 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 70 53 65 6c  /.  p = pX->pSel
db40: 65 63 74 3b 0a 20 20 69 66 28 20 69 73 43 61 6e  ect;.  if( isCan
db50: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
db60: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
db70: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
db80: 62 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  b;.    Index *pI
db90: 64 78 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  dx;.    Expr *pE
dba0: 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
dbb0: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
dbc0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
dbd0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
dbe0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
dbf0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
dc00: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66  ;..    /* This f
dc10: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
dc20: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20  called from two 
dc30: 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f 74 68 20  places. In both 
dc40: 63 61 73 65 73 20 74 68 65 20 76 64 62 65 0a 20  cases the vdbe. 
dc50: 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64     ** has alread
dc60: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
dc70: 2e 20 53 6f 20 61 73 73 75 6d 65 20 73 71 6c 69  . So assume sqli
dc80: 74 65 33 47 65 74 56 64 62 65 28 29 20 69 73 20  te3GetVdbe() is 
dc90: 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 75  always.    ** su
dca0: 63 63 65 73 73 66 75 6c 20 68 65 72 65 2e 0a 20  ccessful here.. 
dcb0: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
dcc0: 28 76 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  (v);.    if( iCo
dcd0: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  l<0 ){.      int
dce0: 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
dcf0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e  ->nMem;.      in
dd00: 74 20 69 41 64 64 72 3b 0a 20 20 20 20 20 20 54  t iAddr;.      T
dd10: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e  able *pTab = p->
dd20: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
dd30: 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
dd40: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
dd50: 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
dd60: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
dd70: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
dd80: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 0a 20  tree(v, iDb);.. 
dd90: 20 20 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c       iAddr = sql
dda0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
ddb0: 2c 20 4f 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a  , OP_If, iMem);.
ddc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ddd0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
dde0: 74 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b  teger, 1, iMem);
ddf0: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ..      sqlite3O
de00: 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
de10: 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62   iTab, iDb, pTab
de20: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
de30: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
de40: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20  _INDEX_ROWID;.. 
de50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
de60: 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64  JumpHere(v, iAdd
de70: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
de80: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c       /* The coll
de90: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75  ation sequence u
dea0: 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61  sed by the compa
deb0: 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64  rison. If an ind
dec0: 65 78 20 69 73 20 74 6f 20 0a 20 20 20 20 20 20  ex is to .      
ded0: 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c  ** be used in pl
dee0: 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61  ace of a temp-ta
def0: 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ble, it must be 
df00: 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e  ordered accordin
df10: 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  g.      ** to th
df20: 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  is collation seq
df30: 75 65 6e 63 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  uence..      */.
df40: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
df50: 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  Req = sqlite3Bin
df60: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
df70: 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  q(pParse, pX->pL
df80: 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20  eft, pExpr);..  
df90: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
dfa0: 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
dfb0: 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
dfc0: 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20   to perform the 
dfd0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  .      ** compar
dfe0: 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  ison is the same
dff0: 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   as the affinity
e000: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
e010: 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  If.      ** it i
e020: 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74  s not, it is not
e030: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
e040: 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20 20   any index..    
e050: 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
e060: 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63   *pTab = p->pSrc
e070: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[0].pTab;.   
e080: 20 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f     char aff = co
e090: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
e0a0: 28 70 58 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  (pX);.      int 
e0b0: 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 28 70  affinity_ok = (p
e0c0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
e0d0: 61 66 66 69 6e 69 74 79 3d 3d 61 66 66 7c 7c 61  affinity==aff||a
e0e0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
e0f0: 4f 4e 45 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72  ONE);..      for
e100: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
e110: 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70  ex; pIdx && eTyp
e120: 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79  e==0 && affinity
e130: 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  _ok; pIdx=pIdx->
e140: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
e150: 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c  if( (pIdx->aiCol
e160: 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20  umn[0]==iCol).  
e170: 20 20 20 20 20 20 20 26 26 20 28 70 52 65 71 3d         && (pReq=
e180: 3d 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c  =sqlite3FindColl
e190: 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
e1a0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d   pIdx->azColl[0]
e1b0: 2c 20 2d 31 2c 20 30 29 29 0a 20 20 20 20 20 20  , -1, 0)).      
e1c0: 20 20 20 26 26 20 28 21 6d 75 73 74 42 65 55 6e     && (!mustBeUn
e1d0: 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e  ique || (pIdx->n
e1e0: 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64  Column==1 && pId
e1f0: 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
e200: 6f 6e 65 29 29 0a 20 20 20 20 20 20 20 20 29 7b  one)).        ){
e210: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
e220: 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  Db;.          in
e230: 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  t iMem = ++pPars
e240: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
e250: 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20     int iAddr;.  
e260: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 4b          char *pK
e270: 65 79 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20  ey;.  .         
e280: 20 70 4b 65 79 20 3d 20 28 63 68 61 72 20 2a 29   pKey = (char *)
e290: 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
e2a0: 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
e2b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 44 62  );.          iDb
e2c0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
e2d0: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 64 78  ToIndex(db, pIdx
e2e0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
e2f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e300: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
e310: 62 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69  b);..          i
e320: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
e330: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
e340: 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  f, iMem);.      
e350: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e360: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
e370: 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 20  ger, 1, iMem);. 
e380: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
e390: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e3a0: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
e3b0: 73 2c 20 30 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c  s, 0, pIdx->nCol
e3c0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  umn);.          
e3d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e3e0: 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  4(v, OP_OpenRead
e3f0: 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e  , iTab, pIdx->tn
e400: 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  um, iDb,.       
e410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e420: 20 20 20 20 20 20 20 20 70 4b 65 79 2c 50 34 5f          pKey,P4_
e430: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
e440: 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
e450: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
e460: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
e470: 0a 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65  .          eType
e480: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45   = IN_INDEX_INDE
e490: 58 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 73 71  X;..          sq
e4a0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
e4b0: 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
e4c0: 20 20 20 20 20 20 20 69 66 28 20 70 72 4e 6f 74         if( prNot
e4d0: 46 6f 75 6e 64 20 26 26 20 21 70 54 61 62 2d 3e  Found && !pTab->
e4e0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
e4f0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
e500: 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20    *prNotFound = 
e510: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
e520: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e530: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e540: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65    }.  }..  if( e
e550: 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Type==0 ){.    i
e560: 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  nt rMayHaveNull 
e570: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 72 4e  = 0;.    if( prN
e580: 6f 74 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20 20  otFound ){.     
e590: 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 72   *prNotFound = r
e5a0: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b  MayHaveNull = ++
e5b0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
e5c0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
e5d0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
e5e0: 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76  rse, pX, rMayHav
e5f0: 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 65 54 79 70  eNull);.    eTyp
e600: 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  e = IN_INDEX_EPH
e610: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
e620: 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  X->iTable = iTab
e630: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65  ;.  }.  return e
e640: 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Type;.}.#endif..
e650: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
e660: 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73  ode for scalar s
e670: 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61  ubqueries used a
e680: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  s an expression.
e690: 2a 2a 20 61 6e 64 20 49 4e 20 6f 70 65 72 61 74  ** and IN operat
e6a0: 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  ors.  Examples:.
e6b0: 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43  **.**     (SELEC
e6c0: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
e6d0: 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79       -- subquery
e6e0: 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28  .**     EXISTS (
e6f0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
e700: 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62     -- EXISTS sub
e710: 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49  query.**     x I
e720: 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20  N (4,5,11)      
e730: 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70          -- IN op
e740: 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74  erator with list
e750: 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73   on right-hand s
e760: 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ide.**     x IN 
e770: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
e780: 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72  )     -- IN oper
e790: 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65  ator with subque
e7a0: 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a  ry on the right.
e7b0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20  **.** The pExpr 
e7c0: 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72 69  parameter descri
e7d0: 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  bes the expressi
e7e0: 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  on that contains
e7f0: 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61   the IN.** opera
e800: 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e  tor or subquery.
e810: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
e820: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
e830: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
e840: 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73 65  eSubselect(Parse
e850: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
e860: 70 45 78 70 72 2c 20 69 6e 74 20 72 4d 61 79 48  pExpr, int rMayH
e870: 61 76 65 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20  aveNull){.  int 
e880: 74 65 73 74 41 64 64 72 20 3d 20 30 3b 20 20 20  testAddr = 0;   
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8a0: 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20      /* One-time 
e8b0: 74 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a  test address */.
e8c0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
e8d0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
e8e0: 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
e8f0: 20 72 65 74 75 72 6e 3b 0a 0a 0a 20 20 2f 2a 20   return;...  /* 
e900: 54 68 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62  This code must b
e910: 65 20 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74  e run in its ent
e920: 69 72 65 74 79 20 65 76 65 72 79 20 74 69 6d 65  irety every time
e930: 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
e940: 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f  ed.  ** if any o
e950: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
e960: 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20  is true:.  **.  
e970: 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
e980: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
e990: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
e9a0: 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20  query.  **    * 
e9b0: 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
e9c0: 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72 65  side is an expre
e9d0: 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61  ssion list conta
e9e0: 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a  ining variables.
e9f0: 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72    **    *  We ar
ea00: 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67 67  e inside a trigg
ea10: 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  er.  **.  ** If 
ea20: 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65  all of the above
ea30: 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e   are false, then
ea40: 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73   we can run this
ea50: 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a   code just once.
ea60: 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65    ** save the re
ea70: 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65  sults, and reuse
ea80: 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
ea90: 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69   on subsequent i
eaa0: 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f  nvocations..  */
eab0: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 41  .  if( !ExprHasA
eac0: 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  nyProperty(pExpr
ead0: 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20  , EP_VarSelect) 
eae0: 26 26 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67  && !pParse->trig
eaf0: 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74  Stack ){.    int
eb00: 20 6d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d   mem = ++pParse-
eb10: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
eb20: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
eb30: 4f 50 5f 49 66 2c 20 6d 65 6d 29 3b 0a 20 20 20  OP_If, mem);.   
eb40: 20 74 65 73 74 41 64 64 72 20 3d 20 73 71 6c 69   testAddr = sqli
eb50: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
eb60: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
eb70: 6d 65 6d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  mem);.    assert
eb80: 28 20 74 65 73 74 41 64 64 72 3e 30 20 7c 7c 20  ( testAddr>0 || 
eb90: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
eba0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7d 0a  ocFailed );.  }.
ebb0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
ebc0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
ebd0: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
ebe0: 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20  char affinity;. 
ebf0: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79       KeyInfo key
ec00: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20  Info;.      int 
ec10: 61 64 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  addr;        /* 
ec20: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
ec30: 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
ec40: 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20  ruction */..    
ec50: 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75    if( rMayHaveNu
ec60: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ll ){.        sq
ec70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ec80: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
ec90: 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20  MayHaveNull);.  
eca0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 66 66      }..      aff
ecb0: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
ecc0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70  xprAffinity(pExp
ecd0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20  r->pLeft);..    
ece0: 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69    /* Whether thi
ecf0: 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45  s is an 'x IN(SE
ed00: 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20  LECT...)' or an 
ed10: 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e  'x IN(<exprlist>
ed20: 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  )'.      ** expr
ed30: 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e  ession it is han
ed40: 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61  dled the same wa
ed50: 79 2e 20 41 20 76 69 72 74 75 61 6c 20 74 61 62  y. A virtual tab
ed60: 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  le is .      ** 
ed70: 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67  filled with sing
ed80: 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b  le-field index k
ed90: 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67  eys representing
eda0: 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20   the results.   
edb0: 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53     ** from the S
edc0: 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78  ELECT or the <ex
edd0: 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a  prlist>..      *
ede0: 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
edf0: 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e  e 'x' expression
ee00: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c   is a column val
ee10: 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43  ue, or the SELEC
ee20: 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74  T....      ** st
ee30: 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20  atement returns 
ee40: 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
ee50: 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
ee60: 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20  y of that.      
ee70: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  ** column is use
ee80: 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69  d to build the i
ee90: 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f  ndex keys. If bo
eea0: 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20  th 'x' and the. 
eeb0: 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e       ** SELECT..
eec0: 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
eed0: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
eee0: 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69  meric affinity i
eef0: 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  s used.      ** 
ef00: 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e  if either column
ef10: 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20   has NUMERIC or 
ef20: 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79  INTEGER affinity
ef30: 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20  . If neither.   
ef40: 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68     ** 'x' nor th
ef50: 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  e SELECT... stat
ef60: 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
ef70: 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
ef80: 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a  affinity.      *
ef90: 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20  * is used..     
efa0: 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
efb0: 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65  >iTable = pParse
efc0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
efd0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
efe0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
eff0: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45  penEphemeral, pE
f000: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b  xpr->iTable, 1);
f010: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b  .      memset(&k
f020: 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  eyInfo, 0, sizeo
f030: 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20  f(keyInfo));.   
f040: 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c     keyInfo.nFiel
f050: 64 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 69 66  d = 1;..      if
f060: 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  ( pExpr->pSelect
f070: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
f080: 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20  ase 1:     expr 
f090: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
f0a0: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
f0b0: 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63     ** Generate c
f0c0: 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ode to write the
f0d0: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
f0e0: 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20  select into the 
f0f0: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
f100: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63    ** table alloc
f110: 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
f120: 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
f130: 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  /.        Select
f140: 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20  Dest dest;.     
f150: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
f160: 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 73 71  ist;..        sq
f170: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
f180: 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53  nit(&dest, SRT_S
f190: 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  et, pExpr->iTabl
f1a0: 65 29 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74  e);.        dest
f1b0: 2e 61 66 66 69 6e 69 74 79 20 3d 20 28 69 6e 74  .affinity = (int
f1c0: 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  )affinity;.     
f1d0: 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70     assert( (pExp
f1e0: 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30  r->iTable&0x0000
f1f0: 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54  FFFF)==pExpr->iT
f200: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  able );.        
f210: 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
f220: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
f230: 3e 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 2c  >pSelect, &dest,
f240: 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20   0, 0, 0) ){.   
f250: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
f260: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f270: 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
f280: 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  >pSelect->pEList
f290: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
f2a0: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
f2b0: 6e 45 78 70 72 3e 30 20 29 7b 20 0a 20 20 20 20  nExpr>0 ){ .    
f2c0: 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43        keyInfo.aC
f2d0: 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  oll[0] = sqlite3
f2e0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
f2f0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
f300: 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20  pr->pLeft,.     
f310: 20 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d           pEList-
f320: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
f330: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
f340: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70  lse if( pExpr->p
f350: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
f360: 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65  /* Case 2:     e
f370: 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74  xpr IN (exprlist
f380: 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
f390: 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68       ** For each
f3a0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69   expression, bui
f3b0: 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20  ld an index key 
f3c0: 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74  from the evaluat
f3d0: 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ion and.        
f3e0: 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74  ** store it in t
f3f0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
f400: 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73  le. If <expr> is
f410: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
f420: 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  use.        ** t
f430: 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69  hat columns affi
f440: 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69  nity when buildi
f450: 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49  ng index keys. I
f460: 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a  f <expr> is not.
f470: 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c          ** a col
f480: 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63  umn, use numeric
f490: 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20   affinity..     
f4a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
f4b0: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70  t i;.        Exp
f4c0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
f4d0: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
f4e0: 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
f4f0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
f500: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  ;.        int r1
f510: 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20  , r2, r3;..     
f520: 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79     if( !affinity
f530: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66   ){.          af
f540: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
f550: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
f560: 20 20 7d 0a 20 20 20 20 20 20 20 20 6b 65 79 49    }.        keyI
f570: 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70  nfo.aColl[0] = p
f580: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f  Expr->pLeft->pCo
f590: 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ll;..        /* 
f5a0: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
f5b0: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
f5c0: 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20  <exprlist>. */. 
f5d0: 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
f5e0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
f5f0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  arse);.        r
f600: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
f610: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
f620: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69         for(i=pLi
f630: 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  st->nExpr, pItem
f640: 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20  =pList->a; i>0; 
f650: 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
f660: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
f670: 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  E2 = pItem->pExp
f680: 72 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  r;..          /*
f690: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
f6a0: 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  on is not consta
f6b0: 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  nt then we will 
f6c0: 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  need to.        
f6d0: 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65    ** disable the
f6e0: 20 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67   test that was g
f6f0: 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74  enerated above t
f700: 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20  hat makes sure. 
f710: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
f720: 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75   code only execu
f730: 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75  tes once.  Becau
f740: 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e  se for a non-con
f750: 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20  stant.          
f760: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65  ** expression we
f770: 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74   need to rerun t
f780: 68 69 73 20 63 6f 64 65 20 65 61 63 68 20 74 69  his code each ti
f790: 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  me..          */
f7a0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 74  .          if( t
f7b0: 65 73 74 41 64 64 72 20 26 26 20 21 73 71 6c 69  estAddr && !sqli
f7c0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
f7d0: 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20  t(pE2) ){.      
f7e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f7f0: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
f800: 20 74 65 73 74 41 64 64 72 2d 31 2c 20 32 29 3b   testAddr-1, 2);
f810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
f820: 74 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  tAddr = 0;.     
f830: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
f840: 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
f850: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  e expression and
f860: 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20   insert it into 
f870: 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  the temp table *
f880: 2f 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  /.          pPar
f890: 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
f8a0: 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  che++;.         
f8b0: 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r3 = sqlite3Exp
f8c0: 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
f8d0: 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20  se, pE2, r1);.  
f8e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f8f0: 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
f900: 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20 20 20  olCache>0 );.   
f910: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64         pParse->d
f920: 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d  isableColCache--
f930: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
f940: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
f950: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
f960: 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69  r3, 1, r2, &affi
f970: 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
f980: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
f990: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
f9a0: 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31  ge(pParse, r3, 1
f9b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
f9c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f9d0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
f9e0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
f9f0: 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  2);.        }.  
fa00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
fa10: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
fa20: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
fa30: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
fa40: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
fa50: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
fa60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
fa70: 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28  ngeP4(v, addr, (
fa80: 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c  void *)&keyInfo,
fa90: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
faa0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
fab0: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ..    case TK_EX
fac0: 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
fad0: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
fae0: 20 20 2f 2a 20 54 68 69 73 20 68 61 73 20 74 6f    /* This has to
faf0: 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c   be a scalar SEL
fb00: 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63  ECT.  Generate c
fb10: 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20  ode to put the. 
fb20: 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
fb30: 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20   this select in 
fb40: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  a memory cell an
fb50: 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  d record the num
fb60: 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ber.      ** of 
fb70: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
fb80: 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20  in iColumn..    
fb90: 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69    */.      stati
fba0: 63 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e  c const Token on
fbb0: 65 20 3d 20 7b 20 28 75 38 2a 29 22 31 22 2c 20  e = { (u8*)"1", 
fbc0: 30 2c 20 31 20 7d 3b 0a 20 20 20 20 20 20 53 65  0, 1 };.      Se
fbd0: 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20  lect *pSel;.    
fbe0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
fbf0: 74 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c 20 3d  t;..      pSel =
fc00: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b   pExpr->pSelect;
fc10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
fc20: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
fc30: 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d  st, 0, ++pParse-
fc40: 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66  >nMem);.      if
fc50: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
fc60: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20  SELECT ){.      
fc70: 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
fc80: 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  RT_Mem;.        
fc90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fca0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
fcb0: 20 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20   dest.iParm);.  
fcc0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
fcd0: 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71  t((v, "Init subq
fce0: 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a  uery result"));.
fcf0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fd00: 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20       dest.eDest 
fd10: 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20  = SRT_Exists;.  
fd20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fd30: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
fd40: 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69  teger, 0, dest.i
fd50: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56  Parm);.        V
fd60: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
fd70: 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75  Init EXISTS resu
fd80: 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lt"));.      }. 
fd90: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fda0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
fdb0: 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29  b, pSel->pLimit)
fdc0: 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c  ;.      pSel->pL
fdd0: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45  imit = sqlite3PE
fde0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
fdf0: 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 26 6f  NTEGER, 0, 0, &o
fe00: 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ne);.      if( s
fe10: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
fe20: 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74  rse, pSel, &dest
fe30: 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  , 0, 0, 0) ){.  
fe40: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
fe50: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70      }.      pExp
fe60: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 64 65 73  r->iColumn = des
fe70: 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 62  t.iParm;.      b
fe80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
fe90: 0a 20 20 69 66 28 20 74 65 73 74 41 64 64 72 20  .  if( testAddr 
fea0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
feb0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 74 65  beJumpHere(v, te
fec0: 73 74 41 64 64 72 2d 31 29 3b 0a 20 20 7d 0a 0a  stAddr-1);.  }..
fed0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
fee0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
fef0: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f  T_SUBQUERY */../
ff00: 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 61  *.** Duplicate a
ff10: 6e 20 38 2d 62 79 74 65 20 76 61 6c 75 65 0a 2a  n 8-byte value.*
ff20: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64  /.static char *d
ff30: 75 70 38 62 79 74 65 73 28 56 64 62 65 20 2a 76  up8bytes(Vdbe *v
ff40: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e  , const char *in
ff50: 29 7b 0a 20 20 63 68 61 72 20 2a 6f 75 74 20 3d  ){.  char *out =
ff60: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
ff70: 52 61 77 28 73 71 6c 69 74 65 33 56 64 62 65 44  Raw(sqlite3VdbeD
ff80: 62 28 76 29 2c 20 38 29 3b 0a 20 20 69 66 28 20  b(v), 8);.  if( 
ff90: 6f 75 74 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  out ){.    memcp
ffa0: 79 28 6f 75 74 2c 20 69 6e 2c 20 38 29 3b 0a 20  y(out, in, 8);. 
ffb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 75 74 3b   }.  return out;
ffc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
ffd0: 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
ffe0: 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
fff0: 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  the floating poi
10000 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63  nt.** value desc
10010 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d  ribed by z[0..n-
10020 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  1] into register
10030 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   iMem..**.** The
10040 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c   z[] string will
10050 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65   probably not be
10060 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
10070 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a  .  But the .** z
10080 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73  [n] character is
10090 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
100a0 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  e something that
100b0 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a   does not look.*
100c0 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69  * like the conti
100d0 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  nuation of the n
100e0 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
100f0 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56   void codeReal(V
10100 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68  dbe *v, const ch
10110 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e  ar *z, int n, in
10120 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e  t negateFlag, in
10130 74 20 69 4d 65 6d 29 7b 0a 20 20 61 73 73 65 72  t iMem){.  asser
10140 74 28 20 7a 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20  t( z || v==0 || 
10150 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29  sqlite3VdbeDb(v)
10160 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
10170 3b 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20  ;.  if( z ){.   
10180 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20   double value;. 
10190 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20     char *zV;.   
101a0 20 61 73 73 65 72 74 28 20 21 69 73 64 69 67 69   assert( !isdigi
101b0 74 28 7a 5b 6e 5d 29 20 29 3b 0a 20 20 20 20 73  t(z[n]) );.    s
101c0 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76  qlite3AtoF(z, &v
101d0 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 73  alue);.    if( s
101e0 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75  qlite3IsNaN(valu
101f0 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
10200 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10210 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 4d 65   OP_Null, 0, iMe
10220 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  m);.    }else{. 
10230 20 20 20 20 20 69 66 28 20 6e 65 67 61 74 65 46       if( negateF
10240 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76  lag ) value = -v
10250 61 6c 75 65 3b 0a 20 20 20 20 20 20 7a 56 20 3d  alue;.      zV =
10260 20 64 75 70 38 62 79 74 65 73 28 76 2c 20 28 63   dup8bytes(v, (c
10270 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20  har*)&value);.  
10280 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10290 64 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 61 6c  ddOp4(v, OP_Real
102a0 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56  , 0, iMem, 0, zV
102b0 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 20 20  , P4_REAL);.    
102c0 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  }.  }.}.../*.** 
102d0 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
102e0 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
102f0 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65  l put the intege
10300 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a  r describe by.**
10310 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20   text z[0..n-1] 
10320 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
10330 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b  em..**.** The z[
10340 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72  ] string will pr
10350 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65  obably not be ze
10360 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20  ro-terminated.  
10370 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d  But the .** z[n]
10380 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75   character is gu
10390 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73  aranteed to be s
103a0 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f  omething that do
103b0 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c  es not look.** l
103c0 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61  ike the continua
103d0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62  tion of the numb
103e0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
103f0 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 56  id codeInteger(V
10400 64 62 65 20 2a 76 2c 20 45 78 70 72 20 2a 70 45  dbe *v, Expr *pE
10410 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67  xpr, int negFlag
10420 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 63  , int iMem){.  c
10430 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
10440 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
10450 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
10460 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45  {.    int i = pE
10470 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
10480 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69   if( negFlag ) i
10490 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74   = -i;.    sqlit
104a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
104b0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69  OP_Integer, i, i
104c0 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Mem);.  }else if
104d0 28 20 28 7a 20 3d 20 28 63 68 61 72 2a 29 70 45  ( (z = (char*)pE
104e0 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29 21 3d 30  xpr->token.z)!=0
104f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
10500 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72     int n = pExpr
10510 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 61  ->token.n;.    a
10520 73 73 65 72 74 28 20 21 69 73 64 69 67 69 74 28  ssert( !isdigit(
10530 7a 5b 6e 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  z[n]) );.    if(
10540 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
10550 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20 20 20  (z, &i) ){.     
10560 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69   if( negFlag ) i
10570 20 3d 20 2d 69 3b 0a 20 20 20 20 20 20 73 71 6c   = -i;.      sql
10580 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10590 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
105a0 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 65 6c 73   iMem);.    }els
105b0 65 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 74  e if( sqlite3Fit
105c0 73 49 6e 36 34 42 69 74 73 28 7a 2c 20 6e 65 67  sIn64Bits(z, neg
105d0 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20 20 69  Flag) ){.      i
105e0 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 20 20  64 value;.      
105f0 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 20 20  char *zV;.      
10600 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 2c  sqlite3Atoi64(z,
10610 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20   &value);.      
10620 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 76 61  if( negFlag ) va
10630 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20  lue = -value;.  
10640 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74      zV = dup8byt
10650 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61  es(v, (char*)&va
10660 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lue);.      sqli
10670 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
10680 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d   OP_Int64, 0, iM
10690 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49 4e  em, 0, zV, P4_IN
106a0 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  T64);.    }else{
106b0 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28  .      codeReal(
106c0 76 2c 20 7a 2c 20 6e 2c 20 6e 65 67 46 6c 61 67  v, z, n, negFlag
106d0 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20  , iMem);.    }. 
106e0 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   }.}.../*.** Gen
106f0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
10700 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65  will extract the
10710 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
10720 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65  mn from.** table
10730 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20   pTab and store 
10740 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
10750 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20   in a register. 
10760 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69 73   An effort.** is
10770 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74   made to store t
10780 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
10790 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
107a0 2c 20 62 75 74 20 74 68 69 73 20 69 73 0a 2a 2a  , but this is.**
107b0 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64 2e   not guaranteed.
107c0 20 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f    The location o
107d0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  f the column val
107e0 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ue is returned..
107f0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
10800 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73   be an open curs
10810 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54  or to pTab in iT
10820 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  able when this r
10830 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
10840 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e  led.  If iColumn
10850 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20  <0 then code is 
10860 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65  generated that e
10870 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69  xtracts the rowi
10880 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
10890 75 74 69 6e 65 20 6d 69 67 68 74 20 61 74 74 65  utine might atte
108a0 6d 70 74 20 74 6f 20 72 65 75 73 65 20 74 68 65  mpt to reuse the
108b0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f   value of the co
108c0 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a 20 68 61 73  lumn that.** has
108d0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6c 6f   already been lo
108e0 61 64 65 64 20 69 6e 74 6f 20 61 20 72 65 67 69  aded into a regi
108f0 73 74 65 72 2e 20 20 54 68 65 20 76 61 6c 75 65  ster.  The value
10900 20 77 69 6c 6c 20 61 6c 77 61 79 73 0a 2a 2a 20   will always.** 
10910 62 65 20 75 73 65 64 20 69 66 20 69 74 20 68 61  be used if it ha
10920 73 20 6e 6f 74 20 75 6e 64 65 72 67 6f 6e 65 20  s not undergone 
10930 61 6e 79 20 61 66 66 69 6e 69 74 79 20 63 68 61  any affinity cha
10940 6e 67 65 73 2e 20 20 42 75 74 20 69 66 0a 2a 2a  nges.  But if.**
10950 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61   an affinity cha
10960 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72 65 64  nge has occurred
10970 2c 20 74 68 65 6e 20 74 68 65 20 63 61 63 68 65  , then the cache
10980 64 20 76 61 6c 75 65 20 77 69 6c 6c 20 6f 6e 6c  d value will onl
10990 79 20 62 65 0a 2a 2a 20 75 73 65 64 20 69 66 20  y be.** used if 
109a0 61 6c 6c 6f 77 41 66 66 43 68 6e 67 20 69 73 20  allowAffChng is 
109b0 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  true..*/.int sql
109c0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
109d0 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
109e0 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
109f0 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
10a00 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
10a10 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
10a20 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  b,     /* Descri
10a30 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62  ption of the tab
10a40 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  le we are readin
10a50 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  g from */.  int 
10a60 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20  iColumn,     /* 
10a70 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  Index of the tab
10a80 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  le column */.  i
10a90 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
10aa0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f  /* The cursor po
10ab0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61  inting to the ta
10ac0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
10ad0 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  g,        /* Sto
10ae0 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  re results here 
10af0 2a 2f 0a 20 20 69 6e 74 20 61 6c 6c 6f 77 41 66  */.  int allowAf
10b00 66 43 68 6e 67 20 2f 2a 20 54 72 75 65 20 69 66  fChng /* True if
10b10 20 70 72 69 6f 72 20 61 66 66 69 6e 69 74 79 20   prior affinity 
10b20 63 68 61 6e 67 65 73 20 61 72 65 20 4f 4b 20 2a  changes are OK *
10b30 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
10b40 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
10b50 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
10b60 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
10b70 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
10b80 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
10b90 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43   i<pParse->nColC
10ba0 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ache; i++, p++){
10bb0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62  .    if( p->iTab
10bc0 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d  le==iTable && p-
10bd0 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d  >iColumn==iColum
10be0 6e 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  n.           && 
10bf0 28 21 70 2d 3e 61 66 66 43 68 61 6e 67 65 20 7c  (!p->affChange |
10c00 7c 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67 29 20  | allowAffChng) 
10c10 29 7b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 73  ){.#if 0.      s
10c20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
10c30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20  (v, OP_Noop);.  
10c40 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
10c50 28 76 2c 20 22 4f 50 54 3a 20 74 61 62 25 64 2e  (v, "OPT: tab%d.
10c60 63 6f 6c 25 64 20 2d 3e 20 72 25 64 22 2c 20 69  col%d -> r%d", i
10c70 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20  Table, iColumn, 
10c80 70 2d 3e 69 52 65 67 29 29 3b 0a 23 65 6e 64 69  p->iReg));.#endi
10c90 66 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  f.      return p
10ca0 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ->iReg;.    }.  
10cb0 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20 76 21  }  .  assert( v!
10cc0 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 43 6f 6c  =0 );.  if( iCol
10cd0 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74  umn<0 ){.    int
10ce0 20 6f 70 20 3d 20 28 70 54 61 62 20 26 26 20 49   op = (pTab && I
10cf0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29 20  sVirtual(pTab)) 
10d00 3f 20 4f 50 5f 56 52 6f 77 69 64 20 3a 20 4f 50  ? OP_VRowid : OP
10d10 5f 52 6f 77 69 64 3b 0a 20 20 20 20 73 71 6c 69  _Rowid;.    sqli
10d20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10d30 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69 52 65   op, iTable, iRe
10d40 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  g);.  }else if( 
10d50 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pTab==0 ){.    s
10d60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10d70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
10d80 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20  Table, iColumn, 
10d90 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iReg);.  }else{.
10da0 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56      int op = IsV
10db0 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f  irtual(pTab) ? O
10dc0 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43  P_VColumn : OP_C
10dd0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74  olumn;.    sqlit
10de0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
10df0 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  op, iTable, iCol
10e00 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  umn, iReg);.    
10e10 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66  sqlite3ColumnDef
10e20 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43  ault(v, pTab, iC
10e30 6f 6c 75 6d 6e 29 3b 0a 23 69 66 6e 64 65 66 20  olumn);.#ifndef 
10e40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
10e50 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 69  TING_POINT.    i
10e60 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  f( pTab->aCol[iC
10e70 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d  olumn].affinity=
10e80 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
10e90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10ea0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
10eb0 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20  P_RealAffinity, 
10ec0 69 52 65 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  iReg);.    }.#en
10ed0 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  dif.  }.  if( pP
10ee0 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
10ef0 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Cache==0 ){.    
10f00 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 6f 6c  i = pParse->iCol
10f10 43 61 63 68 65 3b 0a 20 20 20 20 70 20 3d 20 26  Cache;.    p = &
10f20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
10f30 65 5b 69 5d 3b 0a 20 20 20 20 70 2d 3e 69 54 61  e[i];.    p->iTa
10f40 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
10f50 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69    p->iColumn = i
10f60 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 2d 3e 69  Column;.    p->i
10f70 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20  Reg = iReg;.    
10f80 70 2d 3e 61 66 66 43 68 61 6e 67 65 20 3d 20 30  p->affChange = 0
10f90 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 69  ;.    i++;.    i
10fa0 66 28 20 69 3e 3d 41 72 72 61 79 53 69 7a 65 28  f( i>=ArraySize(
10fb0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
10fc0 65 29 20 29 20 69 20 3d 20 30 3b 0a 20 20 20 20  e) ) i = 0;.    
10fd0 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 43  if( i>pParse->nC
10fe0 6f 6c 43 61 63 68 65 20 29 20 70 50 61 72 73 65  olCache ) pParse
10ff0 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 3d 20 69 3b  ->nColCache = i;
11000 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 43 6f  .    pParse->iCo
11010 6c 43 61 63 68 65 20 3d 20 69 3b 0a 20 20 7d 0a  lCache = i;.  }.
11020 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d    return iReg;.}
11030 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c  ../*.** Clear al
11040 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65  l column cache e
11050 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65  ntries associate
11060 64 20 77 69 74 68 20 74 68 65 20 76 64 62 65 0a  d with the vdbe.
11070 2a 2a 20 63 75 72 73 6f 72 20 77 69 74 68 20 63  ** cursor with c
11080 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 54 61  ursor number iTa
11090 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
110a0 69 74 65 33 45 78 70 72 43 6c 65 61 72 43 6f 6c  ite3ExprClearCol
110b0 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a  umnCache(Parse *
110c0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62  pParse, int iTab
110d0 6c 65 29 7b 0a 20 20 69 66 28 20 69 54 61 62 6c  le){.  if( iTabl
110e0 65 3c 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73  e<0 ){.    pPars
110f0 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 3d 20 30  e->nColCache = 0
11100 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 43  ;.    pParse->iC
11110 6f 6c 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 7d  olCache = 0;.  }
11120 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b  else{.    int i;
11130 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11140 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
11150 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
11160 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43  f( pParse->aColC
11170 61 63 68 65 5b 69 5d 2e 69 54 61 62 6c 65 3d 3d  ache[i].iTable==
11180 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
11190 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 70    testcase( i==p
111a0 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
111b0 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  -1 );.        pP
111c0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
111d0 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f  i] = pParse->aCo
111e0 6c 43 61 63 68 65 5b 2d 2d 70 50 61 72 73 65 2d  lCache[--pParse-
111f0 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a 20 20 20  >nColCache];.   
11200 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 43 6f       pParse->iCo
11210 6c 43 61 63 68 65 20 3d 20 70 50 61 72 73 65 2d  lCache = pParse-
11220 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 20 20 20 20  >nColCache;.    
11230 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
11240 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
11250 65 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61  e fact that an a
11260 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68  ffinity change h
11270 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69  as occurred on i
11280 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65  Count.** registe
11290 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  rs starting with
112a0 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64   iStart..*/.void
112b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
112c0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
112d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
112e0 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69  nt iStart, int i
112f0 43 6f 75 6e 74 29 7b 0a 20 20 69 6e 74 20 69 45  Count){.  int iE
11300 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69 43  nd = iStart + iC
11310 6f 75 6e 74 20 2d 20 31 3b 0a 20 20 69 6e 74 20  ount - 1;.  int 
11320 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
11330 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
11340 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  e; i++){.    int
11350 20 72 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f   r = pParse->aCo
11360 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a  lCache[i].iReg;.
11370 20 20 20 20 69 66 28 20 72 3e 3d 69 53 74 61 72      if( r>=iStar
11380 74 20 26 26 20 72 3c 3d 69 45 6e 64 20 29 7b 0a  t && r<=iEnd ){.
11390 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 43        pParse->aC
113a0 6f 6c 43 61 63 68 65 5b 69 5d 2e 61 66 66 43 68  olCache[i].affCh
113b0 61 6e 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ange = 1;.    }.
113c0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
113d0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  erate code to mo
113e0 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ve content from 
113f0 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e  registers iFrom.
11400 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a  ..iFrom+nReg-1.*
11410 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69  * over to iTo..i
11420 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20  To+nReg-1. Keep 
11430 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
11440 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a   up-to-date..*/.
11450 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
11460 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a  CodeMove(Parse *
11470 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
11480 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20  m, int iTo, int 
11490 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nReg){.  int i;.
114a0 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 69 54 6f    if( iFrom==iTo
114b0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
114c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
114d0 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
114e0 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54  _Move, iFrom, iT
114f0 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 66 6f 72 28  o, nReg);.  for(
11500 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
11510 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a  ColCache; i++){.
11520 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 61 72      int x = pPar
11530 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
11540 2e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 78  .iReg;.    if( x
11550 3e 3d 69 46 72 6f 6d 20 26 26 20 78 3c 69 46 72  >=iFrom && x<iFr
11560 6f 6d 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20 20  om+nReg ){.     
11570 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
11580 68 65 5b 69 5d 2e 69 52 65 67 20 2b 3d 20 69 54  he[i].iReg += iT
11590 6f 2d 69 46 72 6f 6d 3b 0a 20 20 20 20 7d 0a 20  o-iFrom;.    }. 
115a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
115b0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 70  rate code to cop
115c0 79 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72  y content from r
115d0 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e  egisters iFrom..
115e0 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a  .iFrom+nReg-1.**
115f0 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54   over to iTo..iT
11600 6f 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76 6f 69  o+nReg-1..*/.voi
11610 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
11620 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61  eCopy(Parse *pPa
11630 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  rse, int iFrom, 
11640 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65  int iTo, int nRe
11650 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  g){.  int i;.  i
11660 66 28 20 69 46 72 6f 6d 3d 3d 69 54 6f 20 29 20  f( iFrom==iTo ) 
11670 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
11680 30 3b 20 69 3c 6e 52 65 67 3b 20 69 2b 2b 29 7b  0; i<nReg; i++){
11690 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
116a0 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
116b0 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 69  Vdbe, OP_Copy, i
116c0 46 72 6f 6d 2b 69 2c 20 69 54 6f 2b 69 29 3b 0a  From+i, iTo+i);.
116d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
116e0 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20  urn true if any 
116f0 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20  register in the 
11700 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f  range iFrom..iTo
11710 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20   (inclusive).** 
11720 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20  is used as part 
11730 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  of the column ca
11740 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  che..*/.static i
11750 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  nt usedAsColumnC
11760 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
11770 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  se, int iFrom, i
11780 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69  nt iTo){.  int i
11790 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
117a0 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
117b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
117c0 72 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  r = pParse->aCol
117d0 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20  Cache[i].iReg;. 
117e0 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20     if( r>=iFrom 
117f0 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75  && r<=iTo ) retu
11800 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
11810 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
11820 68 65 72 65 73 20 69 73 20 61 20 76 61 6c 75 65  heres is a value
11830 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 43 75   in register iCu
11840 72 72 65 6e 74 2e 20 20 57 65 20 75 6c 74 69 6d  rrent.  We ultim
11850 61 74 65 6c 79 20 77 61 6e 74 0a 2a 2a 20 74 68  ately want.** th
11860 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 69 6e  e value to be in
11870 20 72 65 67 69 73 74 65 72 20 69 54 61 72 67 65   register iTarge
11880 74 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65 20  t.  It might be 
11890 74 68 61 74 0a 2a 2a 20 69 43 75 72 72 65 6e 74  that.** iCurrent
118a0 20 61 6e 64 20 69 54 61 72 67 65 74 20 61 72 65   and iTarget are
118b0 20 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74   the same regist
118c0 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 72 65  er..**.** We are
118d0 20 67 6f 69 6e 67 20 74 6f 20 6d 6f 64 69 66 79   going to modify
118e0 20 74 68 65 20 76 61 6c 75 65 2c 20 73 6f 20 77   the value, so w
118f0 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73  e need to make s
11900 75 72 65 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 74  ure it.** is not
11910 20 61 20 63 61 63 68 65 64 20 72 65 67 69 73 74   a cached regist
11920 65 72 2e 20 20 49 66 20 69 43 75 72 72 65 6e 74  er.  If iCurrent
11930 20 69 73 20 61 20 63 61 63 68 65 64 20 72 65 67   is a cached reg
11940 69 73 74 65 72 2c 0a 2a 2a 20 74 68 65 6e 20 74  ister,.** then t
11950 72 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76  ry to move the v
11960 61 6c 75 65 20 6f 76 65 72 20 74 6f 20 69 54 61  alue over to iTa
11970 72 67 65 74 2e 20 20 49 66 20 69 54 61 72 67 65  rget.  If iTarge
11980 74 20 69 73 20 61 0a 2a 2a 20 63 61 63 68 65 64  t is a.** cached
11990 20 72 65 67 69 73 74 65 72 2c 20 74 68 65 6e 20   register, then 
119a0 63 6c 65 61 72 20 74 68 65 20 63 6f 72 72 65 73  clear the corres
119b0 70 6f 6e 64 69 6e 67 20 63 61 63 68 65 20 6c 69  ponding cache li
119c0 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ne..**.** Return
119d0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 74 68   the register th
119e0 61 74 20 74 68 65 20 76 61 6c 75 65 20 65 6e 64  at the value end
119f0 73 20 75 70 20 69 6e 2e 0a 2a 2f 0a 69 6e 74 20  s up in..*/.int 
11a00 73 71 6c 69 74 65 33 45 78 70 72 57 72 69 74 61  sqlite3ExprWrita
11a10 62 6c 65 52 65 67 69 73 74 65 72 28 50 61 72 73  bleRegister(Pars
11a20 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
11a30 43 75 72 72 65 6e 74 2c 20 69 6e 74 20 69 54 61  Current, int iTa
11a40 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rget){.  int i;.
11a50 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
11a60 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 0a 20 20  ->pVdbe!=0 );.  
11a70 69 66 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d  if( !usedAsColum
11a80 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69  nCache(pParse, i
11a90 43 75 72 72 65 6e 74 2c 20 69 43 75 72 72 65 6e  Current, iCurren
11aa0 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
11ab0 20 69 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20   iCurrent;.  }. 
11ac0 20 69 66 28 20 69 43 75 72 72 65 6e 74 21 3d 69   if( iCurrent!=i
11ad0 54 61 72 67 65 74 20 29 7b 0a 20 20 20 20 73 71  Target ){.    sq
11ae0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11af0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
11b00 50 5f 53 43 6f 70 79 2c 20 69 43 75 72 72 65 6e  P_SCopy, iCurren
11b10 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d  t, iTarget);.  }
11b20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
11b30 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b  arse->nColCache;
11b40 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
11b50 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
11b60 5b 69 5d 2e 69 52 65 67 3d 3d 69 54 61 72 67 65  [i].iReg==iTarge
11b70 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  t ){.      pPars
11b80 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 20  e->aColCache[i] 
11b90 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  = pParse->aColCa
11ba0 63 68 65 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 43  che[--pParse->nC
11bb0 6f 6c 43 61 63 68 65 5d 3b 0a 20 20 20 20 20 20  olCache];.      
11bc0 70 50 61 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68  pParse->iColCach
11bd0 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  e = pParse->nCol
11be0 43 61 63 68 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  Cache;.    }.  }
11bf0 0a 20 20 72 65 74 75 72 6e 20 69 54 61 72 67 65  .  return iTarge
11c00 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  t;.}../*.** If t
11c10 68 65 20 6c 61 73 74 20 69 6e 73 74 72 75 63 74  he last instruct
11c20 69 6f 6e 20 63 6f 64 65 64 20 69 73 20 61 6e 20  ion coded is an 
11c30 65 70 68 65 6d 65 72 61 6c 20 63 6f 70 79 20 6f  ephemeral copy o
11c40 66 20 61 6e 79 20 6f 66 0a 2a 2a 20 74 68 65 20  f any of.** the 
11c50 72 65 67 69 73 74 65 72 73 20 69 6e 20 74 68 65  registers in the
11c60 20 6e 52 65 67 20 72 65 67 69 73 74 65 72 73 20   nReg registers 
11c70 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 69  beginning with i
11c80 52 65 67 2c 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e  Reg, then.** con
11c90 76 65 72 74 20 74 68 65 20 6c 61 73 74 20 69 6e  vert the last in
11ca0 73 74 72 75 63 74 69 6f 6e 20 66 72 6f 6d 20 4f  struction from O
11cb0 50 5f 53 43 6f 70 79 20 74 6f 20 4f 50 5f 43 6f  P_SCopy to OP_Co
11cc0 70 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  py..*/.void sqli
11cd0 74 65 33 45 78 70 72 48 61 72 64 43 6f 70 79 28  te3ExprHardCopy(
11ce0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
11cf0 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65  nt iReg, int nRe
11d00 67 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  g){.  int addr;.
11d10 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
11d20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 76 20 3d   Vdbe *v;..  v =
11d30 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
11d40 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
11d50 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
11d60 76 29 3b 0a 20 20 70 4f 70 20 3d 20 73 71 6c 69  v);.  pOp = sqli
11d70 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
11d80 61 64 64 72 2d 31 29 3b 0a 20 20 61 73 73 65 72  addr-1);.  asser
11d90 74 28 20 70 4f 70 20 7c 7c 20 70 50 61 72 73 65  t( pOp || pParse
11da0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
11db0 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 20  ed );.  if( pOp 
11dc0 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  && pOp->opcode==
11dd0 4f 50 5f 53 43 6f 70 79 20 26 26 20 70 4f 70 2d  OP_SCopy && pOp-
11de0 3e 70 31 3e 3d 69 52 65 67 20 26 26 20 70 4f 70  >p1>=iReg && pOp
11df0 2d 3e 70 31 3c 69 52 65 67 2b 6e 52 65 67 20 29  ->p1<iReg+nReg )
11e00 7b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64  {.    pOp->opcod
11e10 65 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20 20 7d  e = OP_Copy;.  }
11e20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
11e30 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
11e40 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
11e50 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
11e60 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
11e70 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73  n.  Attempt to s
11e80 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
11e90 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61   in register "ta
11ea0 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e  rget"..** Return
11eb0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68   the register wh
11ec0 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ere results are 
11ed0 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69  stored..**.** Wi
11ee0 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  th this routine,
11ef0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61   there is no gua
11f00 72 61 6e 74 65 65 64 20 74 68 61 74 20 72 65 73  ranteed that res
11f10 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  ults will.** be 
11f20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74  stored in target
11f30 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69  .  The result mi
11f40 67 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e  ght be stored in
11f50 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72   some other.** r
11f60 65 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73  egister if it is
11f70 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64   convenient to d
11f80 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69  o so.  The calli
11f90 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  ng function.** m
11fa0 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65  ust check the re
11fb0 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f  turn code and mo
11fc0 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74  ve the results t
11fd0 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a  o the desired.**
11fe0 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e   register..*/.in
11ff0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
12000 65 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70  eTarget(Parse *p
12010 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
12020 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
12030 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
12040 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20  rse->pVdbe;  /* 
12050 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e  The VM under con
12060 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
12070 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
12080 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12090 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64  opcode being cod
120a0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65  ed */.  int inRe
120b0 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20  g = target;     
120c0 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f    /* Results sto
120d0 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
120e0 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72  inReg */.  int r
120f0 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20  egFree1 = 0;    
12100 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
12110 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65  ero free this te
12120 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
12130 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65   */.  int regFre
12140 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e2 = 0;         
12150 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66  /* If non-zero f
12160 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61  ree this tempora
12170 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ry register */. 
12180 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 2c   int r1, r2, r3,
12190 20 72 34 3b 20 20 20 20 20 20 20 2f 2a 20 56 61   r4;       /* Va
121a0 72 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e  rious register n
121b0 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 61 73 73  umbers */..  ass
121c0 65 72 74 28 20 76 21 3d 30 20 7c 7c 20 70 50 61  ert( v!=0 || pPa
121d0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
121e0 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72  ailed );.  asser
121f0 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
12200 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
12210 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d  Mem );.  if( v==
12220 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
12230 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b   if( pExpr==0 ){
12240 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c  .    op = TK_NUL
12250 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
12260 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
12270 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70    }.  switch( op
12280 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
12290 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  AGG_COLUMN: {.  
122a0 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67      AggInfo *pAg
122b0 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  gInfo = pExpr->p
122c0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73  AggInfo;.      s
122d0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
122e0 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49  l *pCol = &pAggI
122f0 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  nfo->aCol[pExpr-
12300 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66  >iAgg];.      if
12310 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  ( !pAggInfo->dir
12320 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  ectMode ){.     
12330 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
12340 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20  >iMem>0 );.     
12350 20 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d     inReg = pCol-
12360 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62  >iMem;.        b
12370 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
12380 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e  e if( pAggInfo->
12390 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b  useSortingIdx ){
123a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
123b0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
123c0 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66  _Column, pAggInf
123d0 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20  o->sortingIdx,. 
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
12400 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
12410 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
12420 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12430 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72  }.      /* Other
12440 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20  wise, fall thru 
12450 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55  into the TK_COLU
12460 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  MN case */.    }
12470 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
12480 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  UMN: {.      if(
12490 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30   pExpr->iTable<0
124a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
124b0 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
124c0 20 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65   when coding che
124d0 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ck constraints *
124e0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
124f0 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65  ( pParse->ckBase
12500 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  >0 );.        in
12510 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Reg = pExpr->iCo
12520 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63  lumn + pParse->c
12530 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 7d 65 6c  kBase;.      }el
12540 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
12550 63 61 73 65 28 20 28 70 45 78 70 72 2d 3e 66 6c  case( (pExpr->fl
12560 61 67 73 20 26 20 45 50 5f 41 6e 79 41 66 66 29  ags & EP_AnyAff)
12570 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
12580 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
12590 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
125a0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
125b0 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
125c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125d0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
125e0 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61  lumn, pExpr->iTa
125f0 62 6c 65 2c 20 74 61 72 67 65 74 2c 0a 20 20 20  ble, target,.   
12600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
12620 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
12630 41 6e 79 41 66 66 29 3b 0a 20 20 20 20 20 20 7d  AnyAff);.      }
12640 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12650 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
12660 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
12670 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20   codeInteger(v, 
12680 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74  pExpr, 0, target
12690 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
126a0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
126b0 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  K_FLOAT: {.     
126c0 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 28 63 68   codeReal(v, (ch
126d0 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
126e0 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
126f0 2e 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  .n, 0, target);.
12700 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12710 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
12720 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73  TRING: {.      s
12730 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70  qlite3DequoteExp
12740 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  r(pParse->db, pE
12750 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
12760 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
12770 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 74  OP_String8, 0, t
12780 61 72 67 65 74 2c 20 30 2c 0a 20 20 20 20 20 20  arget, 0,.      
12790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127a0 20 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e    (char*)pExpr->
127b0 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
127c0 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  token.n);.      
127d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
127e0 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b   case TK_NULL: {
127f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12800 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
12810 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
12820 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12830 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
12840 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54  TE_OMIT_BLOB_LIT
12850 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b  ERAL.    case TK
12860 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69  _BLOB: {.      i
12870 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73  nt n;.      cons
12880 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20  t char *z;.     
12890 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20   char *zBlob;.  
128a0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
128b0 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 3d 33 20 29 3b  r->token.n>=3 );
128c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
128d0 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d  Expr->token.z[0]
128e0 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e  =='x' || pExpr->
128f0 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 58 27 20  token.z[0]=='X' 
12900 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
12910 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b   pExpr->token.z[
12920 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  1]=='\'' );.    
12930 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
12940 3e 74 6f 6b 65 6e 2e 7a 5b 70 45 78 70 72 2d 3e  >token.z[pExpr->
12950 74 6f 6b 65 6e 2e 6e 2d 31 5d 3d 3d 27 5c 27 27  token.n-1]=='\''
12960 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 45   );.      n = pE
12970 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d 20 33  xpr->token.n - 3
12980 3b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61  ;.      z = (cha
12990 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
129a0 7a 20 2b 20 32 3b 0a 20 20 20 20 20 20 7a 42 6c  z + 2;.      zBl
129b0 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54  ob = sqlite3HexT
129c0 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62  oBlob(sqlite3Vdb
129d0 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20  eDb(v), z, n);. 
129e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
129f0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f  AddOp4(v, OP_Blo
12a00 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20  b, n/2, target, 
12a10 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e  0, zBlob, P4_DYN
12a20 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65  AMIC);.      bre
12a30 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
12a40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
12a50 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73  IABLE: {.      s
12a60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12a70 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c  (v, OP_Variable,
12a80 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
12a90 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
12aa0 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  f( pExpr->token.
12ab0 6e 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  n>1 ){.        s
12ac0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
12ad0 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
12ae0 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
12af0 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
12b00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12b10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12b20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
12b30 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  R: {.      inReg
12b40 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
12b50 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
12b60 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
12b70 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
12b80 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20    case TK_CAST: 
12b90 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65  {.      /* Expre
12ba0 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
12bb0 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74  rm:   CAST(pLeft
12bc0 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20   AS token) */.  
12bd0 20 20 20 20 69 6e 74 20 61 66 66 2c 20 74 6f 5f      int aff, to_
12be0 6f 70 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20  op;.      inReg 
12bf0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
12c00 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
12c10 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
12c20 72 67 65 74 29 3b 0a 20 20 20 20 20 20 61 66 66  rget);.      aff
12c30 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69   = sqlite3Affini
12c40 74 79 54 79 70 65 28 26 70 45 78 70 72 2d 3e 74  tyType(&pExpr->t
12c50 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 74 6f 5f  oken);.      to_
12c60 6f 70 20 3d 20 61 66 66 20 2d 20 53 51 4c 49 54  op = aff - SQLIT
12c70 45 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f  E_AFF_TEXT + OP_
12c80 54 6f 54 65 78 74 3b 0a 20 20 20 20 20 20 61 73  ToText;.      as
12c90 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
12ca0 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61 66 66  ToText    || aff
12cb0 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  !=SQLITE_AFF_TEX
12cc0 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73  T    );.      as
12cd0 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
12ce0 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66  ToBlob    || aff
12cf0 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  !=SQLITE_AFF_NON
12d00 45 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73  E    );.      as
12d10 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
12d20 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66 66  ToNumeric || aff
12d30 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  !=SQLITE_AFF_NUM
12d40 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20 61 73  ERIC );.      as
12d50 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
12d60 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61 66 66  ToInt     || aff
12d70 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  !=SQLITE_AFF_INT
12d80 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20 61 73  EGER );.      as
12d90 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  sert( to_op==OP_
12da0 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61 66 66  ToReal    || aff
12db0 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  !=SQLITE_AFF_REA
12dc0 4c 20 20 20 20 29 3b 0a 20 20 20 20 20 20 74 65  L    );.      te
12dd0 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
12de0 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20 20 20 20  P_ToText );.    
12df0 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f    testcase( to_o
12e00 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a  p==OP_ToBlob );.
12e10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12e20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65  to_op==OP_ToNume
12e30 72 69 63 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ric );.      tes
12e40 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50  tcase( to_op==OP
12e50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20  _ToInt );.      
12e60 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
12e70 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b 0a 20 20  =OP_ToReal );.  
12e80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12e90 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f 70 2c 20  ddOp1(v, to_op, 
12ea0 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 74 65  inReg);.      te
12eb0 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43 6f  stcase( usedAsCo
12ec0 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
12ed0 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20  , inReg, inReg) 
12ee0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12ef0 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
12f00 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
12f10 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20  inReg, 1);.     
12f20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
12f30 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
12f40 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20  MIT_CAST */.    
12f50 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
12f60 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
12f70 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
12f80 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
12f90 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
12fa0 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
12fb0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
12fc0 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20  T==OP_Lt );.    
12fd0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
12fe0 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Le );.      
12ff0 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f  assert( TK_GT==O
13000 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Gt );.      as
13010 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f  sert( TK_GE==OP_
13020 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Ge );.      asse
13030 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  rt( TK_EQ==OP_Eq
13040 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
13050 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29  ( TK_NE==OP_Ne )
13060 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13070 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20  ( op==TK_LT );. 
13080 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
13090 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  p==TK_LE );.    
130a0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
130b0 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_GT );.      t
130c0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
130d0 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GE );.      test
130e0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20  case( op==TK_EQ 
130f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
13100 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  e( op==TK_NE );.
13110 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
13120 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73 65  eOperands(pParse
13130 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
13140 26 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c 0a  &r1, &regFree1,.
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13170 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c    pExpr->pRight,
13180 20 26 72 32 2c 20 26 72 65 67 46 72 65 65 32 29   &r2, &regFree2)
13190 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
131a0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
131b0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
131c0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
131d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
131e0 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51  1, r2, inReg, SQ
131f0 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20  LITE_STOREP2);. 
13200 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
13210 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
13220 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
13230 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
13240 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13250 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
13260 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
13270 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55  .    case TK_PLU
13280 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
13290 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TAR:.    case TK
132a0 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65  _MINUS:.    case
132b0 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73   TK_REM:.    cas
132c0 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20  e TK_BITAND:.   
132d0 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a   case TK_BITOR:.
132e0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
132f0 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  H:.    case TK_L
13300 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20  SHIFT:.    case 
13310 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20  TK_RSHIFT: .    
13320 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
13330 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
13340 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29  TK_AND==OP_And )
13350 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13360 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a  TK_OR==OP_Or );.
13370 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
13380 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b  _PLUS==OP_Add );
13390 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
133a0 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74  K_MINUS==OP_Subt
133b0 72 61 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73  ract );.      as
133c0 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50  sert( TK_REM==OP
133d0 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20  _Remainder );.  
133e0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
133f0 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64  ITAND==OP_BitAnd
13400 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
13410 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42  ( TK_BITOR==OP_B
13420 69 74 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73  itOr );.      as
13430 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d  sert( TK_SLASH==
13440 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20  OP_Divide );.   
13450 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53     assert( TK_LS
13460 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65  HIFT==OP_ShiftLe
13470 66 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ft );.      asse
13480 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f  rt( TK_RSHIFT==O
13490 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a  P_ShiftRight );.
134a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
134b0 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63  _CONCAT==OP_Conc
134c0 61 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  at );.      test
134d0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44  case( op==TK_AND
134e0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
134f0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  se( op==TK_OR );
13500 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13510 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a   op==TK_PLUS );.
13520 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13530 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a  op==TK_MINUS );.
13540 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13550 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20  op==TK_REM );.  
13560 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
13570 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20  ==TK_BITAND );. 
13580 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
13590 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20  p==TK_BITOR );. 
135a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
135b0 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20  p==TK_SLASH );. 
135c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
135d0 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a  p==TK_LSHIFT );.
135e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
135f0 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b  op==TK_RSHIFT );
13600 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13610 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29   op==TK_CONCAT )
13620 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
13630 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
13640 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
13650 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
13660 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
13670 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
13680 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
13690 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
136a0 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e2);.      sqlit
136b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
136c0 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  op, r2, r1, targ
136d0 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  et);.      testc
136e0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
136f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13700 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
13710 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13720 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
13730 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
13740 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
13750 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
13760 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
13770 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
13780 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
13790 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d  AT || pLeft->op=
137a0 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  =TK_INTEGER ){. 
137b0 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74         if( pLeft
137c0 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29  ->op==TK_FLOAT )
137d0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64 65  {.          code
137e0 52 65 61 6c 28 76 2c 20 28 63 68 61 72 2a 29 70  Real(v, (char*)p
137f0 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Left->token.z, p
13800 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 31  Left->token.n, 1
13810 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
13820 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13830 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
13840 76 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72  v, pLeft, 1, tar
13850 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  get);.        }.
13860 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13870 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20       regFree1 = 
13880 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
13890 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
138a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
138b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
138c0 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 31 29 3b  Integer, 0, r1);
138d0 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
138e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
138f0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
13900 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
13910 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
13920 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
13930 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32   OP_Subtract, r2
13940 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , r1, target);. 
13950 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
13960 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
13970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e        }.      in
13980 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
13990 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
139a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
139b0 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
139c0 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  _NOT: {.      as
139d0 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d  sert( TK_BITNOT=
139e0 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20  =OP_BitNot );.  
139f0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
13a00 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20  OT==OP_Not );.  
13a10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
13a20 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20  ==TK_BITNOT );. 
13a30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
13a40 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20  p==TK_NOT );.   
13a50 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
13a60 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
13a70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
13a80 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
13a90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13aa0 69 6e 52 65 67 3d 3d 74 61 72 67 65 74 20 29 3b  inReg==target );
13ab0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13ac0 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63   usedAsColumnCac
13ad0 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  he(pParse, inReg
13ae0 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20  , inReg) );.    
13af0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
13b00 33 45 78 70 72 57 72 69 74 61 62 6c 65 52 65 67  3ExprWritableReg
13b10 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 69 6e  ister(pParse, in
13b20 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
13b30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13b40 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 69 6e 52  ddOp1(v, op, inR
13b50 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  eg);.      break
13b60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
13b70 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
13b80 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
13b90 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
13ba0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
13bb0 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
13bc0 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61  sNull );.      a
13bd0 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
13be0 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
13bf0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13c00 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
13c10 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13c20 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
13c30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
13c40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13c50 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61  P_Integer, 1, ta
13c60 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20  rget);.      r1 
13c70 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
13c80 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
13c90 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
13ca0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
13cb0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
13cc0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64  ==0 );.      add
13cd0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
13ce0 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29  ddOp1(v, op, r1)
13cf0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
13d00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13d10 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20  AddImm, target, 
13d20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
13d30 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
13d40 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62  , addr);.      b
13d50 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13d60 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
13d70 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  TION: {.      Ag
13d80 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70  gInfo *pInfo = p
13d90 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
13da0 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d        if( pInfo=
13db0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
13dc0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13dd0 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66  arse, "misuse of
13de0 20 61 67 67 72 65 67 61 74 65 3a 20 25 54 22 2c   aggregate: %T",
13df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 70 45  .            &pE
13e00 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  xpr->span);.    
13e10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13e20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e   inReg = pInfo->
13e30 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67  aFunc[pExpr->iAg
13e40 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d  g].iMem;.      }
13e50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13e60 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
13e70 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20  CONST_FUNC:.    
13e80 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
13e90 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
13ea0 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
13eb0 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  r->pList;.      
13ec0 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c 69 73  int nExpr = pLis
13ed0 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
13ee0 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75 6e 63   : 0;.      Func
13ef0 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20  Def *pDef;.     
13f00 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20 20   int nId;.      
13f10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b  const char *zId;
13f20 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  .      int const
13f30 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  Mask = 0;.      
13f40 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c  int i;.      sql
13f50 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
13f60 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 75 38 20  e->db;.      u8 
13f70 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
13f80 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
13f90 6f 6c 6c 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  oll = 0;..      
13fa0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
13fb0 5f 43 4f 4e 53 54 5f 46 55 4e 43 20 29 3b 0a 20  _CONST_FUNC );. 
13fc0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
13fd0 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p==TK_FUNCTION )
13fe0 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 28 63  ;.      zId = (c
13ff0 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
14000 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d  n.z;.      nId =
14010 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b   pExpr->token.n;
14020 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
14030 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
14040 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49  n(pParse->db, zI
14050 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c 20 65  d, nId, nExpr, e
14060 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  nc, 0);.      as
14070 73 65 72 74 28 20 70 44 65 66 21 3d 30 20 29 3b  sert( pDef!=0 );
14080 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
14090 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 78 70   ){.        nExp
140a0 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  r = pList->nExpr
140b0 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  ;.        r1 = s
140c0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
140d0 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72  ge(pParse, nExpr
140e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
140f0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
14100 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
14110 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
14120 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
14130 45 78 70 72 20 3d 20 72 31 20 3d 20 30 3b 0a 20  Expr = r1 = 0;. 
14140 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
14150 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
14160 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a  ALTABLE.      /*
14170 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f   Possibly overlo
14180 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ad the function 
14190 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67  if the first arg
141a0 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a  ument is.      *
141b0 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * a virtual tabl
141c0 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20  e column..      
141d0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
141e0 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20  infix functions 
141f0 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47  (LIKE, GLOB, REG
14200 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20  EXP, and MATCH) 
14210 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  use the.      **
14220 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
14230 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c  , not the first,
14240 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74   as the argument
14250 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20   to test to.    
14260 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
14270 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  s a column in a 
14280 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
14290 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63  This is done bec
142a0 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  ause.      ** th
142b0 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f  e left operand o
142c0 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e  f infix function
142d0 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77  s (the operand w
142e0 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20  e want to.      
142f0 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c  ** control overl
14300 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20  oading) ends up 
14310 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
14320 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20  gument to the.  
14330 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
14340 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e    The expression
14350 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65   "A glob B" is e
14360 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20  quivalent to .  
14370 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41      ** "glob(B,A
14380 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75  ).  We want to u
14390 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67  se the A in "A g
143a0 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20  lob B" to test. 
143b0 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63       ** for func
143c0 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67  tion overloading
143d0 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68  .  But we use th
143e0 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f  e B term in "glo
143f0 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a  b(B,A)"..      *
14400 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 70  /.      if( nExp
14410 72 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e  r>=2 && (pExpr->
14420 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78  flags & EP_Infix
14430 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20  Func) ){.       
14440 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56   pDef = sqlite3V
14450 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74  tabOverloadFunct
14460 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 45  ion(db, pDef, nE
14470 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr, pList->a[1]
14480 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
14490 65 6c 73 65 20 69 66 28 20 6e 45 78 70 72 3e 30  else if( nExpr>0
144a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
144b0 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
144c0 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
144d0 62 2c 20 70 44 65 66 2c 20 6e 45 78 70 72 2c 20  b, pDef, nExpr, 
144e0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
144f0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  r);.      }.#end
14500 69 66 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  if.      for(i=0
14510 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 69 3c 33  ; i<nExpr && i<3
14520 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
14530 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
14540 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c 69 73 74  IsConstant(pList
14550 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
14560 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
14570 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a  Mask |= (1<<i);.
14580 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14590 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64    if( pDef->need
145a0 43 6f 6c 6c 53 65 71 20 26 26 20 21 70 43 6f 6c  CollSeq && !pCol
145b0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  l ){.          p
145c0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
145d0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
145e0 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
145f0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
14600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
14610 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c  ( pDef->needColl
14620 53 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Seq ){.        i
14630 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
14640 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
14650 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20  pDfltColl; .    
14660 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14670 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
14680 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  Seq, 0, 0, 0, (c
14690 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
146a0 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
146b0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
146c0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
146d0 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d  Function, constM
146e0 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c  ask, r1, target,
146f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14700 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
14710 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46  pDef, P4_FUNCDEF
14720 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14730 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
14740 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  nExpr);.      if
14750 28 20 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ( nExpr ){.     
14760 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
14770 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
14780 65 2c 20 72 31 2c 20 6e 45 78 70 72 29 3b 0a 20  e, r1, nExpr);. 
14790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
147a0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
147b0 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
147c0 73 65 2c 20 72 31 2c 20 6e 45 78 70 72 29 3b 0a  se, r1, nExpr);.
147d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
147e0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
147f0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
14800 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
14810 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
14820 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
14830 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14840 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
14850 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14860 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
14870 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
14880 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lumn==0 ){.     
14890 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75     sqlite3CodeSu
148a0 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
148b0 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
148c0 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   }.      inReg =
148d0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
148e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
148f0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
14900 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
14910 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 30 3b 0a 20  rNotFound = 0;. 
14920 20 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76       int rMayHav
14930 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  eNull = 0;.     
14940 20 69 6e 74 20 6a 32 2c 20 6a 33 2c 20 6a 34 2c   int j2, j3, j4,
14950 20 6a 35 3b 0a 20 20 20 20 20 20 63 68 61 72 20   j5;.      char 
14960 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
14970 69 6e 74 20 65 54 79 70 65 3b 0a 0a 20 20 20 20  int eType;..    
14980 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
14990 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20  t((v, "begin IN 
149a0 65 78 70 72 20 72 25 64 22 2c 20 74 61 72 67 65  expr r%d", targe
149b0 74 29 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65  t));.      eType
149c0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
149d0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 45  Index(pParse, pE
149e0 78 70 72 2c 20 26 72 4d 61 79 48 61 76 65 4e 75  xpr, &rMayHaveNu
149f0 6c 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ll);.      if( r
14a00 4d 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20  MayHaveNull ){. 
14a10 20 20 20 20 20 20 20 72 4e 6f 74 46 6f 75 6e 64         rNotFound
14a20 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
14a30 6d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  m;.      }..    
14a40 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
14a50 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
14a60 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  use to create a 
14a70 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73  key from the res
14a80 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ults.      ** of
14a90 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
14aa0 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f   affinityStr sto
14ab0 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74 72  res a static str
14ac0 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ing suitable for
14ad0 0a 20 20 20 20 20 20 2a 2a 20 50 34 20 6f 66 20  .      ** P4 of 
14ae0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20  OP_MakeRecord.. 
14af0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66       */.      af
14b00 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69  finity = compari
14b10 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  sonAffinity(pExp
14b20 72 29 3b 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43  r);...      /* C
14b30 6f 64 65 20 74 68 65 20 3c 65 78 70 72 3e 20 66  ode the <expr> f
14b40 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28  rom "<expr> IN (
14b50 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65 6d 70 6f  ...)". The tempo
14b60 72 61 72 79 20 74 61 62 6c 65 0a 20 20 20 20 20  rary table.     
14b70 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   ** pExpr->iTabl
14b80 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  e contains the v
14b90 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20  alues that make 
14ba0 75 70 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74  up the (...) set
14bb0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14bc0 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
14bd0 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20  ColCache++;.    
14be0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
14bf0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
14c00 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
14c10 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
14c20 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d  isableColCache--
14c30 3b 0a 20 20 20 20 20 20 6a 32 20 3d 20 73 71 6c  ;.      j2 = sql
14c40 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
14c50 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 74 61 72  , OP_IsNull, tar
14c60 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  get);.      if( 
14c70 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
14c80 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20  ROWID ){.       
14c90 20 6a 33 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j3 = sqlite3Vdb
14ca0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
14cb0 73 74 42 65 49 6e 74 2c 20 74 61 72 67 65 74 29  stBeInt, target)
14cc0 3b 0a 20 20 20 20 20 20 20 20 6a 34 20 3d 20 73  ;.        j4 = s
14cd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14ce0 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
14cf0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
14d00 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
14d10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14d20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
14d30 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
14d40 3b 0a 20 20 20 20 20 20 20 20 6a 35 20 3d 20 73  ;.        j5 = s
14d50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
14d60 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
14d70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14d80 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 33 29  eJumpHere(v, j3)
14d90 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14da0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
14db0 20 6a 34 29 3b 0a 20 20 20 20 20 20 20 20 73 71   j4);.        sq
14dc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14dd0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
14de0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
14df0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14e00 72 32 20 3d 20 72 65 67 46 72 65 65 32 20 3d 20  r2 = regFree2 = 
14e10 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
14e20 67 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  g(pParse);..    
14e30 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
14e40 72 65 63 6f 72 64 20 61 6e 64 20 74 65 73 74 20  record and test 
14e50 66 6f 72 20 73 65 74 20 6d 65 6d 62 65 72 73 68  for set membersh
14e60 69 70 2e 20 49 66 20 74 68 65 20 73 65 74 20 63  ip. If the set c
14e70 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 20 20  ontains.        
14e80 2a 2a 20 74 68 65 20 76 61 6c 75 65 2c 20 74 68  ** the value, th
14e90 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65  en jump to the e
14ea0 6e 64 20 6f 66 20 74 68 65 20 74 65 73 74 20 63  nd of the test c
14eb0 6f 64 65 2e 20 54 68 65 20 74 61 72 67 65 74 0a  ode. The target.
14ec0 20 20 20 20 20 20 20 20 2a 2a 20 72 65 67 69 73          ** regis
14ed0 74 65 72 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69  ter still contai
14ee0 6e 73 20 74 68 65 20 74 72 75 65 20 28 31 29 20  ns the true (1) 
14ef0 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20 74 6f  value written to
14f00 20 69 74 20 65 61 72 6c 69 65 72 2e 0a 20 20 20   it earlier..   
14f10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
14f20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14f30 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
14f40 72 64 2c 20 74 61 72 67 65 74 2c 20 31 2c 20 72  rd, target, 1, r
14f50 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29  2, &affinity, 1)
14f60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14f70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14f80 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61  P_Integer, 1, ta
14f90 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6a  rget);.        j
14fa0 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  5 = sqlite3VdbeA
14fb0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f 75 6e  ddOp3(v, OP_Foun
14fc0 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
14fd0 2c 20 30 2c 20 72 32 29 3b 0a 0a 20 20 20 20 20  , 0, r2);..     
14fe0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 74     /* If the set
14ff0 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
15000 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65   fails, then the
15010 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 0a   result of the .
15020 20 20 20 20 20 20 20 20 2a 2a 20 22 78 20 49 4e          ** "x IN
15030 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69   (...)" expressi
15040 6f 6e 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  on must be eithe
15050 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49 66 20  r 0 or NULL. If 
15060 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20  the set.        
15070 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e  ** contains no N
15080 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e  ULL values, then
15090 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 30   the result is 0
150a0 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a 20 20  . If the set .  
150b0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
150c0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55  s one or more NU
150d0 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20  LL values, then 
150e0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
150f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
15100 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20  ression is also 
15110 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 2a 2f  NULL..        */
15120 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 4e 6f  .        if( rNo
15130 74 46 6f 75 6e 64 3d 3d 30 20 29 7b 0a 20 20 20  tFound==0 ){.   
15140 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
15150 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 69 74  ranch runs if it
15160 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d   is known at com
15170 70 69 6c 65 20 74 69 6d 65 20 28 6e 6f 77 29 20  pile time (now) 
15180 74 68 61 74 20 0a 20 20 20 20 20 20 20 20 20 20  that .          
15190 2a 2a 20 74 68 65 20 73 65 74 20 63 6f 6e 74 61  ** the set conta
151a0 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75  ins no NULL valu
151b0 65 73 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  es. This happens
151c0 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20   as the result. 
151d0 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61           ** of a
151e0 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73   "NOT NULL" cons
151f0 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20 64 61  traint in the da
15200 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 4e  tabase schema. N
15210 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 20 20 20  o need.         
15220 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20   ** to test the 
15230 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 61  data structure a
15240 74 20 72 75 6e 74 69 6d 65 20 69 6e 20 74 68 69  t runtime in thi
15250 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20  s case..        
15260 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73    */.          s
15270 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15280 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
15290 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
152a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
152b0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
152c0 63 6b 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65  ck populates the
152d0 20 72 4e 6f 74 46 6f 75 6e 64 20 72 65 67 69 73   rNotFound regis
152e0 74 65 72 20 77 69 74 68 20 65 69 74 68 65 72 20  ter with either 
152f0 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20 20 20 2a  NULL.          *
15300 2a 20 6f 72 20 30 20 28 61 6e 20 69 6e 74 65 67  * or 0 (an integ
15310 65 72 20 76 61 6c 75 65 29 2e 20 49 66 20 74 68  er value). If th
15320 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
15330 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 0a 20 20   contains one.  
15340 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 6d 6f          ** or mo
15350 72 65 20 4e 55 4c 4c 73 2c 20 74 68 65 6e 20 73  re NULLs, then s
15360 65 74 20 72 4e 6f 74 46 6f 75 6e 64 20 74 6f 20  et rNotFound to 
15370 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c  NULL. Otherwise,
15380 20 73 65 74 20 69 74 0a 20 20 20 20 20 20 20 20   set it.        
15390 20 20 2a 2a 20 74 6f 20 30 2e 20 49 66 20 72 65    ** to 0. If re
153a0 67 69 73 74 65 72 20 72 4d 61 79 48 61 76 65 4e  gister rMayHaveN
153b0 75 6c 6c 20 69 73 20 61 6c 72 65 61 64 79 20 73  ull is already s
153c0 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65  et to some value
153d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74  .          ** ot
153e0 68 65 72 20 74 68 61 6e 20 4e 55 4c 4c 2c 20 74  her than NULL, t
153f0 68 65 6e 20 74 68 65 20 74 65 73 74 20 68 61 73  hen the test has
15400 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 75   already been ru
15410 6e 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 20  n and .         
15420 20 2a 2a 20 72 4e 6f 74 46 6f 75 6e 64 20 69 73   ** rNotFound is
15430 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
15440 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ed..          */
15450 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
15460 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c  c const char nul
15470 6c 52 65 63 6f 72 64 5b 5d 20 3d 20 7b 20 30 78  lRecord[] = { 0x
15480 30 32 2c 20 30 78 30 30 20 7d 3b 0a 20 20 20 20  02, 0x00 };.    
15490 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c 69 74        j3 = sqlit
154a0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
154b0 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 4d 61 79  OP_NotNull, rMay
154c0 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  HaveNull);.     
154d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
154e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
154f0 6c 2c 20 30 2c 20 72 4e 6f 74 46 6f 75 6e 64 29  l, 0, rNotFound)
15500 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
15510 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
15520 20 4f 50 5f 42 6c 6f 62 2c 20 32 2c 20 72 4d 61   OP_Blob, 2, rMa
15530 79 48 61 76 65 4e 75 6c 6c 2c 20 30 2c 20 0a 20  yHaveNull, 0, . 
15540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15550 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6c 6c              null
15560 52 65 63 6f 72 64 2c 20 50 34 5f 53 54 41 54 49  Record, P4_STATI
15570 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 34  C);.          j4
15580 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
15590 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  dOp3(v, OP_Found
155a0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
155b0 20 30 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   0, rMayHaveNull
155c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
155d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
155e0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
155f0 20 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 20   rNotFound);.   
15600 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15610 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 34  beJumpHere(v, j4
15620 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
15630 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
15640 28 76 2c 20 6a 33 29 3b 0a 0a 20 20 20 20 20 20  (v, j3);..      
15650 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
15660 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65  value of registe
15670 72 20 72 4e 6f 74 46 6f 75 6e 64 20 28 77 68 69  r rNotFound (whi
15680 63 68 20 69 73 20 65 69 74 68 65 72 20 4e 55 4c  ch is either NUL
15690 4c 20 6f 72 20 30 29 0a 09 20 20 2a 2a 20 69 6e  L or 0)..  ** in
156a0 74 6f 20 74 68 65 20 74 61 72 67 65 74 20 72 65  to the target re
156b0 67 69 73 74 65 72 2e 20 54 68 69 73 20 77 69 6c  gister. This wil
156c0 6c 20 62 65 20 74 68 65 20 72 65 73 75 6c 74 20  l be the result 
156d0 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  of the.         
156e0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a   ** expression..
156f0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
15700 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15710 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
15720 6f 70 79 2c 20 72 4e 6f 74 46 6f 75 6e 64 2c 20  opy, rNotFound, 
15730 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
15740 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
15750 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
15760 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 20  Here(v, j2);.   
15770 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
15780 6d 70 48 65 72 65 28 76 2c 20 6a 35 29 3b 0a 20  mpHere(v, j5);. 
15790 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
157a0 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70  ((v, "end IN exp
157b0 72 20 72 25 64 22 2c 20 74 61 72 67 65 74 29 29  r r%d", target))
157c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
157d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
157e0 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42  /*.    **    x B
157f0 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20  ETWEEN y AND z. 
15800 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
15810 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  s is equivalent 
15820 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  to.    **.    **
15830 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
15840 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
15850 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  X is stored in p
15860 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
15870 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20   ** Y is stored 
15880 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
15890 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[0].pExpr..   
158a0 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20   ** Z is stored 
158b0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
158c0 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[1].pExpr..   
158d0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
158e0 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
158f0 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
15900 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
15910 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
15920 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20  st_item *pLItem 
15930 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
15940 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  a;.      Expr *p
15950 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e  Right = pLItem->
15960 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 63 6f  pExpr;..      co
15970 64 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64  deCompareOperand
15980 73 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  s(pParse, pLeft,
15990 20 26 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c   &r1, &regFree1,
159a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
159b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159c0 20 20 20 70 52 69 67 68 74 2c 20 26 72 32 2c 20     pRight, &r2, 
159d0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
159e0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
159f0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
15a00 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
15a10 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
15a20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r3 = sqlite3GetT
15a30 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
15a40 20 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69 74        r4 = sqlit
15a50 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
15a60 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  rse);.      code
15a70 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
15a80 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
15a90 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20 20  P_Ge,.          
15aa0 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
15ab0 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  r3, SQLITE_STORE
15ac0 50 32 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65  P2);.      pLIte
15ad0 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68  m++;.      pRigh
15ae0 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70  t = pLItem->pExp
15af0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
15b00 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
15b10 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
15b20 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
15b30 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
15b40 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
15b50 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
15b60 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
15b70 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
15b80 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
15b90 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
15ba0 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c 20  ght, OP_Le, r1, 
15bb0 72 32 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f 53  r2, r4, SQLITE_S
15bc0 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 73  TOREP2);.      s
15bd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
15be0 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c 20  (v, OP_And, r3, 
15bf0 72 34 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r4, target);.   
15c00 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
15c10 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
15c20 20 72 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r3);.      sqli
15c30 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
15c40 67 28 70 50 61 72 73 65 2c 20 72 34 29 3b 0a 20  g(pParse, r4);. 
15c50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15c60 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  }.    case TK_UP
15c70 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  LUS: {.      inR
15c80 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
15c90 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
15ca0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
15cb0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
15cc0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
15cd0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    /*.    ** Form
15ce0 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53   A:.    **   CAS
15cf0 45 20 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e  E x WHEN e1 THEN
15d00 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e   r1 WHEN e2 THEN
15d10 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20   r2 ... WHEN eN 
15d20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
15d30 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
15d40 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20   Form B:.    ** 
15d50 20 20 43 41 53 45 20 57 48 45 4e 20 65 31 20 54    CASE WHEN e1 T
15d60 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54  HEN r1 WHEN e2 T
15d70 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20  HEN r2 ... WHEN 
15d80 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
15d90 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
15da0 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61   ** Form A is ca
15db0 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64  n be transformed
15dc0 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61   into the equiva
15dd0 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66  lent form B as f
15de0 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20  ollows:.    **  
15df0 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20   CASE WHEN x=e1 
15e00 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65  THEN r1 WHEN x=e
15e10 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20  2 THEN r2 ....  
15e20 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e    **        WHEN
15e30 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c   x=eN THEN rN EL
15e40 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
15e50 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20      ** X (if it 
15e60 65 78 69 73 74 73 29 20 69 73 20 69 6e 20 70 45  exists) is in pE
15e70 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20  xpr->pLeft..    
15e80 2a 2a 20 59 20 69 73 20 69 6e 20 70 45 78 70 72  ** Y is in pExpr
15e90 2d 3e 70 52 69 67 68 74 2e 20 20 54 68 65 20 59  ->pRight.  The Y
15ea0 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61   is also optiona
15eb0 6c 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  l.  If there is 
15ec0 6e 6f 0a 20 20 20 20 2a 2a 20 45 4c 53 45 20 63  no.    ** ELSE c
15ed0 6c 61 75 73 65 20 61 6e 64 20 6e 6f 20 6f 74 68  lause and no oth
15ee0 65 72 20 74 65 72 6d 20 6d 61 74 63 68 65 73 2c  er term matches,
15ef0 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
15f00 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 65   of the.    ** e
15f10 78 70 72 73 73 69 6f 6e 20 69 73 20 4e 55 4c 4c  xprssion is NULL
15f20 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69  ..    ** Ei is i
15f30 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
15f40 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73  a[i*2] and Ri is
15f50 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
15f60 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a  [i*2+1]..    **.
15f70 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c      ** The resul
15f80 74 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  t of the express
15f90 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f  ion is the Ri fo
15fa0 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  r the first matc
15fb0 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20  hing Ei,.    ** 
15fc0 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  or if there is n
15fd0 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74  o matching Ei, t
15fe0 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20  he ELSE term Y, 
15ff0 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 0a 20  or if there is. 
16000 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65     ** no ELSE te
16010 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f  rm, NULL..    */
16020 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
16030 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  E: {.      int e
16040 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20  ndLabel;        
16050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16060 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65  GOTO label for e
16070 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20  nd of CASE stmt 
16080 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78  */.      int nex
16090 74 43 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  tCase;          
160a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
160b0 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78  TO label for nex
160c0 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f  t WHEN clause */
160d0 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72  .      int nExpr
160e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
160f0 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e           /* 2x n
16100 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65  umber of WHEN te
16110 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rms */.      int
16120 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
16130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16140 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
16150 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
16160 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20   *pEList;       
16170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
16180 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  t of WHEN terms 
16190 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
161a0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
161b0 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72  Listelem;  /* Ar
161c0 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ray of WHEN term
161d0 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  s */.      Expr 
161e0 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20  opCompare;      
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16200 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73  The X==Ei expres
16210 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  sion */.      Ex
16220 70 72 20 63 61 63 68 65 58 3b 20 20 20 20 20 20  pr cacheX;      
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16240 2f 2a 20 43 61 63 68 65 64 20 65 78 70 72 65 73  /* Cached expres
16250 73 69 6f 6e 20 58 20 2a 2f 0a 20 20 20 20 20 20  sion X */.      
16260 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20  Expr *pX;       
16270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16280 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65    /* The X expre
16290 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45  ssion */.      E
162a0 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20  xpr *pTest = 0; 
162b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162c0 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20   /* X==Ei (form 
162d0 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66  A) or just Ei (f
162e0 6f 72 6d 20 42 29 20 2a 2f 0a 0a 20 20 20 20 20  orm B) */..     
162f0 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70   assert(pExpr->p
16300 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 61 73 73  List);.      ass
16310 65 72 74 28 28 70 45 78 70 72 2d 3e 70 4c 69 73  ert((pExpr->pLis
16320 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d  t->nExpr % 2) ==
16330 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
16340 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  t(pExpr->pList->
16350 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20  nExpr > 0);.    
16360 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72    pEList = pExpr
16370 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61  ->pList;.      a
16380 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73  Listelem = pELis
16390 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70  t->a;.      nExp
163a0 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r = pEList->nExp
163b0 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65  r;.      endLabe
163c0 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
163d0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
163e0 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45 78     if( (pX = pEx
163f0 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b  pr->pLeft)!=0 ){
16400 0a 20 20 20 20 20 20 20 20 63 61 63 68 65 58 20  .        cacheX 
16410 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74  = *pX;.        t
16420 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d  estcase( pX->op=
16430 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 58  =TK_COLUMN || pX
16440 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
16450 52 20 29 3b 0a 20 20 20 20 20 20 20 20 63 61 63  R );.        cac
16460 68 65 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c  heX.iTable = sql
16470 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
16480 28 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65  (pParse, pX, &re
16490 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
164a0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
164b0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
164c0 20 20 63 61 63 68 65 58 2e 6f 70 20 3d 20 54 4b    cacheX.op = TK
164d0 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20  _REGISTER;.     
164e0 20 20 20 63 61 63 68 65 58 2e 69 43 6f 6c 75 6d     cacheX.iColum
164f0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6f  n = 0;.        o
16500 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b  pCompare.op = TK
16510 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  _EQ;.        opC
16520 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26  ompare.pLeft = &
16530 63 61 63 68 65 58 3b 0a 20 20 20 20 20 20 20 20  cacheX;.        
16540 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61  pTest = &opCompa
16550 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  re;.      }.    
16560 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c    pParse->disabl
16570 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20  eColCache++;.   
16580 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
16590 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20  xpr; i=i+2){.   
165a0 20 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20       if( pX ){. 
165b0 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61           opCompa
165c0 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73  re.pRight = aLis
165d0 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
165e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
165f0 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d           pTest =
16600 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
16610 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xpr;.        }. 
16620 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65 20         nextCase 
16630 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
16640 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
16650 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
16660 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  st->op==TK_COLUM
16670 4e 20 7c 7c 20 70 54 65 73 74 2d 3e 6f 70 3d 3d  N || pTest->op==
16680 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
16690 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
166a0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
166b0 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73  , pTest, nextCas
166c0 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  e, SQLITE_JUMPIF
166d0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74  NULL);.        t
166e0 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c  estcase( aListel
166f0 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f  em[i+1].pExpr->o
16700 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
16710 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
16720 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  ( aListelem[i+1]
16730 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52  .pExpr->op==TK_R
16740 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20  EGISTER );.     
16750 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
16760 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
16770 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c  elem[i+1].pExpr,
16780 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
16790 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
167a0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
167b0 30 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20  0, endLabel);.  
167c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
167d0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
167e0 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20   nextCase);.    
167f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
16800 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
16810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
16820 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
16830 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 74 61  Expr->pRight, ta
16840 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  rget);.      }el
16850 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
16860 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16870 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
16880 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  get);.      }.  
16890 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
168a0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
168b0 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
168c0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
168d0 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e  disableColCache>
168e0 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  0 );.      pPars
168f0 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
16900 68 65 2d 2d 3b 0a 20 20 20 20 20 20 62 72 65 61  he--;.      brea
16910 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
16920 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
16930 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b  GGER.    case TK
16940 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20  _RAISE: {.      
16950 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74 72 69  if( !pParse->tri
16960 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  gStack ){.      
16970 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16980 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
16990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169a0 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e   "RAISE() may on
169b0 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69  ly be used withi
169c0 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67  n a trigger-prog
169d0 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ram");.        r
169e0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
169f0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
16a00 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67  ->iColumn!=OE_Ig
16a10 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
16a20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
16a30 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c  iColumn==OE_Roll
16a40 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20 20 20  back ||.        
16a50 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
16a60 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62  iColumn == OE_Ab
16a70 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ort ||.         
16a80 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
16a90 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69  Column == OE_Fai
16aa0 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71  l );.         sq
16ab0 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
16ac0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
16ad0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71  pr);.         sq
16ae0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
16af0 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
16b00 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70  TE_CONSTRAINT, p
16b10 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30  Expr->iColumn, 0
16b20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16b30 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
16b40 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
16b50 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
16b60 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
16b70 0a 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74  .         assert
16b80 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
16b90 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29 3b   == OE_Ignore );
16ba0 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
16bb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16bc0 50 5f 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c  P_ContextPop, 0,
16bd0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71   0);.         sq
16be0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16bf0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
16c00 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
16c10 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20  ->ignoreJump);. 
16c20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
16c30 65 6e 74 28 28 76 2c 20 22 72 61 69 73 65 28 49  ent((v, "raise(I
16c40 47 4e 4f 52 45 29 22 29 29 3b 0a 20 20 20 20 20  GNORE)"));.     
16c50 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
16c60 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
16c70 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
16c80 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
16c90 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
16ca0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16cb0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
16cc0 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  ree2);.  return 
16cd0 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inReg;.}../*.** 
16ce0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
16cf0 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70   evaluate an exp
16d00 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72  ression and stor
16d10 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
16d20 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72   into a register
16d30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
16d40 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68  gister number wh
16d50 65 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ere the results.
16d60 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a  ** are stored..*
16d70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69  *.** If the regi
16d80 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72  ster is a tempor
16d90 61 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61  ary register tha
16da0 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63  t can be dealloc
16db0 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72  ated,.** then wr
16dc0 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69  ite its number i
16dd0 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74  nto *pReg.  If t
16de0 68 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  he result regist
16df0 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74  er is not.** a t
16e00 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73  emporary, then s
16e10 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f  et *pReg to zero
16e20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16e30 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72  ExprCodeTemp(Par
16e40 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
16e50 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52   *pExpr, int *pR
16e60 65 67 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20  eg){.  int r1 = 
16e70 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
16e80 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  g(pParse);.  int
16e90 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
16ea0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
16eb0 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a  se, pExpr, r1);.
16ec0 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a    if( r2==r1 ){.
16ed0 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a      *pReg = r1;.
16ee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
16ef0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
16f00 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
16f10 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20      *pReg = 0;. 
16f20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a   }.  return r2;.
16f30 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
16f40 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
16f50 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73   evaluate expres
16f60 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73  sion pExpr and s
16f70 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75  tore the.** resu
16f80 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
16f90 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
16fa0 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74  ults are guarant
16fb0 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a  eed to appear.**
16fc0 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
16fd0 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  get..*/.int sqli
16fe0 74 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73  te3ExprCode(Pars
16ff0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
17000 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
17010 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67  et){.  int inReg
17020 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
17030 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c  get>0 && target<
17040 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b  =pParse->nMem );
17050 0a 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74  .  inReg = sqlit
17060 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
17070 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
17080 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72  target);.  asser
17090 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t( pParse->pVdbe
170a0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
170b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
170c0 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
170d0 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70  get && pParse->p
170e0 56 64 62 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Vdbe ){.    sqli
170f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
17100 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
17110 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61  SCopy, inReg, ta
17120 72 67 65 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  rget);.  }.  ret
17130 75 72 6e 20 74 61 72 67 65 74 3b 0a 7d 0a 0a 2f  urn target;.}../
17140 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
17150 64 65 20 74 68 61 74 20 65 76 61 6c 75 74 65 73  de that evalutes
17160 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
17170 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74  ssion and puts t
17180 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  he result.** in 
17190 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
171a0 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65  .**.** Also make
171b0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
171c0 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74  xpression result
171d0 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22  s into another "
171e0 63 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a  cache" register.
171f0 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68  ** and modify th
17200 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20  e expression so 
17210 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69  that the next ti
17220 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74  me it is evaluat
17230 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  ed,.** the resul
17240 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  t is a copy of t
17250 68 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65  he cache registe
17260 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
17270 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
17280 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  r expressions th
17290 61 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74  at are used mult
172a0 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20  iple .** times. 
172b0 20 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61   They are evalua
172c0 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65  ted once and the
172d0 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
172e0 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72  expression.** ar
172f0 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74  e reused..*/.int
17300 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17310 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a  AndCache(Parse *
17320 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
17330 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
17340 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
17350 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
17360 6e 74 20 69 6e 52 65 67 3b 0a 20 20 69 6e 52 65  nt inReg;.  inRe
17370 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
17380 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
17390 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73  r, target);.  as
173a0 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
173b0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
173c0 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p!=TK_REGISTER )
173d0 7b 20 20 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d  {  .    int iMem
173e0 3b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 2b 2b 70  ;.    iMem = ++p
173f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
17400 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17410 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 69  p2(v, OP_Copy, i
17420 6e 52 65 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  nReg, iMem);.   
17430 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
17440 20 69 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70 72   iMem;.    pExpr
17450 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ->iColumn = pExp
17460 72 2d 3e 6f 70 3b 0a 20 20 20 20 70 45 78 70 72  r->op;.    pExpr
17470 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  ->op = TK_REGIST
17480 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
17490 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   inReg;.}../*.**
174a0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
174b0 70 45 78 70 72 20 69 73 20 61 6e 20 63 6f 6e 73  pExpr is an cons
174c0 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
174d0 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72 69  that is appropri
174e0 61 74 65 0a 2a 2a 20 66 6f 72 20 66 61 63 74 6f  ate.** for facto
174f0 72 69 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f  ring out of a lo
17500 6f 70 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65  op.  Appropriate
17510 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
17520 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e  :.**.**    *  An
17530 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  y expression tha
17540 74 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74  t evaluates to t
17550 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 70 63 6f 64  wo or more opcod
17560 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  es..**.**    *  
17570 41 6e 79 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  Any OP_Integer, 
17580 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f 53 74 72 69  OP_Real, OP_Stri
17590 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c 20 4f 50 5f  ng, OP_Blob, OP_
175a0 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20 20 20 20 20  Null, .**       
175b0 6f 72 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 74  or OP_Variable t
175c0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
175d0 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69  d to be placed i
175e0 6e 20 61 20 0a 2a 2a 20 20 20 20 20 20 20 73 70  n a .**       sp
175f0 65 63 69 66 69 63 20 72 65 67 69 73 74 65 72 2e  ecific register.
17600 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
17610 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 66 61 63 74  no point in fact
17620 6f 72 69 6e 67 20 6f 75 74 20 73 69 6e 67 6c 65  oring out single
17630 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e  -instruction con
17640 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73  stant.** express
17650 69 6f 6e 73 20 74 68 61 74 20 6e 65 65 64 20 74  ions that need t
17660 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61  o be placed in a
17670 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69   particular regi
17680 73 74 65 72 2e 20 20 0a 2a 2a 20 57 65 20 63 6f  ster.  .** We co
17690 75 6c 64 20 66 61 63 74 6f 72 20 74 68 65 6d 20  uld factor them 
176a0 6f 75 74 2c 20 62 75 74 20 74 68 65 6e 20 77 65  out, but then we
176b0 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 61 64   would end up ad
176c0 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f 50 5f 53 43  ding an.** OP_SC
176d0 6f 70 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  opy instruction 
176e0 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75  to move the valu
176f0 65 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65  e into the corre
17700 63 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6c  ct register.** l
17710 61 74 65 72 2e 20 20 57 65 20 6d 69 67 68 74 20  ater.  We might 
17720 61 73 20 77 65 6c 6c 20 6a 75 73 74 20 75 73 65  as well just use
17730 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e   the original in
17740 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a  struction and.**
17750 20 61 76 6f 69 64 20 74 68 65 20 4f 50 5f 53 43   avoid the OP_SC
17760 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  opy..*/.static i
17770 6e 74 20 69 73 41 70 70 72 6f 70 72 69 61 74 65  nt isAppropriate
17780 46 6f 72 46 61 63 74 6f 72 69 6e 67 28 45 78 70  ForFactoring(Exp
17790 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 21 73 71  r *p){.  if( !sq
177a0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
177b0 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 29 20 29 7b  antNotJoin(p) ){
177c0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
177d0 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74  /* Only constant
177e0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
177f0 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
17800 20 66 61 63 74 6f 72 69 6e 67 20 2a 2f 0a 20 20   factoring */.  
17810 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67  }.  if( (p->flag
17820 73 20 26 20 45 50 5f 46 69 78 65 64 44 65 73 74  s & EP_FixedDest
17830 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
17840 72 6e 20 31 3b 20 20 2f 2a 20 41 6e 79 20 63 6f  rn 1;  /* Any co
17850 6e 73 74 61 6e 74 20 77 69 74 68 6f 75 74 20 61  nstant without a
17860 20 66 69 78 65 64 20 64 65 73 74 69 6e 61 74 69   fixed destinati
17870 6f 6e 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  on is appropriat
17880 65 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65  e */.  }.  while
17890 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55  ( p->op==TK_UPLU
178a0 53 20 29 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74  S ) p = p->pLeft
178b0 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  ;.  switch( p->o
178c0 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  p ){.#ifndef SQL
178d0 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49  ITE_OMIT_BLOB_LI
178e0 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54  TERAL.    case T
178f0 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64 69 66 0a 20  K_BLOB:.#endif. 
17900 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
17910 42 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  BLE:.    case TK
17920 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61  _INTEGER:.    ca
17930 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
17940 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20   case TK_NULL:. 
17950 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
17960 47 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  G: {.      testc
17970 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 42  ase( p->op==TK_B
17980 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 74 65 73  LOB );.      tes
17990 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
179a0 5f 56 41 52 49 41 42 4c 45 20 29 3b 0a 20 20 20  _VARIABLE );.   
179b0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
179c0 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
179d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
179e0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  ( p->op==TK_FLOA
179f0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
17a00 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e  ase( p->op==TK_N
17a10 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ULL );.      tes
17a20 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
17a30 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 20  _STRING );.     
17a40 20 2f 2a 20 53 69 6e 67 6c 65 2d 69 6e 73 74 72   /* Single-instr
17a50 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73  uction constants
17a60 20 77 69 74 68 20 61 20 66 69 78 65 64 20 64 65   with a fixed de
17a70 73 74 69 6e 61 74 69 6f 6e 20 61 72 65 0a 20 20  stination are.  
17a80 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 64 6f      ** better do
17a90 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20 20 49 66 20  ne in-line.  If 
17aa0 77 65 20 66 61 63 74 6f 72 20 74 68 65 6d 2c 20  we factor them, 
17ab0 74 68 65 79 20 77 69 6c 6c 20 6a 75 73 74 20 65  they will just e
17ac0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75 70 20 67  nd.      ** up g
17ad0 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 4f 50 5f  enerating an OP_
17ae0 53 43 6f 70 79 20 74 6f 20 6d 6f 76 65 20 74 68  SCopy to move th
17af0 65 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64  e value to the d
17b00 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20  estination.     
17b10 20 2a 2a 20 72 65 67 69 73 74 65 72 2e 20 2a 2f   ** register. */
17b20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
17b30 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
17b40 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
17b50 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
17b60 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c  ->op==TK_FLOAT |
17b70 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  | p->pLeft->op==
17b80 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TK_INTEGER ){.  
17b90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
17ba0 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  .       }.      
17bb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
17bc0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
17bd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17be0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
17bf0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70  }../*.** If pExp
17c00 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  r is a constant 
17c10 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
17c20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
17c30 6f 72 0a 2a 2a 20 66 61 63 74 6f 72 69 6e 67 20  or.** factoring 
17c40 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2c 20 74  out of a loop, t
17c50 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65  hen evaluate the
17c60 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
17c70 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61  nto a register a
17c80 6e 64 20 63 6f 6e 76 65 72 74 20 74 68 65 20 65  nd convert the e
17c90 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61  xpression into a
17ca0 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a 20   TK_REGISTER.** 
17cb0 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73  expression..*/.s
17cc0 74 61 74 69 63 20 69 6e 74 20 65 76 61 6c 43 6f  tatic int evalCo
17cd0 6e 73 74 45 78 70 72 28 76 6f 69 64 20 2a 70 41  nstExpr(void *pA
17ce0 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  rg, Expr *pExpr)
17cf0 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
17d00 65 20 3d 20 28 50 61 72 73 65 2a 29 70 41 72 67  e = (Parse*)pArg
17d10 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
17d20 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
17d30 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
17d40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
17d50 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
17d60 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
17d70 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
17d80 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
17d90 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 20 7b  TK_CONST_FUNC: {
17da0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 72  .      /* The ar
17db0 67 75 6d 65 6e 74 73 20 74 6f 20 61 20 66 75 6e  guments to a fun
17dc0 63 74 69 6f 6e 20 68 61 76 65 20 61 20 66 69 78  ction have a fix
17dd0 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a  ed destination..
17de0 20 20 20 20 20 20 2a 2a 20 4d 61 72 6b 20 74 68        ** Mark th
17df0 65 6d 20 74 68 69 73 20 77 61 79 20 74 6f 20 61  em this way to a
17e00 76 6f 69 64 20 67 65 6e 65 72 61 74 65 64 20 75  void generated u
17e10 6e 6e 65 65 64 65 64 20 4f 50 5f 53 43 6f 70 79  nneeded OP_SCopy
17e20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75  .      ** instru
17e30 63 74 69 6f 6e 73 2e 20 0a 20 20 20 20 20 20 2a  ctions. .      *
17e40 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
17e50 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
17e60 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 66  >pList;.      if
17e70 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
17e80 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74     int i = pList
17e90 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
17ea0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
17eb0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
17ec0 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
17ed0 20 66 6f 72 28 3b 20 69 3e 30 3b 20 69 2d 2d 2c   for(; i>0; i--,
17ee0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
17ef0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
17f00 70 45 78 70 72 20 29 20 70 49 74 65 6d 2d 3e 70  pExpr ) pItem->p
17f10 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Expr->flags |= E
17f20 50 5f 46 69 78 65 64 44 65 73 74 3b 0a 20 20 20  P_FixedDest;.   
17f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
17f40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17f50 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 70  }.  }.  if( isAp
17f60 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63 74  propriateForFact
17f70 6f 72 69 6e 67 28 70 45 78 70 72 29 20 29 7b 0a  oring(pExpr) ){.
17f80 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2b 2b 70      int r1 = ++p
17f90 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
17fa0 20 69 6e 74 20 72 32 3b 0a 20 20 20 20 72 32 20   int r2;.    r2 
17fb0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
17fc0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
17fd0 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20  pExpr, r1);.    
17fe0 69 66 28 20 72 31 21 3d 72 32 20 29 20 73 71 6c  if( r1!=r2 ) sql
17ff0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
18000 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
18010 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
18020 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  mn = pExpr->op;.
18030 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
18040 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20  TK_REGISTER;.   
18050 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
18060 20 72 32 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   r2;.    return 
18070 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
18080 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 65  0;.}../*.** Pree
18090 76 61 6c 75 61 74 65 20 63 6f 6e 73 74 61 6e 74  valuate constant
180a0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
180b0 77 69 74 68 69 6e 20 70 45 78 70 72 20 61 6e 64  within pExpr and
180c0 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
180d0 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
180e0 72 73 2e 20 20 4d 6f 64 69 66 79 20 70 45 78 70  rs.  Modify pExp
180f0 72 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f  r so that the co
18100 6e 73 74 61 6e 74 20 73 75 62 65 78 70 72 65 73  nstant subexpres
18110 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 54 4b 5f 52  ions.** are TK_R
18120 45 47 49 53 54 45 52 20 6f 70 63 6f 64 65 73 20  EGISTER opcodes 
18130 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
18140 65 20 70 72 65 63 6f 6d 70 75 74 65 64 20 76 61  e precomputed va
18150 6c 75 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lues..*/.void sq
18160 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e  lite3ExprCodeCon
18170 73 74 61 6e 74 73 28 50 61 72 73 65 20 2a 70 50  stants(Parse *pP
18180 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
18190 72 29 7b 0a 20 20 20 77 61 6c 6b 45 78 70 72 54  r){.   walkExprT
181a0 72 65 65 28 70 45 78 70 72 2c 20 65 76 61 6c 43  ree(pExpr, evalC
181b0 6f 6e 73 74 45 78 70 72 2c 20 70 50 61 72 73 65  onstExpr, pParse
181c0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  );.}.../*.** Gen
181d0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
181e0 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65  pushes the value
181f0 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e   of every elemen
18200 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a  t of the given.*
18210 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
18220 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63  t into a sequenc
18230 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62  e of registers b
18240 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67  eginning at targ
18250 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  et..**.** Return
18260 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
18270 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65  lements evaluate
18280 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
18290 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
182a0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
182b0 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
182c0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
182d0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
182e0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
182f0 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20  sion list to be 
18300 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74  coded */.  int t
18310 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a  arget,        /*
18320 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
18330 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
18340 20 64 6f 48 61 72 64 43 6f 70 79 20 20 20 20 20   doHardCopy     
18350 2f 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45  /* Call sqlite3E
18360 78 70 72 48 61 72 64 43 6f 70 79 20 6f 6e 20 65  xprHardCopy on e
18370 61 63 68 20 65 6c 65 6d 65 6e 74 20 69 66 20 74  ach element if t
18380 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  rue */.){.  stru
18390 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
183a0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
183b0 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  , n;.  assert( p
183c0 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73  List!=0 || pPars
183d0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
183e0 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  led );.  if( pLi
183f0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  st==0 ){.    ret
18400 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 0;.  }.  ass
18410 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
18420 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
18430 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  xpr;.  for(pItem
18440 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
18450 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  i<n; i++, pItem+
18460 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
18470 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
18480 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 74 61  pItem->pExpr, ta
18490 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 69 66 28  rget+i);.    if(
184a0 20 64 6f 48 61 72 64 43 6f 70 79 20 29 20 73 71   doHardCopy ) sq
184b0 6c 69 74 65 33 45 78 70 72 48 61 72 64 43 6f 70  lite3ExprHardCop
184c0 79 28 70 50 61 72 73 65 2c 20 74 61 72 67 65 74  y(pParse, target
184d0 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , n);.  }.  retu
184e0 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
184f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
18500 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
18510 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
18520 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
18530 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
18540 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
18550 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
18560 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
18570 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
18580 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
18590 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
185a0 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  lse..**.** If th
185b0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
185c0 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
185d0 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
185e0 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a   false), then.**
185f0 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
18600 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  f the jumpIfNull
18610 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f   flag is SQLITE_
18620 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  JUMPIFNULL..**.*
18630 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  * This code depe
18640 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
18650 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b  that certain tok
18660 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54  en values (ex: T
18670 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65  K_EQ).** are the
18680 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20   same as opcode 
18690 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45  values (ex: OP_E
186a0 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  q) that implemen
186b0 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
186c0 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
186d0 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65  .  Special comme
186e0 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e  nts in vdbe.c an
186f0 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  d the mkopcodeh.
18700 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a  awk script in.**
18710 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73   the make proces
18720 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61  s cause these va
18730 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20  lues to align.  
18740 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65  Assert()s in the
18750 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76   code.** below v
18760 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
18770 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e  umbers are align
18780 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  ed correctly..*/
18790 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
187a0 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70  rIfTrue(Parse *p
187b0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
187c0 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
187d0 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
187e0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
187f0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
18800 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
18810 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
18820 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
18830 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
18840 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
18850 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
18860 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
18870 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
18880 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d   v==0 || pExpr==
18890 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 70  0 ) return;.  op
188a0 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
188b0 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
188c0 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b    case TK_AND: {
188d0 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
188e0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
188f0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
18900 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
18910 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
18920 74 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65  testcase( pParse
18930 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
18940 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  e==0 );.      sq
18950 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
18960 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
18970 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66  pLeft, d2,jumpIf
18980 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
18990 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70  IFNULL);.      p
189a0 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
189b0 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20  lCache++;.      
189c0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
189d0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
189e0 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
189f0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
18a00 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
18a10 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
18a20 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  e>0 );.      pPa
18a30 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
18a40 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 73 71  ache--;.      sq
18a50 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
18a60 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
18a70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18a80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
18a90 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
18aa0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
18ab0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
18ac0 73 65 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  se( pParse->disa
18ad0 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29  bleColCache==0 )
18ae0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
18af0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
18b00 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
18b10 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
18b20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
18b30 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
18b40 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
18b50 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
18b60 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
18b70 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
18b80 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ull);.      asse
18b90 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  rt( pParse->disa
18ba0 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b  bleColCache>0 );
18bb0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
18bc0 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d  isableColCache--
18bd0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18be0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
18bf0 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65  _NOT: {.      te
18c00 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
18c10 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
18c20 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
18c30 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
18c40 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
18c50 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
18c60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
18c70 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
18c80 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
18c90 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
18ca0 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
18cb0 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
18cc0 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
18cd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
18ce0 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20  _LT==OP_Lt );.  
18cf0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
18d00 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20  E==OP_Le );.    
18d10 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d    assert( TK_GT=
18d20 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Gt );.      
18d30 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f  assert( TK_GE==O
18d40 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Ge );.      as
18d50 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f  sert( TK_EQ==OP_
18d60 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Eq );.      asse
18d70 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  rt( TK_NE==OP_Ne
18d80 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
18d90 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b  se( op==TK_LT );
18da0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18db0 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20   op==TK_LE );.  
18dc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
18dd0 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20  ==TK_GT );.     
18de0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
18df0 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_GE );.      te
18e00 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45  stcase( op==TK_E
18e10 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Q );.      testc
18e20 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29  ase( op==TK_NE )
18e30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18e40 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
18e50 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
18e60 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61  pareOperands(pPa
18e70 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
18e80 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65  t, &r1, &regFree
18e90 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
18ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18eb0 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67       pExpr->pRig
18ec0 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65  ht, &r2, &regFre
18ed0 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
18ee0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
18ef0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
18f00 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
18f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
18f30 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
18f40 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
18f50 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
18f60 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
18f70 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
18f80 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
18f90 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
18fa0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
18fb0 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61  TNULL: {.      a
18fc0 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
18fd0 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
18fe0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
18ff0 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
19000 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ull );.      tes
19010 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
19020 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  NULL );.      te
19030 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
19040 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
19050 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
19060 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
19070 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
19080 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
19090 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
190a0 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
190b0 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
190c0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
190d0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
190e0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
190f0 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
19100 20 20 20 20 2f 2a 20 20 20 20 78 20 42 45 54 57      /*    x BETW
19110 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20  EEN y AND z.    
19120 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 73    **.      ** Is
19130 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
19140 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
19150 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
19160 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  =z.      **.    
19170 20 20 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20    ** Code it as 
19180 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72  such, taking car
19190 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d  e to do the comm
191a0 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  on subexpression
191b0 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e  .      ** elemen
191c0 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20 20  tation of x..   
191d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72     */.      Expr
191e0 20 65 78 70 72 41 6e 64 3b 0a 20 20 20 20 20 20   exprAnd;.      
191f0 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a 20  Expr compLeft;. 
19200 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70 52 69       Expr compRi
19210 67 68 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ght;.      Expr 
19220 65 78 70 72 58 3b 0a 0a 20 20 20 20 20 20 65 78  exprX;..      ex
19230 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c  prX = *pExpr->pL
19240 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41  eft;.      exprA
19250 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  nd.op = TK_AND;.
19260 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70 4c        exprAnd.pL
19270 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b  eft = &compLeft;
19280 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70  .      exprAnd.p
19290 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67  Right = &compRig
192a0 68 74 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65  ht;.      compLe
192b0 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20  ft.op = TK_GE;. 
192c0 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c       compLeft.pL
192d0 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20  eft = &exprX;.  
192e0 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69      compLeft.pRi
192f0 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ght = pExpr->pLi
19300 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
19310 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e        compRight.
19320 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20 20  op = TK_LE;.    
19330 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66    compRight.pLef
19340 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20  t = &exprX;.    
19350 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67    compRight.pRig
19360 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
19370 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
19380 20 20 20 20 20 65 78 70 72 58 2e 69 54 61 62 6c       exprX.iTabl
19390 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  e = sqlite3ExprC
193a0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
193b0 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65  &exprX, &regFree
193c0 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
193d0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
193e0 29 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e 6f  );.      exprX.o
193f0 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
19400 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19410 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
19420 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
19430 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
19440 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74  , &exprAnd, dest
19450 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
19460 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19470 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
19480 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
19490 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
194a0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
194b0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
194c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
194d0 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c  p3(v, OP_If, r1,
194e0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
194f0 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73  l!=0);.      tes
19500 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
19510 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
19520 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
19530 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
19540 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
19550 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
19560 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
19570 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
19580 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19590 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
195a0 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  2);  .}../*.** G
195b0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
195c0 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
195d0 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
195e0 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
195f0 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
19600 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
19610 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
19620 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
19630 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
19640 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
19650 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
19660 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rue..**.** If th
19670 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
19680 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
19690 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
196a0 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20   false) then.** 
196b0 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75  jump if jumpIfNu
196c0 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d  ll is SQLITE_JUM
196d0 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20  PIFNULL or fall 
196e0 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49  through if jumpI
196f0 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a  fNull.** is 0..*
19700 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
19710 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20  prIfFalse(Parse 
19720 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
19730 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
19740 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
19750 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
19760 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
19770 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
19780 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
19790 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
197a0 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a  ;.  int r1, r2;.
197b0 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49  .  assert( jumpI
197c0 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55  fNull==SQLITE_JU
197d0 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70  MPIFNULL || jump
197e0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69  IfNull==0 );.  i
197f0 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72  f( v==0 || pExpr
19800 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
19810 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
19820 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f   pExpr->op and o
19830 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73  p are related as
19840 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
19850 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d   **       pExpr-
19860 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f  >op            o
19870 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d  p.  **       ---
19880 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20  ------          
19890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  ----------.  ** 
198a0 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20        TK_ISNULL 
198b0 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e           OP_NotN
198c0 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
198d0 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20  K_NOTNULL       
198e0 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a    OP_IsNull.  **
198f0 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20         TK_NE    
19900 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a            OP_Eq.
19910 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51    **       TK_EQ
19920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
19930 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Ne.  **       T
19940 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20  K_GT            
19950 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20    OP_Le.  **    
19960 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20     TK_LE        
19970 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a        OP_Gt.  **
19980 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20         TK_GE    
19990 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a            OP_Lt.
199a0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54    **       TK_LT
199b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
199c0 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  _Ge.  **.  ** Fo
199d0 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  r other values o
199e0 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20  f pExpr->op, op 
199f0 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  is undefined and
19a00 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68   unused..  ** Th
19a10 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61  e value of TK_ a
19a20 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
19a30 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75   are arranged su
19a40 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  ch that we.  ** 
19a50 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
19a60 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73  mapping above us
19a70 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
19a80 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  g expression..  
19a90 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72  ** Assert()s ver
19aa0 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ify that the com
19ab0 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72  putation is corr
19ac0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ect..  */.  op =
19ad0 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b   ((pExpr->op+(TK
19ae0 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28  _ISNULL&1))^1)-(
19af0 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20  TK_ISNULL&1);.. 
19b00 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65   /* Verify corre
19b10 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  ct alignment of 
19b20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
19b30 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  tants.  */.  ass
19b40 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
19b50 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  TK_ISNULL || op=
19b60 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
19b70 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
19b80 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c  op!=TK_NOTNULL |
19b90 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  | op==OP_IsNull 
19ba0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
19bb0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c  pr->op!=TK_NE ||
19bc0 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20   op==OP_Eq );.  
19bd0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
19be0 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d  p!=TK_EQ || op==
19bf0 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ne );.  asser
19c00 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
19c10 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65  _LT || op==OP_Ge
19c20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
19c30 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c  xpr->op!=TK_LE |
19c40 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  | op==OP_Gt );. 
19c50 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
19c60 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op!=TK_GT || op=
19c70 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Le );.  asse
19c80 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
19c90 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GE || op==OP_L
19ca0 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  t );..  switch( 
19cb0 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
19cc0 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
19cd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19ce0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
19cf0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19d00 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
19d10 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a 20  ColCache==0 );. 
19d20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
19d30 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
19d40 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
19d50 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
19d60 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
19d70 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b  isableColCache++
19d80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
19d90 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
19da0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
19db0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
19dc0 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ll);.      asser
19dd0 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62  t( pParse->disab
19de0 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a  leColCache>0 );.
19df0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69        pParse->di
19e00 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b  sableColCache--;
19e10 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19e20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
19e30 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OR: {.      int 
19e40 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
19e50 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
19e60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
19e70 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
19e80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19e90 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
19ea0 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a 20 20 20  lCache==0 );.   
19eb0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
19ec0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
19ed0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a  pr->pLeft, d2, j
19ee0 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
19ef0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
19f00 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
19f10 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20  bleColCache++;. 
19f20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
19f30 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
19f40 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
19f50 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
19f60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19f70 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
19f80 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20 20 20  olCache>0 );.   
19f90 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
19fa0 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20  leColCache--;.  
19fb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
19fc0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
19fd0 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
19fe0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19ff0 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
1a000 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1a010 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1a020 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
1a030 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1a040 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1a050 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
1a060 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
1a070 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
1a080 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
1a090 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
1a0a0 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
1a0b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a0c0 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20  op==TK_LT );.   
1a0d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1a0e0 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =TK_LE );.      
1a0f0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1a100 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
1a110 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45  tcase( op==TK_GE
1a120 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1a130 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b  se( op==TK_EQ );
1a140 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a150 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20   op==TK_NE );.  
1a160 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1a170 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1a180 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
1a190 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73 65 2c  Operands(pParse,
1a1a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1a1b0 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c 0a 20  r1, &regFree1,. 
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1e0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1a1f0 26 72 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b  &r2, &regFree2);
1a200 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
1a210 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
1a220 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
1a230 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
1a240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
1a250 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
1a260 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 74  IfNull);.      t
1a270 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1a280 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1a290 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1a2a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1a2b0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1a2c0 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
1a2d0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
1a2e0 4c 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  L: {.      testc
1a2f0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
1a300 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LL );.      test
1a310 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
1a320 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31  NULL );.      r1
1a330 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1a340 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1a350 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1a360 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
1a370 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a380 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
1a390 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1a3a0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1a3b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1a3c0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1a3d0 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
1a3e0 20 20 2f 2a 20 20 20 20 78 20 42 45 54 57 45 45    /*    x BETWEE
1a3f0 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 20 20  N y AND z.      
1a400 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 73 20 65  **.      ** Is e
1a410 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20  quivalent to .  
1a420 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1a430 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
1a440 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1a450 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75  ** Code it as su
1a460 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20  ch, taking care 
1a470 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  to do the common
1a480 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 20   subexpression. 
1a490 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 61       ** elementa
1a4a0 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20 20 20 20  tion of x..     
1a4b0 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 65   */.      Expr e
1a4c0 78 70 72 41 6e 64 3b 0a 20 20 20 20 20 20 45 78  xprAnd;.      Ex
1a4d0 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20  pr compLeft;.   
1a4e0 20 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68     Expr compRigh
1a4f0 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 65 78  t;.      Expr ex
1a500 70 72 58 3b 0a 0a 20 20 20 20 20 20 65 78 70 72  prX;..      expr
1a510 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66  X = *pExpr->pLef
1a520 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64  t;.      exprAnd
1a530 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
1a540 20 20 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66      exprAnd.pLef
1a550 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20  t = &compLeft;. 
1a560 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70 52 69       exprAnd.pRi
1a570 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74  ght = &compRight
1a580 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74  ;.      compLeft
1a590 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 20  .op = TK_GE;.   
1a5a0 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66     compLeft.pLef
1a5b0 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20  t = &exprX;.    
1a5c0 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68    compLeft.pRigh
1a5d0 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
1a5e0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
1a5f0 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70      compRight.op
1a600 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20 20 20 20   = TK_LE;.      
1a610 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20  compRight.pLeft 
1a620 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20  = &exprX;.      
1a630 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74  compRight.pRight
1a640 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
1a650 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
1a660 20 20 20 65 78 70 72 58 2e 69 54 61 62 6c 65 20     exprX.iTable 
1a670 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1a680 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65  eTemp(pParse, &e
1a690 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29  xprX, &regFree1)
1a6a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1a6b0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1a6c0 0a 20 20 20 20 20 20 65 78 70 72 58 2e 6f 70 20  .      exprX.op 
1a6d0 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
1a6e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1a6f0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1a700 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a710 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1a720 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c   &exprAnd, dest,
1a730 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1a740 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1a750 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
1a760 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1a770 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1a780 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72  Parse, pExpr, &r
1a790 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1a7a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a7b0 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72  3(v, OP_IfNot, r
1a7c0 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  1, dest, jumpIfN
1a7d0 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74  ull!=0);.      t
1a7e0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1a7f0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1a800 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1a810 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  ll==0 );.      b
1a820 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1a830 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1a840 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1a850 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
1a860 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1a870 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
1a880 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ee2);.}../*.** D
1a890 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69  o a deep compari
1a8a0 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65  son of two expre
1a8b0 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65  ssion trees.  Re
1a8c0 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a  turn TRUE (non-z
1a8d0 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20  ero).** if they 
1a8e0 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e  are identical an
1a8f0 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69  d return FALSE i
1a900 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e  f they differ in
1a910 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20   any way..**.** 
1a920 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72  Sometimes this r
1a930 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
1a940 72 6e 20 46 41 4c 53 45 20 65 76 65 6e 20 69 66  rn FALSE even if
1a950 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73   the two express
1a960 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61  ions.** really a
1a970 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20  re equivalent.  
1a980 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f  If we cannot pro
1a990 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ve that the expr
1a9a0 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69  essions are.** i
1a9b0 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74  dentical, we ret
1a9c0 75 72 6e 20 46 41 4c 53 45 20 6a 75 73 74 20 74  urn FALSE just t
1a9d0 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69  o be safe.  So i
1a9e0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
1a9f0 2a 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2c  * returns false,
1aa00 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74   then you do not
1aa10 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72   really know for
1aa20 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65 20   certain if the 
1aa30 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  two.** expressio
1aa40 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ns are the same.
1aa50 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65 74    But if you get
1aa60 20 61 20 54 52 55 45 20 72 65 74 75 72 6e 2c 20   a TRUE return, 
1aa70 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20  then you.** can 
1aa80 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72  be sure the expr
1aa90 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
1aaa0 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c  same.  In the pl
1aab0 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68  aces where.** th
1aac0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
1aad0 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ed, it does not 
1aae0 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65  hurt to get an e
1aaf0 78 74 72 61 20 46 41 4c 53 45 20 2d 20 74 68 61  xtra FALSE - tha
1ab00 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20  t.** just might 
1ab10 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73  result in some s
1ab20 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63  lightly slower c
1ab30 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e  ode.  But return
1ab40 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72  ing.** an incorr
1ab50 65 63 74 20 54 52 55 45 20 63 6f 75 6c 64 20 6c  ect TRUE could l
1ab60 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63  ead to a malfunc
1ab70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
1ab80 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
1ab90 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a  Expr *pA, Expr *
1aba0 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pB){.  int i;.  
1abb0 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30  if( pA==0||pB==0
1abc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
1abd0 42 3d 3d 70 41 3b 0a 20 20 7d 0a 20 20 69 66 28  B==pA;.  }.  if(
1abe0 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20   pA->op!=pB->op 
1abf0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1ac00 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45  ( (pA->flags & E
1ac10 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42  P_Distinct)!=(pB
1ac20 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
1ac30 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20  tinct) ) return 
1ac40 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
1ac50 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
1ac60 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66  >pLeft, pB->pLef
1ac70 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
1ac80 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
1ac90 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69  rCompare(pA->pRi
1aca0 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29  ght, pB->pRight)
1acb0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1acc0 66 28 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a  f( pA->pList ){.
1acd0 20 20 20 20 69 66 28 20 70 42 2d 3e 70 4c 69 73      if( pB->pLis
1ace0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
1acf0 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 4c 69  .    if( pA->pLi
1ad00 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70  st->nExpr!=pB->p
1ad10 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65  List->nExpr ) re
1ad20 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28  turn 0;.    for(
1ad30 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74  i=0; i<pA->pList
1ad40 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
1ad50 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
1ad60 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
1ad70 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
1ad80 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61  pr, pB->pList->a
1ad90 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
1ada0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1adb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1adc0 7d 65 6c 73 65 20 69 66 28 20 70 42 2d 3e 70 4c  }else if( pB->pL
1add0 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ist ){.    retur
1ade0 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
1adf0 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70 42  A->pSelect || pB
1ae00 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ->pSelect ) retu
1ae10 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 0;.  if( pA->
1ae20 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62  iTable!=pB->iTab
1ae30 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d  le || pA->iColum
1ae40 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29  n!=pB->iColumn )
1ae50 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1ae60 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55   pA->op!=TK_COLU
1ae70 4d 4e 20 26 26 20 70 41 2d 3e 74 6f 6b 65 6e 2e  MN && pA->token.
1ae80 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d  z ){.    if( pB-
1ae90 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65  >token.z==0 ) re
1aea0 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
1aeb0 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d  pB->token.n!=pA-
1aec0 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72  >token.n ) retur
1aed0 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 0;.    if( sql
1aee0 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
1aef0 61 72 2a 29 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c  ar*)pA->token.z,
1af00 28 63 68 61 72 2a 29 70 42 2d 3e 74 6f 6b 65 6e  (char*)pB->token
1af10 2e 7a 2c 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29 21  .z,pB->token.n)!
1af20 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1af30 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
1af40 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a    return 1;.}...
1af50 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
1af60 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
1af70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
1af80 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
1af90 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
1afa0 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
1afb0 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
1afc0 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
1afd0 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
1afe0 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
1aff0 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65  nfoColumn(sqlite
1b000 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a  3 *db, AggInfo *
1b010 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
1b020 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d  .  pInfo->aCol =
1b030 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
1b040 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62  ocate(.       db
1b050 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ,.       pInfo->
1b060 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a  aCol,.       siz
1b070 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  eof(pInfo->aCol[
1b080 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20  0]),.       3,. 
1b090 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
1b0a0 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 70  olumn,.       &p
1b0b0 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c  Info->nColumnAll
1b0c0 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  oc,.       &i.  
1b0d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
1b0e0 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20      ../*.** Add 
1b0f0 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
1b100 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
1b110 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52  Func[] array.  R
1b120 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
1b130 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
1b140 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
1b150 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
1b160 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
1b170 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b180 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73  addAggInfoFunc(s
1b190 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
1b1a0 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
1b1b0 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
1b1c0 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72  Func = sqlite3Ar
1b1d0 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
1b1e0 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20      db, .       
1b1f0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20  pInfo->aFunc,.  
1b200 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
1b210 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20  o->aFunc[0]),.  
1b220 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26       3,.       &
1b230 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20  pInfo->nFunc,.  
1b240 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75       &pInfo->nFu
1b250 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20  ncAlloc,.       
1b260 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
1b270 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
1b280 20 54 68 69 73 20 69 73 20 61 6e 20 78 46 75 6e   This is an xFun
1b290 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72  c for walkExprTr
1b2a0 65 65 28 29 20 75 73 65 64 20 74 6f 20 69 6d 70  ee() used to imp
1b2b0 6c 65 6d 65 6e 74 20 0a 2a 2a 20 73 71 6c 69 74  lement .** sqlit
1b2c0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1b2d0 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20  regates().  See 
1b2e0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
1b2f0 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20  zeAggregates.** 
1b300 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
1b310 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nformation..**.*
1b320 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1b330 6e 61 6c 79 7a 65 73 20 74 68 65 20 61 67 67 72  nalyzes the aggr
1b340 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 61  egate function a
1b350 74 20 70 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74  t pExpr..*/.stat
1b360 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
1b370 67 72 65 67 61 74 65 28 76 6f 69 64 20 2a 70 41  gregate(void *pA
1b380 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  rg, Expr *pExpr)
1b390 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  {.  int i;.  Nam
1b3a0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
1b3b0 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 29 70  (NameContext *)p
1b3c0 41 72 67 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  Arg;.  Parse *pP
1b3d0 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
1b3e0 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  se;.  SrcList *p
1b3f0 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
1b400 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e  SrcList;.  AggIn
1b410 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
1b420 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20  NC->pAggInfo;.. 
1b430 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
1b440 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
1b450 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
1b460 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
1b470 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  : {.      /* Che
1b480 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
1b490 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e   column is in on
1b4a0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20  e of the tables 
1b4b0 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20  in the FROM.    
1b4c0 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74    ** clause of t
1b4d0 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
1b4e0 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ry */.      if( 
1b4f0 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20  pSrcList ){.    
1b500 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
1b510 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
1b520 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20   pSrcList->a;.  
1b530 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1b540 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pSrcList->nSrc;
1b550 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
1b560 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
1b570 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
1b580 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ol;.          if
1b590 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
1b5a0 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
1b5b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
1b5c0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
1b5d0 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
1b5e0 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65  ns that pExpr re
1b5f0 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a  fers to a table.
1b600 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1b610 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52  hat is in the FR
1b620 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1b630 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
1b640 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
1b650 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  **.            *
1b660 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20  * Make an entry 
1b670 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  for the column i
1b680 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
1b690 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  [] if there.    
1b6a0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
1b6b0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65  t an entry there
1b6c0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20   already..      
1b6d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1b6e0 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
1b6f0 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70          pCol = p
1b700 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20  AggInfo->aCol;. 
1b710 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
1b720 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; k<pAggInfo->
1b730 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43  nColumn; k++, pC
1b740 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
1b750 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
1b760 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
1b770 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
1b780 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
1b790 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
1b7a0 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
1b7b0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1b7c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1b7d0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
1b7e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1b7f0 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  (k>=pAggInfo->nC
1b800 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20  olumn).         
1b810 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41      && (k = addA
1b820 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61  ggInfoColumn(pPa
1b830 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
1b840 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20  o))>=0 .        
1b850 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
1b860 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67       pCol = &pAg
1b870 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a  gInfo->aCol[k];.
1b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1b890 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72  ol->pTab = pExpr
1b8a0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
1b8b0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62        pCol->iTab
1b8c0 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  le = pExpr->iTab
1b8d0 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
1b8e0 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20    pCol->iColumn 
1b8f0 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
1b900 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1b910 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  pCol->iMem = ++p
1b920 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1b930 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1b940 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
1b950 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
1b960 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d     pCol->pExpr =
1b970 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
1b980 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e        if( pAggIn
1b990 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a  fo->pGroupBy ){.
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9b0 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20  int j, n;.      
1b9c0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69            ExprLi
1b9d0 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e  st *pGB = pAggIn
1b9e0 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20  fo->pGroupBy;.  
1b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
1ba00 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1ba10 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d  em *pTerm = pGB-
1ba20 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  >a;.            
1ba30 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78      n = pGB->nEx
1ba40 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
1ba50 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
1ba60 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
1ba70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ba80 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54     Expr *pE = pT
1ba90 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
1baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1bab0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pE->op==TK_COL
1bac0 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c  UMN && pE->iTabl
1bad0 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
1bae0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
1baf0 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43            pE->iC
1bb00 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
1bb10 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
1bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1bb30 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
1bb40 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
1bb50 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1bb60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bb70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1bb80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1bb90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1bba0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
1bbb0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29  SorterColumn<0 )
1bbc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1bbd0 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
1bbe0 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f  olumn = pAggInfo
1bbf0 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  ->nSortingColumn
1bc00 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
1bc10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1bc20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  }.            /*
1bc30 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e   There is now an
1bc40 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72   entry for pExpr
1bc50 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
1bc60 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20  ol[] (either.   
1bc70 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61           ** beca
1bc80 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65  use it was there
1bc90 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75   before or becau
1bca0 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74  se we just creat
1bcb0 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20  ed it)..        
1bcc0 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74      ** Convert t
1bcd0 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61  he pExpr to be a
1bce0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72   TK_AGG_COLUMN r
1bcf0 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74  eferring to that
1bd00 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1bd10 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
1bd20 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20   entry..        
1bd30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1bd40 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
1bd50 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
1bd60 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1bd70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f  ->op = TK_AGG_CO
1bd80 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
1bd90 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
1bda0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  k;.            b
1bdb0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1bdc0 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72  } /* endif pExpr
1bdd0 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d  ->iTable==pItem-
1bde0 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20  >iCursor */.    
1bdf0 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f      } /* end loo
1be00 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20  p over pSrcList 
1be10 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
1be20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1be30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
1be40 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
1be50 20 20 20 2f 2a 20 54 68 65 20 70 4e 43 2d 3e 6e     /* The pNC->n
1be60 44 65 70 74 68 3d 3d 30 20 74 65 73 74 20 63 61  Depth==0 test ca
1be70 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
1be80 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73 75 62 71  unctions in subq
1be90 75 65 72 69 65 73 0a 20 20 20 20 20 20 2a 2a 20  ueries.      ** 
1bea0 74 6f 20 62 65 20 69 67 6e 6f 72 65 64 20 2a 2f  to be ignored */
1beb0 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e  .      if( pNC->
1bec0 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20  nDepth==0 ){.   
1bed0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
1bee0 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73   see if pExpr is
1bef0 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
1bf00 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74  another aggregat
1bf10 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  e .        ** fu
1bf20 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61  nction that is a
1bf30 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41  lready in the pA
1bf40 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
1bf50 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1bf60 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
1bf70 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d  fo_func *pItem =
1bf80 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
1bf90 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
1bfa0 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
1bfb0 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Func; i++, pItem
1bfc0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
1bfd0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
1bfe0 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78  mpare(pItem->pEx
1bff0 70 72 2c 20 70 45 78 70 72 29 20 29 7b 0a 20 20  pr, pExpr) ){.  
1c000 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1c010 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1c020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1c030 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  f( i>=pAggInfo->
1c040 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  nFunc ){.       
1c050 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f     /* pExpr is o
1c060 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61  riginal.  Make a
1c070 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41   new entry in pA
1c080 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a  ggInfo->aFunc[].
1c090 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1c0a0 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20         u8 enc = 
1c0b0 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
1c0c0 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61  .          i = a
1c0d0 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50  ddAggInfoFunc(pP
1c0e0 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
1c0f0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  fo);.          i
1c100 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( i>=0 ){.     
1c110 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26         pItem = &
1c120 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
1c130 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
1c140 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
1c150 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
1c160 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20    pItem->iMem = 
1c170 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1c180 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
1c190 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74  m->pFunc = sqlit
1c1a0 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
1c1b0 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20  Parse->db,.     
1c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1c1d0 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
1c1e0 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
1c1f0 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  n.n,.           
1c200 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
1c210 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c  List ? pExpr->pL
1c220 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20  ist->nExpr : 0, 
1c230 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  enc, 0);.       
1c240 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1c250 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
1c260 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nct ){.         
1c270 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
1c280 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
1c290 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
1c2a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c2b0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
1c2c0 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
1c2d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1c2e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c2f0 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    }.        /* M
1c300 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20  ake pExpr point 
1c310 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
1c320 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  te pAggInfo->aFu
1c330 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20  nc[] entry.     
1c340 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45     */.        pE
1c350 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20  xpr->iAgg = i;. 
1c360 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
1c370 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
1c380 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  o;.        retur
1c390 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
1c3a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63   }.  }..  /* Rec
1c3b0 75 72 73 69 76 65 6c 79 20 77 61 6c 6b 20 73 75  ursively walk su
1c3c0 62 71 75 65 72 69 65 73 20 6c 6f 6f 6b 69 6e 67  bqueries looking
1c3d0 20 66 6f 72 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e   for TK_COLUMN n
1c3e0 6f 64 65 73 20 74 68 61 74 20 6e 65 65 64 0a 20  odes that need. 
1c3f0 20 2a 2a 20 74 6f 20 62 65 20 63 68 61 6e 67 65   ** to be change
1c400 64 20 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  d to TK_AGG_COLU
1c410 4d 4e 2e 20 20 42 75 74 20 69 6e 63 72 65 6d 65  MN.  But increme
1c420 6e 74 20 6e 44 65 70 74 68 20 73 6f 20 74 68 61  nt nDepth so tha
1c430 74 0a 20 20 2a 2a 20 54 4b 5f 41 47 47 5f 46 55  t.  ** TK_AGG_FU
1c440 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
1c450 73 75 62 71 75 65 72 69 65 73 20 77 69 6c 6c 20  subqueries will 
1c460 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  be unchanged..  
1c470 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
1c480 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70  pSelect ){.    p
1c490 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20 20  NC->nDepth++;.  
1c4a0 20 20 77 61 6c 6b 53 65 6c 65 63 74 45 78 70 72    walkSelectExpr
1c4b0 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c  (pExpr->pSelect,
1c4c0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
1c4d0 65 2c 20 70 4e 43 29 3b 0a 20 20 20 20 70 4e 43  e, pNC);.    pNC
1c4e0 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20 20 7d 0a  ->nDepth--;.  }.
1c4f0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1c500 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
1c510 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
1c520 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67  n looking for ag
1c530 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1c540 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72  s and.** for var
1c550 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64  iables that need
1c560 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
1c570 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67  the pParse->aAgg
1c580 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b  [] array..** Mak
1c590 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74  e additional ent
1c5a0 72 69 65 73 20 74 6f 20 74 68 65 20 70 50 61 72  ries to the pPar
1c5b0 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79  se->aAgg[] array
1c5c0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
1c5d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1c5e0 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
1c5f0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68   called after th
1c600 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  e expression has
1c610 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65   been.** analyze
1c620 64 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72  d by sqlite3Expr
1c630 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 2e 0a  ResolveNames()..
1c640 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1c650 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
1c660 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74  ates(NameContext
1c670 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78   *pNC, Expr *pEx
1c680 70 72 29 7b 0a 20 20 77 61 6c 6b 45 78 70 72 54  pr){.  walkExprT
1c690 72 65 65 28 70 45 78 70 72 2c 20 61 6e 61 6c 79  ree(pExpr, analy
1c6a0 7a 65 41 67 67 72 65 67 61 74 65 2c 20 70 4e 43  zeAggregate, pNC
1c6b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  );.}../*.** Call
1c6c0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
1c6d0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20  yzeAggregates() 
1c6e0 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
1c6f0 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78  sion in an.** ex
1c700 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
1c710 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1c720 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  r of errors..**.
1c730 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
1c740 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61  s found, the ana
1c750 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f  lysis is cut sho
1c760 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
1c770 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
1c780 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78  gList(NameContex
1c790 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74  t *pNC, ExprList
1c7a0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75   *pList){.  stru
1c7b0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1c7c0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
1c7d0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
1c7e0 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  .    for(pItem=p
1c7f0 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
1c800 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1c810 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1c820 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
1c830 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
1c840 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  pNC, pItem->pExp
1c850 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
1c860 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
1c870 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 74 65  or deallocate te
1c880 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69  mporary use regi
1c890 73 74 65 72 73 20 64 75 72 69 6e 67 20 63 6f 64  sters during cod
1c8a0 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 2a 2f  e generation..*/
1c8b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54  .int sqlite3GetT
1c8c0 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50  empReg(Parse *pP
1c8d0 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61  arse){.  if( pPa
1c8e0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30  rse->nTempReg==0
1c8f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b   ){.    return +
1c900 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1c910 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72   }.  return pPar
1c920 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70  se->aTempReg[--p
1c930 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d  Parse->nTempReg]
1c940 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
1c950 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50  ReleaseTempReg(P
1c960 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1c970 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69  t iReg){.  if( i
1c980 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  Reg && pParse->n
1c990 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
1c9a0 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
1c9b0 65 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  eg) ){.    sqlit
1c9c0 65 33 45 78 70 72 57 72 69 74 61 62 6c 65 52 65  e3ExprWritableRe
1c9d0 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 69  gister(pParse, i
1c9e0 52 65 67 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  Reg, iReg);.    
1c9f0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
1ca00 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  [pParse->nTempRe
1ca10 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d  g++] = iReg;.  }
1ca20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
1ca30 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  te or deallocate
1ca40 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67   a block of nReg
1ca50 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67   consecutive reg
1ca60 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71  isters.*/.int sq
1ca70 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
1ca80 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1ca90 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
1caa0 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50  t i, n;.  i = pP
1cab0 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b  arse->iRangeReg;
1cac0 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e  .  n = pParse->n
1cad0 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20  RangeReg;.  if( 
1cae0 6e 52 65 67 3c 3d 6e 20 26 26 20 21 75 73 65 64  nReg<=n && !used
1caf0 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  AsColumnCache(pP
1cb00 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20  arse, i, i+n-1) 
1cb10 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  ){.    pParse->i
1cb20 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67  RangeReg += nReg
1cb30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52  ;.    pParse->nR
1cb40 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b  angeReg -= nReg;
1cb50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20  .  }else{.    i 
1cb60 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
1cb70 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
1cb80 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a  em += nReg;.  }.
1cb90 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f    return i;.}.vo
1cba0 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
1cbb0 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65  eTempRange(Parse
1cbc0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
1cbd0 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  eg, int nReg){. 
1cbe0 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65   if( nReg>pParse
1cbf0 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20  ->nRangeReg ){. 
1cc00 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67     pParse->nRang
1cc10 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20  eReg = nReg;.   
1cc20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
1cc30 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d  eg = iReg;.  }.}
1cc40 0a                                               .