/ Hex Artifact Content
Login

Artifact 278d3950f55e04a2486e7b8dede3713a2ed6c0e1:


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 38 20 32 30 30 38 2f 30 38 2f 30 37 20  .388 2008/08/07 
0220: 31 33 3a 30 35 3a 33 35 20 64 72 68 20 45 78 70  13:05:35 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 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
a3f0: 20 54 4b 5f 53 54 52 49 4e 47 3b 0a 20 20 20 20   TK_STRING;.    
a400: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
a410: 20 2f 2a 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20   /*.  ** cnt==0 
a420: 6d 65 61 6e 73 20 74 68 65 72 65 20 77 61 73 20  means there was 
a430: 6e 6f 74 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e  not match.  cnt>
a440: 31 20 6d 65 61 6e 73 20 74 68 65 72 65 20 77 65  1 means there we
a450: 72 65 20 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d  re two or.  ** m
a460: 6f 72 65 20 6d 61 74 63 68 65 73 2e 20 20 45 69  ore matches.  Ei
a470: 74 68 65 72 20 77 61 79 2c 20 77 65 20 68 61 76  ther way, we hav
a480: 65 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f  e an error..  */
a490: 0a 20 20 69 66 28 20 63 6e 74 21 3d 31 20 29 7b  .  if( cnt!=1 ){
a4a0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
a4b0: 2a 7a 45 72 72 3b 0a 20 20 20 20 7a 45 72 72 20  *zErr;.    zErr 
a4c0: 3d 20 63 6e 74 3d 3d 30 20 3f 20 22 6e 6f 20 73  = cnt==0 ? "no s
a4d0: 75 63 68 20 63 6f 6c 75 6d 6e 22 20 3a 20 22 61  uch column" : "a
a4e0: 6d 62 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20  mbiguous column 
a4f0: 6e 61 6d 65 22 3b 0a 20 20 20 20 69 66 28 20 7a  name";.    if( z
a500: 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Db ){.      sqli
a510: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
a520: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 2e 25  se, "%s: %s.%s.%
a530: 73 22 2c 20 7a 45 72 72 2c 20 7a 44 62 2c 20 7a  s", zErr, zDb, z
a540: 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  Tab, zCol);.    
a550: 7d 65 6c 73 65 20 69 66 28 20 7a 54 61 62 20 29  }else if( zTab )
a560: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
a570: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
a580: 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 45 72  "%s: %s.%s", zEr
a590: 72 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a  r, zTab, zCol);.
a5a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a5b0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a5c0: 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73  (pParse, "%s: %s
a5d0: 22 2c 20 7a 45 72 72 2c 20 7a 43 6f 6c 29 3b 0a  ", zErr, zCol);.
a5e0: 20 20 20 20 7d 0a 20 20 20 20 70 54 6f 70 4e 43      }.    pTopNC
a5f0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 0a 20  ->nErr++;.  }.. 
a600: 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20   /* If a column 
a610: 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 69 6e 20  from a table in 
a620: 70 53 72 63 4c 69 73 74 20 69 73 20 72 65 66 65  pSrcList is refe
a630: 72 65 6e 63 65 64 2c 20 74 68 65 6e 20 72 65 63  renced, then rec
a640: 6f 72 64 0a 20 20 2a 2a 20 74 68 69 73 20 66 61  ord.  ** this fa
a650: 63 74 20 69 6e 20 74 68 65 20 70 53 72 63 4c 69  ct in the pSrcLi
a660: 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 62  st.a[].colUsed b
a670: 69 74 6d 61 73 6b 2e 20 20 43 6f 6c 75 6d 6e 20  itmask.  Column 
a680: 30 20 63 61 75 73 65 73 0a 20 20 2a 2a 20 62 69  0 causes.  ** bi
a690: 74 20 30 20 74 6f 20 62 65 20 73 65 74 2e 20 20  t 0 to be set.  
a6a0: 43 6f 6c 75 6d 6e 20 31 20 73 65 74 73 20 62 69  Column 1 sets bi
a6b0: 74 20 31 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  t 1.  And so for
a6c0: 74 68 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a  th.  If the.  **
a6d0: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69   column number i
a6e0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
a6f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
a700: 73 20 69 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  s in the bitmask
a710: 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65 74 20 74  .  ** then set t
a720: 68 65 20 68 69 67 68 2d 6f 72 64 65 72 20 62 69  he high-order bi
a730: 74 20 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b  t of the bitmask
a740: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ..  */.  if( pEx
a750: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26  pr->iColumn>=0 &
a760: 26 20 70 4d 61 74 63 68 21 3d 30 20 29 7b 0a 20  & pMatch!=0 ){. 
a770: 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72     int n = pExpr
a780: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 74  ->iColumn;.    t
a790: 65 73 74 63 61 73 65 28 20 6e 3d 3d 73 69 7a 65  estcase( n==size
a7a0: 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 2d 31 20  of(Bitmask)*8-1 
a7b0: 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 73 69  );.    if( n>=si
a7c0: 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20  zeof(Bitmask)*8 
a7d0: 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 69 7a  ){.      n = siz
a7e0: 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 2d 31  eof(Bitmask)*8-1
a7f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
a800: 72 74 28 20 70 4d 61 74 63 68 2d 3e 69 43 75 72  rt( pMatch->iCur
a810: 73 6f 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor==pExpr->iTab
a820: 6c 65 20 29 3b 0a 20 20 20 20 70 4d 61 74 63 68  le );.    pMatch
a830: 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42  ->colUsed |= ((B
a840: 69 74 6d 61 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20  itmask)1)<<n;.  
a850: 7d 0a 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e  }..lookupname_en
a860: 64 3a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  d:.  /* Clean up
a870: 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f   and return.  */
a880: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
a890: 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c  (db, zDb);.  sql
a8a0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
a8b0: 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Tab);.  sqlite3E
a8c0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
a8d0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70  xpr->pLeft);.  p
a8e0: 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b  Expr->pLeft = 0;
a8f0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
a900: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 2d 3e  lete(db, pExpr->
a910: 70 52 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72  pRight);.  pExpr
a920: 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20  ->pRight = 0;.  
a930: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43  pExpr->op = TK_C
a940: 4f 4c 55 4d 4e 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d  OLUMN;.lookupnam
a950: 65 5f 65 6e 64 5f 32 3a 0a 20 20 73 71 6c 69 74  e_end_2:.  sqlit
a960: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f  e3DbFree(db, zCo
a970: 6c 29 3b 0a 20 20 69 66 28 20 63 6e 74 3d 3d 31  l);.  if( cnt==1
a980: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
a990: 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 73 71  pNC!=0 );.    sq
a9a0: 6c 69 74 65 33 41 75 74 68 52 65 61 64 28 70 50  lite3AuthRead(pP
a9b0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53 63  arse, pExpr, pSc
a9c0: 68 65 6d 61 2c 20 70 4e 43 2d 3e 70 53 72 63 4c  hema, pNC->pSrcL
a9d0: 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  ist);.    if( pM
a9e0: 61 74 63 68 20 26 26 20 21 70 4d 61 74 63 68 2d  atch && !pMatch-
a9f0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
aa00: 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20    pExpr->pTab = 
aa10: 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a 20 20  pMatch->pTab;.  
aa20: 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65    }.    /* Incre
aa30: 6d 65 6e 74 20 74 68 65 20 6e 52 65 66 20 76 61  ment the nRef va
aa40: 6c 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65 20  lue on all name 
aa50: 63 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20 54 6f  contexts from To
aa60: 70 4e 43 20 75 70 20 74 6f 0a 20 20 20 20 2a 2a  pNC up to.    **
aa70: 20 74 68 65 20 70 6f 69 6e 74 20 77 68 65 72 65   the point where
aa80: 20 74 68 65 20 6e 61 6d 65 20 6d 61 74 63 68 65   the name matche
aa90: 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 3b 3b  d. */.    for(;;
aaa0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
aab0: 20 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a 20 20   pTopNC!=0 );.  
aac0: 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52 65 66      pTopNC->nRef
aad0: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ++;.      if( pT
aae0: 6f 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72 65 61  opNC==pNC ) brea
aaf0: 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 20  k;.      pTopNC 
ab00: 3d 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78 74 3b  = pTopNC->pNext;
ab10: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
ab20: 6e 20 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  n 0;.  } else {.
ab30: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
ab40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
ab50: 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69 67  routine is desig
ab60: 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e 63 20  ned as an xFunc 
ab70: 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65  for walkExprTree
ab80: 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76  ()..**.** Resolv
ab90: 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73  e symbolic names
aba0: 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20   into TK_COLUMN 
abb0: 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74 68  operators for th
abc0: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64  e current.** nod
abd0: 65 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73  e in the express
abe0: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
abf0: 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  n 0 to continue 
ac00: 74 68 65 20 73 65 61 72 63 68 20 64 6f 77 6e 0a  the search down.
ac10: 2a 2a 20 74 68 65 20 74 72 65 65 20 6f 72 20 32  ** the tree or 2
ac20: 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 74 72   to abort the tr
ac30: 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ee walk..**.** T
ac40: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
ac50: 20 64 6f 65 73 20 65 72 72 6f 72 20 63 68 65 63   does error chec
ac60: 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72 65  king and name re
ac70: 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  solution for.** 
ac80: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20  function names. 
ac90: 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 66 6f   The operator fo
aca0: 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  r aggregate func
acb0: 74 69 6f 6e 73 20 69 73 20 63 68 61 6e 67 65 64  tions is changed
acc0: 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55  .** to TK_AGG_FU
acd0: 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69  NCTION..*/.stati
ace0: 63 20 69 6e 74 20 6e 61 6d 65 52 65 73 6f 6c 76  c int nameResolv
acf0: 65 72 53 74 65 70 28 76 6f 69 64 20 2a 70 41 72  erStep(void *pAr
ad00: 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  g, Expr *pExpr){
ad10: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
ad20: 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65  pNC = (NameConte
ad30: 78 74 2a 29 70 41 72 67 3b 0a 20 20 50 61 72 73  xt*)pArg;.  Pars
ad40: 65 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20 69 66  e *pParse;..  if
ad50: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
ad60: 75 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28  urn 1;.  assert(
ad70: 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 50 61   pNC!=0 );.  pPa
ad80: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
ad90: 65 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61  e;..  if( ExprHa
ada0: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
adb0: 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29  pr, EP_Resolved)
adc0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 45   ) return 1;.  E
add0: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
ade0: 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65  Expr, EP_Resolve
adf0: 64 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  d);.#ifndef NDEB
ae00: 55 47 0a 20 20 69 66 28 20 70 4e 43 2d 3e 70 53  UG.  if( pNC->pS
ae10: 72 63 4c 69 73 74 20 26 26 20 70 4e 43 2d 3e 70  rcList && pNC->p
ae20: 53 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3e  SrcList->nAlloc>
ae30: 30 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  0 ){.    SrcList
ae40: 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
ae50: 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20  ->pSrcList;.    
ae60: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
ae70: 3d 30 3b 20 69 3c 70 4e 43 2d 3e 70 53 72 63 4c  =0; i<pNC->pSrcL
ae80: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
ae90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
aea0: 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  SrcList->a[i].iC
aeb0: 75 72 73 6f 72 3e 3d 30 20 26 26 20 70 53 72 63  ursor>=0 && pSrc
aec0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
aed0: 6f 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29  or<pParse->nTab)
aee0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
aef0: 69 66 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  if.  switch( pEx
af00: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a  pr->op ){.    /*
af10: 20 41 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69   A lone identifi
af20: 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
af30: 66 20 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20  f a column..    
af40: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  */.    case TK_I
af50: 44 3a 20 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75  D: {.      looku
af60: 70 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c  pName(pParse, 0,
af70: 20 30 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65   0, &pExpr->toke
af80: 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a  n, pNC, pExpr);.
af90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
afa0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
afb0: 41 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  A table name and
afc0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20   column name:   
afd0: 20 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f    ID.ID.    ** O
afe0: 72 20 61 20 64 61 74 61 62 61 73 65 2c 20 74 61  r a database, ta
aff0: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20  ble and column: 
b000: 20 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f   ID.ID.ID.    */
b010: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54  .    case TK_DOT
b020: 3a 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20  : {.      Token 
b030: 2a 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  *pColumn;.      
b040: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20  Token *pTable;. 
b050: 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b       Token *pDb;
b060: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
b070: 67 68 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69  ght;..      /* i
b080: 66 28 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29  f( pSrcList==0 )
b090: 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20   break; */.     
b0a0: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
b0b0: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69  >pRight;.      i
b0c0: 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  f( pRight->op==T
b0d0: 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  K_ID ){.        
b0e0: 70 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pDb = 0;.       
b0f0: 20 70 54 61 62 6c 65 20 3d 20 26 70 45 78 70 72   pTable = &pExpr
b100: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
b110: 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20          pColumn 
b120: 3d 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  = &pRight->token
b130: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b140: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b150: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  Right->op==TK_DO
b160: 54 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62  T );.        pDb
b170: 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74   = &pExpr->pLeft
b180: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
b190: 20 70 54 61 62 6c 65 20 3d 20 26 70 52 69 67 68   pTable = &pRigh
b1a0: 74 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b  t->pLeft->token;
b1b0: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e  .        pColumn
b1c0: 20 3d 20 26 70 52 69 67 68 74 2d 3e 70 52 69 67   = &pRight->pRig
b1d0: 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ht->token;.     
b1e0: 20 7d 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e   }.      lookupN
b1f0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c  ame(pParse, pDb,
b200: 20 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e   pTable, pColumn
b210: 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20  , pNC, pExpr);. 
b220: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
b230: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73     }..    /* Res
b240: 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61  olve function na
b250: 6d 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  mes.    */.    c
b260: 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e  ase TK_CONST_FUN
b270: 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  C:.    case TK_F
b280: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
b290: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
b2a0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
b2b0: 20 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d      /* The argum
b2c0: 65 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20  ent list */.    
b2d0: 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20    int n = pList 
b2e0: 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
b2f0: 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f   0;  /* Number o
b300: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
b310: 20 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68       int no_such
b320: 5f 66 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20  _func = 0;      
b330: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73   /* True if no s
b340: 75 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69  uch function exi
b350: 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  sts */.      int
b360: 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20   wrong_num_args 
b370: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  = 0;     /* True
b380: 20 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72   if wrong number
b390: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
b3a0: 0a 20 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67  .      int is_ag
b3b0: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
b3c0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73     /* True if is
b3d0: 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75   an aggregate fu
b3e0: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  nction */.      
b3f0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74  int i;.      int
b400: 20 61 75 74 68 3b 20 20 20 20 20 20 20 20 20 20   auth;          
b410: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 68           /* Auth
b420: 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 75 73 65  orization to use
b430: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
b440: 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20  .      int nId; 
b450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b460: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b470: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 66 75  characters in fu
b480: 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
b490: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
b4a0: 2a 7a 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  *zId;           
b4b0: 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
b4c0: 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20   name. */.      
b4d0: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20  FuncDef *pDef;  
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
b4f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
b500: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
b510: 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 63 20 3d  .      int enc =
b520: 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29   ENC(pParse->db)
b530: 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61  ;  /* The databa
b540: 73 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a  se encoding */..
b550: 20 20 20 20 20 20 7a 49 64 20 3d 20 28 63 68 61        zId = (cha
b560: 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
b570: 7a 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 70  z;.      nId = p
b580: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20  Expr->token.n;. 
b590: 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
b5a0: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
b5b0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c  pParse->db, zId,
b5c0: 20 6e 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29   nId, n, enc, 0)
b5d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  ;.      if( pDef
b5e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
b5f0: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
b600: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
b610: 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20  ->db, zId, nId, 
b620: 2d 31 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20  -1, enc, 0);.   
b630: 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
b640: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f   ){.          no
b650: 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a  _such_func = 1;.
b660: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b670: 20 20 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e           wrong_n
b680: 75 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20  um_args = 1;.   
b690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
b6a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61  se{.        is_a
b6b0: 67 67 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63  gg = pDef->xFunc
b6c0: 3d 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  ==0;.      }.#if
b6d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b6e0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
b6f0: 20 20 20 20 20 69 66 28 20 70 44 65 66 20 29 7b       if( pDef ){
b700: 0a 20 20 20 20 20 20 20 20 61 75 74 68 20 3d 20  .        auth = 
b710: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
b720: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
b730: 46 55 4e 43 54 49 4f 4e 2c 20 30 2c 20 70 44 65  FUNCTION, 0, pDe
b740: 66 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  f->zName, 0);.  
b750: 20 20 20 20 20 20 69 66 28 20 61 75 74 68 21 3d        if( auth!=
b760: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b770: 20 20 20 20 20 20 20 69 66 28 20 61 75 74 68 3d         if( auth=
b780: 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a  =SQLITE_DENY ){.
b790: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
b7a0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
b7b0: 73 65 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69  se, "not authori
b7c0: 7a 65 64 20 74 6f 20 75 73 65 20 66 75 6e 63 74  zed to use funct
b7d0: 69 6f 6e 3a 20 25 73 22 2c 0a 20 20 20 20 20 20  ion: %s",.      
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
b800: 65 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ef->zName);.    
b810: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
b820: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  r++;.          }
b830: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
b840: 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
b850: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
b860: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
b870: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b880: 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 26 26     if( is_agg &&
b890: 20 21 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20   !pNC->allowAgg 
b8a0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b8b0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b8c0: 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67  e, "misuse of ag
b8d0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
b8e0: 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49   %.*s()", nId,zI
b8f0: 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d  d);.        pNC-
b900: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
b910: 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20   is_agg = 0;.   
b920: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f     }else if( no_
b930: 73 75 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20  such_func ){.   
b940: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
b950: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
b960: 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20   such function: 
b970: 25 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29  %.*s", nId, zId)
b980: 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e  ;.        pNC->n
b990: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  Err++;.      }el
b9a0: 73 65 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d  se if( wrong_num
b9b0: 5f 61 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20  _args ){.       
b9c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
b9d0: 28 70 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e  (pParse,"wrong n
b9e0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
b9f0: 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25  ts to function %
ba00: 2e 2a 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20  .*s()",.        
ba10: 20 20 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a       nId, zId);.
ba20: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
ba30: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r++;.      }.   
ba40: 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b     if( is_agg ){
ba50: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
ba60: 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43  op = TK_AGG_FUNC
ba70: 54 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e  TION;.        pN
ba80: 43 2d 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20  C->hasAgg = 1;. 
ba90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
baa0: 20 69 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61   is_agg ) pNC->a
bab0: 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 20  llowAgg = 0;.   
bac0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 4e 43 2d     for(i=0; pNC-
bad0: 3e 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b  >nErr==0 && i<n;
bae0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 77   i++){.        w
baf0: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 4c 69 73  alkExprTree(pLis
bb00: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e  t->a[i].pExpr, n
bb10: 61 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c  ameResolverStep,
bb20: 20 70 4e 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20   pNC);.      }. 
bb30: 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20       if( is_agg 
bb40: 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20  ) pNC->allowAgg 
bb50: 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49  = 1;.      /* FI
bb60: 58 20 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70  X ME:  Compute p
bb70: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62  Expr->affinity b
bb80: 61 73 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65  ased on the expe
bb90: 63 74 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20  cted return.    
bba0: 20 20 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65    ** type of the
bbb0: 20 66 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20   function .     
bbc0: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
bbd0: 20 69 73 5f 61 67 67 3b 0a 20 20 20 20 7d 0a 23   is_agg;.    }.#
bbe0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
bbf0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
bc00: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a  case TK_SELECT:.
bc10: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
bc20: 54 53 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63  TS:.#endif.    c
bc30: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
bc40: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53     if( pExpr->pS
bc50: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
bc60: 20 69 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d   int nRef = pNC-
bc70: 3e 6e 52 65 66 3b 0a 23 69 66 6e 64 65 66 20 53  >nRef;.#ifndef S
bc80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
bc90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43  .        if( pNC
bca0: 2d 3e 69 73 43 68 65 63 6b 20 29 7b 0a 20 20 20  ->isCheck ){.   
bcb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
bcc0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 73  rorMsg(pParse,"s
bcd0: 75 62 71 75 65 72 69 65 73 20 70 72 6f 68 69 62  ubqueries prohib
bce0: 69 74 65 64 20 69 6e 20 43 48 45 43 4b 20 63 6f  ited in CHECK co
bcf0: 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20  nstraints");.   
bd00: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
bd10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
bd20: 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
bd30: 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  e, pExpr->pSelec
bd40: 74 2c 20 70 4e 43 29 3b 0a 20 20 20 20 20 20 20  t, pNC);.       
bd50: 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52   assert( pNC->nR
bd60: 65 66 3e 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20  ef>=nRef );.    
bd70: 20 20 20 20 69 66 28 20 6e 52 65 66 21 3d 70 4e      if( nRef!=pN
bd80: 43 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20 20  C->nRef ){.     
bd90: 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70       ExprSetProp
bda0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56  erty(pExpr, EP_V
bdb0: 61 72 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  arSelect);.     
bdc0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
bdd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bde0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
bdf0: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 20 20 63 61  MIT_CHECK.    ca
be00: 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20  se TK_VARIABLE: 
be10: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d  {.      if( pNC-
be20: 3e 69 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20  >isCheck ){.    
be30: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
be40: 4d 73 67 28 70 50 61 72 73 65 2c 22 70 61 72 61  Msg(pParse,"para
be50: 6d 65 74 65 72 73 20 70 72 6f 68 69 62 69 74 65  meters prohibite
be60: 64 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74  d in CHECK const
be70: 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  raints");.      
be80: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
be90: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
bea0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
beb0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
bec0: 65 20 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65  e walks an expre
bed0: 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72  ssion tree and r
bee0: 65 73 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63  esolves referenc
bef0: 65 73 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63  es to.** table c
bf00: 6f 6c 75 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f  olumns.  Nodes o
bf10: 66 20 74 68 65 20 66 6f 72 6d 20 49 44 2e 49 44  f the form ID.ID
bf20: 20 6f 72 20 49 44 20 72 65 73 6f 6c 76 65 20 69   or ID resolve i
bf30: 6e 74 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20  nto an.** index 
bf40: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20  to the table in 
bf50: 74 68 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61  the table list a
bf60: 6e 64 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73  nd a column offs
bf70: 65 74 2e 20 20 54 68 65 20 0a 2a 2a 20 45 78 70  et.  The .** Exp
bf80: 72 2e 6f 70 63 6f 64 65 20 66 6f 72 20 73 75 63  r.opcode for suc
bf90: 68 20 6e 6f 64 65 73 20 69 73 20 63 68 61 6e 67  h nodes is chang
bfa0: 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e  ed to TK_COLUMN.
bfb0: 20 20 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c    The Expr.iTabl
bfc0: 65 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 63 68  e.** value is ch
bfd0: 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64  anged to the ind
bfe0: 65 78 20 6f 66 20 74 68 65 20 72 65 66 65 72 65  ex of the refere
bff0: 6e 63 65 64 20 74 61 62 6c 65 20 69 6e 20 70 54  nced table in pT
c000: 61 62 4c 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74  abList.** plus t
c010: 68 65 20 22 62 61 73 65 22 20 76 61 6c 75 65 2e  he "base" value.
c020: 20 20 54 68 65 20 62 61 73 65 20 76 61 6c 75 65    The base value
c030: 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79   will ultimately
c040: 20 62 65 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56   become the.** V
c050: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
c060: 72 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74  r for a cursor t
c070: 68 61 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  hat is pointing 
c080: 69 6e 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e  into the referen
c090: 63 65 64 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54  ced.** table.  T
c0a0: 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20  he Expr.iColumn 
c0b0: 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64  value is changed
c0c0: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
c0d0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20   the column .** 
c0e0: 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  of the reference
c0f0: 64 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78  d table.  The Ex
c100: 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65  pr.iColumn value
c110: 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c   for the special
c120: 0a 2a 2a 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  .** ROWID column
c130: 20 69 73 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54   is -1.  Any INT
c140: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
c150: 20 63 6f 6c 75 6d 6e 20 69 73 20 74 72 69 65 64   column is tried
c160: 20 61 73 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20   as an.** alias 
c170: 66 6f 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a  for ROWID..**.**
c180: 20 41 6c 73 6f 20 72 65 73 6f 6c 76 65 20 66 75   Also resolve fu
c190: 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 6e 64  nction names and
c1a0: 20 63 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74   check the funct
c1b0: 69 6f 6e 73 20 66 6f 72 20 70 72 6f 70 65 72 0a  ions for proper.
c1c0: 2a 2a 20 75 73 61 67 65 2e 20 20 4d 61 6b 65 20  ** usage.  Make 
c1d0: 73 75 72 65 20 61 6c 6c 20 66 75 6e 63 74 69 6f  sure all functio
c1e0: 6e 20 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f  n names are reco
c1f0: 67 6e 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66  gnized and all f
c200: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 68 61 76 65  unctions.** have
c210: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d   the correct num
c220: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
c230: 2e 20 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f  .  Leave an erro
c240: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20  r message.** in 
c250: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20  pParse->zErrMsg 
c260: 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61  if anything is a
c270: 6d 69 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68  miss.  Return th
c280: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
c290: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  rs..**.** If the
c2a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
c2b0: 61 69 6e 73 20 61 67 67 72 65 67 61 74 65 20 66  ains aggregate f
c2c0: 75 6e 63 74 69 6f 6e 73 20 74 68 65 6e 20 73 65  unctions then se
c2d0: 74 20 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20  t the EP_Agg.** 
c2e0: 70 72 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20  property on the 
c2f0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69  expression..*/.i
c300: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  nt sqlite3ExprRe
c310: 73 6f 6c 76 65 4e 61 6d 65 73 28 20 0a 20 20 4e  solveNames( .  N
c320: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
c330: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70         /* Namesp
c340: 61 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 65  ace to resolve e
c350: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a  xpressions in. *
c360: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
c370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c380: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
c390: 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f   be analyzed. */
c3a0: 0a 29 7b 0a 20 20 69 6e 74 20 73 61 76 65 64 48  .){.  int savedH
c3b0: 61 73 41 67 67 3b 0a 0a 20 20 69 66 28 20 70 45  asAgg;..  if( pE
c3c0: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  xpr==0 ) return 
c3d0: 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  0;.#if SQLITE_MA
c3e0: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20  X_EXPR_DEPTH>0. 
c3f0: 20 7b 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b   {.    if( check
c400: 45 78 70 72 48 65 69 67 68 74 28 70 4e 43 2d 3e  ExprHeight(pNC->
c410: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 6e  pParse, pExpr->n
c420: 48 65 69 67 68 74 20 2b 20 70 4e 43 2d 3e 70 50  Height + pNC->pP
c430: 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 29 20 29  arse->nHeight) )
c440: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
c450: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 43 2d  ;.    }.    pNC-
c460: 3e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74  >pParse->nHeight
c470: 20 2b 3d 20 70 45 78 70 72 2d 3e 6e 48 65 69 67   += pExpr->nHeig
c480: 68 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ht;.  }.#endif. 
c490: 20 73 61 76 65 64 48 61 73 41 67 67 20 3d 20 70   savedHasAgg = p
c4a0: 4e 43 2d 3e 68 61 73 41 67 67 3b 0a 20 20 70 4e  NC->hasAgg;.  pN
c4b0: 43 2d 3e 68 61 73 41 67 67 20 3d 20 30 3b 0a 20  C->hasAgg = 0;. 
c4c0: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45   walkExprTree(pE
c4d0: 78 70 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65  xpr, nameResolve
c4e0: 72 53 74 65 70 2c 20 70 4e 43 29 3b 0a 23 69 66  rStep, pNC);.#if
c4f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
c500: 5f 44 45 50 54 48 3e 30 0a 20 20 70 4e 43 2d 3e  _DEPTH>0.  pNC->
c510: 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
c520: 2d 3d 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68  -= pExpr->nHeigh
c530: 74 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  t;.#endif.  if( 
c540: 70 4e 43 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20  pNC->nErr>0 ){. 
c550: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
c560: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72  ty(pExpr, EP_Err
c570: 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  or);.  }.  if( p
c580: 4e 43 2d 3e 68 61 73 41 67 67 20 29 7b 0a 20 20  NC->hasAgg ){.  
c590: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
c5a0: 79 28 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29  y(pExpr, EP_Agg)
c5b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 61  ;.  }else if( sa
c5c0: 76 65 64 48 61 73 41 67 67 20 29 7b 0a 20 20 20  vedHasAgg ){.   
c5d0: 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d 20 31   pNC->hasAgg = 1
c5e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 45  ;.  }.  return E
c5f0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
c600: 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b  Expr, EP_Error);
c610: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 6f 69 6e  .}../*.** A poin
c620: 74 65 72 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ter instance of 
c630: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
c640: 73 20 75 73 65 64 20 74 6f 20 70 61 73 73 20 69  s used to pass i
c650: 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 68  nformation.** th
c660: 72 6f 75 67 68 20 77 61 6c 6b 45 78 70 72 54 72  rough walkExprTr
c670: 65 65 20 69 6e 74 6f 20 63 6f 64 65 53 75 62 71  ee into codeSubq
c680: 75 65 72 79 53 74 65 70 28 29 2e 0a 2a 2f 0a 74  ueryStep()..*/.t
c690: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 51 75  ypedef struct Qu
c6a0: 65 72 79 43 6f 64 65 72 20 51 75 65 72 79 43 6f  eryCoder QueryCo
c6b0: 64 65 72 3b 0a 73 74 72 75 63 74 20 51 75 65 72  der;.struct Quer
c6c0: 79 43 6f 64 65 72 20 7b 0a 20 20 50 61 72 73 65  yCoder {.  Parse
c6d0: 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
c6e0: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
c6f0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 4e 61 6d 65  ontext */.  Name
c700: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 20 20 20  Context *pNC;   
c710: 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 6f 66   /* Namespace of
c720: 20 66 69 72 73 74 20 65 6e 63 6c 6f 73 69 6e 67   first enclosing
c730: 20 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a 23 69   query */.};..#i
c740: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
c750: 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  .  int sqlite3_e
c760: 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 20 3d 20 31  nable_in_opt = 1
c770: 3b 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  ;.#else.  #defin
c780: 65 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  e sqlite3_enable
c790: 5f 69 6e 5f 6f 70 74 20 31 0a 23 65 6e 64 69 66  _in_opt 1.#endif
c7a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
c7b0: 72 75 65 20 69 66 20 74 68 65 20 49 4e 20 6f 70  rue if the IN op
c7c0: 65 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74  erator optimizat
c7d0: 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 61  ion is enabled a
c7e0: 6e 64 0a 2a 2a 20 74 68 65 20 53 45 4c 45 43 54  nd.** the SELECT
c7f0: 20 73 74 61 74 65 6d 65 6e 74 20 70 20 65 78 69   statement p exi
c800: 73 74 73 20 61 6e 64 20 69 73 20 6f 66 20 74 68  sts and is of th
c810: 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 66 6f 72 6d  e.** simple form
c820: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
c830: 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d  CT <column> FROM
c840: 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49   <table>.**.** I
c850: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
c860: 73 65 2c 20 69 74 20 6d 61 79 20 62 65 20 70 6f  se, it may be po
c870: 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e  ssible to use an
c880: 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 0a   existing table.
c890: 2a 2a 20 6f 72 20 69 6e 64 65 78 20 69 6e 73 74  ** or index inst
c8a0: 65 61 64 20 6f 66 20 67 65 6e 65 72 61 74 69 6e  ead of generatin
c8b0: 67 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74  g an epheremal t
c8c0: 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
c8d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
c8e0: 51 55 45 52 59 0a 73 74 61 74 69 63 20 69 6e 74  QUERY.static int
c8f0: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
c900: 6e 4f 70 74 28 53 65 6c 65 63 74 20 2a 70 29 7b  nOpt(Select *p){
c910: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
c920: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
c930: 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70  List;.  Table *p
c940: 54 61 62 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  Tab;.  if( !sqli
c950: 74 65 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70  te3_enable_in_op
c960: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a  t ) return 0; /*
c970: 20 49 4e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   IN optimization
c980: 20 6d 75 73 74 20 62 65 20 65 6e 61 62 6c 65 64   must be enabled
c990: 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   */.  if( p==0 )
c9a0: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
c9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c9c0: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
c9d0: 6f 66 20 49 4e 20 69 73 20 53 45 4c 45 43 54 20  of IN is SELECT 
c9e0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
c9f0: 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ca10: 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ot a compound SE
ca20: 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LECT */.  if( p-
ca30: 3e 69 73 44 69 73 74 69 6e 63 74 20 29 20 72 65  >isDistinct ) re
ca40: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
ca50: 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54 20   /* No DISTINCT 
ca60: 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 69 66 28  keyword */.  if(
ca70: 20 70 2d 3e 69 73 41 67 67 20 29 20 72 65 74 75   p->isAgg ) retu
ca80: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
ca90: 20 20 20 20 2f 2a 20 43 6f 6e 74 61 69 6e 73 20      /* Contains 
caa0: 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  no aggregate fun
cab0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 66 28 20  ctions */.  if( 
cac0: 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 20 72 65  p->pGroupBy ) re
cad0: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
cae0: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f     /* Has no GRO
caf0: 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  UP BY clause */.
cb00: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
cb10: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
cb20: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
cb30: 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  no LIMIT clause 
cb40: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66  */.  if( p->pOff
cb50: 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  set ) return 0;.
cb60: 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
cb70: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
cb80: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
cb90: 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  no WHERE clause 
cba0: 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  */.  pSrc = p->p
cbb0: 53 72 63 3b 0a 20 20 69 66 28 20 70 53 72 63 3d  Src;.  if( pSrc=
cbc0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
cbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cbe0: 20 41 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   A single table 
cbf0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
cc00: 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63  se */.  if( pSrc
cc10: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
cc20: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 53 72 63  rn 0;.  if( pSrc
cc30: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29  ->a[0].pSelect )
cc40: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f   return 0;     /
cc50: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  * FROM clause is
cc60: 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 20   not a subquery 
cc70: 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  */.  pTab = pSrc
cc80: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 69  ->a[0].pTab;.  i
cc90: 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
cca0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54 61  urn 0;.  if( pTa
ccb0: 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74  b->pSelect ) ret
ccc0: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
ccd0: 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  /* FROM clause i
cce0: 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a  s not a view */.
ccf0: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
cd00: 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
cd10: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d  ;        /* FROM
cd20: 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69   clause not a vi
cd30: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
cd40: 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
cd50: 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ist;.  if( pELis
cd60: 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
cd70: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 2f 2a  turn 0;       /*
cd80: 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74   One column in t
cd90: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
cda0: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61  .  if( pEList->a
cdb0: 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54  [0].pExpr->op!=T
cdc0: 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  K_COLUMN ) retur
cdd0: 6e 20 30 3b 20 2f 2a 20 52 65 73 75 6c 74 20 69  n 0; /* Result i
cde0: 73 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  s a column */.  
cdf0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
ce00: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
ce10: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f  T_SUBQUERY */../
ce20: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
ce30: 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68  on is used by th
ce40: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
ce50: 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29   of the IN (...)
ce60: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 49 74   operator..** It
ce70: 27 73 20 6a 6f 62 20 69 73 20 74 6f 20 66 69 6e  's job is to fin
ce80: 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d  d or create a b-
ce90: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 74  tree structure t
cea0: 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 64 0a  hat may be used.
ceb0: 2a 2a 20 65 69 74 68 65 72 20 74 6f 20 74 65 73  ** either to tes
cec0: 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70  t for membership
ced0: 20 6f 66 20 74 68 65 20 28 2e 2e 2e 29 20 73 65   of the (...) se
cee0: 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20  t or to iterate 
cef0: 74 68 72 6f 75 67 68 0a 2a 2a 20 69 74 73 20 6d  through.** its m
cf00: 65 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67  embers, skipping
cf10: 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a   duplicates..**.
cf20: 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 70  ** The cursor op
cf30: 65 6e 65 64 20 6f 6e 20 74 68 65 20 73 74 72 75  ened on the stru
cf40: 63 74 75 72 65 20 28 64 61 74 61 62 61 73 65 20  cture (database 
cf50: 74 61 62 6c 65 2c 20 64 61 74 61 62 61 73 65 20  table, database 
cf60: 69 6e 64 65 78 20 0a 2a 2a 20 6f 72 20 65 70 68  index .** or eph
cf70: 65 72 6d 61 6c 20 74 61 62 6c 65 29 20 69 73 20  ermal table) is 
cf80: 73 74 6f 72 65 64 20 69 6e 20 70 58 2d 3e 69 54  stored in pX->iT
cf90: 61 62 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73  able before this
cfa0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
cfb0: 73 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  s..** The return
cfc0: 65 64 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74  ed value indicat
cfd0: 65 73 20 74 68 65 20 73 74 72 75 63 74 75 72 65  es the structure
cfe0: 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77   type, as follow
cff0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e  s:.**.**   IN_IN
d000: 44 45 58 5f 52 4f 57 49 44 20 2d 20 54 68 65 20  DEX_ROWID - The 
d010: 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
d020: 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  d on a database 
d030: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49  table..**   IN_I
d040: 4e 44 45 58 5f 49 4e 44 45 58 20 2d 20 54 68 65  NDEX_INDEX - The
d050: 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
d060: 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ed on a database
d070: 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f   index..**   IN_
d080: 49 4e 44 45 58 5f 45 50 48 20 2d 20 20 20 54 68  INDEX_EPH -   Th
d090: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
d0a0: 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c  ned on a special
d0b0: 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  ly created and.*
d0c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
d0d0: 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65       populated e
d0e0: 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a  pheremal table..
d0f0: 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
d100: 67 20 73 74 72 75 63 74 75 72 65 20 6d 61 79 20  g structure may 
d110: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20  only be used if 
d120: 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66  the SELECT is of
d130: 20 74 68 65 20 73 69 6d 70 6c 65 0a 2a 2a 20 66   the simple.** f
d140: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  orm:.**.**     S
d150: 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46  ELECT <column> F
d160: 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a  ROM <table>.**.*
d170: 2a 20 49 66 20 70 72 4e 6f 74 46 6f 75 6e 64 20  * If prNotFound 
d180: 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20  parameter is 0, 
d190: 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75  then the structu
d1a0: 72 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  re will be used 
d1b0: 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68  to iterate.** th
d1c0: 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65  rough the set me
d1d0: 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20  mbers, skipping 
d1e0: 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20  any duplicates. 
d1f0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a  In this case an.
d200: 2a 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  ** epheremal tab
d210: 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  le must be used 
d220: 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
d230: 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20  ted <column> is 
d240: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
d250: 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
d260: 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
d270: 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
d280: 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a  MARY KEY or it.*
d290: 2a 20 69 73 20 75 6e 69 71 75 65 20 62 79 20 76  * is unique by v
d2a0: 69 72 74 75 65 20 6f 66 20 61 20 63 6f 6e 73 74  irtue of a const
d2b0: 72 61 69 6e 74 20 6f 72 20 69 6d 70 6c 69 63 69  raint or implici
d2c0: 74 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49  t index..**.** I
d2d0: 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e 64  f the prNotFound
d2e0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
d2f0: 74 20 30 2c 20 74 68 65 6e 20 74 68 65 20 73 74  t 0, then the st
d300: 72 75 63 74 75 72 65 20 77 69 6c 6c 20 62 65 20  ructure will be 
d310: 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73  used .** for fas
d320: 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  t set membership
d330: 20 74 65 73 74 73 2e 20 49 6e 20 74 68 69 73 20   tests. In this 
d340: 63 61 73 65 20 61 6e 20 65 70 68 65 72 65 6d 61  case an epherema
d350: 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a  l table must .**
d360: 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20   be used unless 
d370: 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49  <column> is an I
d380: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
d390: 45 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 63  EY or an index c
d3a0: 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20  an .** be found 
d3b0: 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73  with <column> as
d3c0: 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63   its left-most c
d3d0: 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  olumn..**.** Whe
d3e0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
d3f0: 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  is being used fo
d400: 72 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70  r set membership
d410: 20 74 65 73 74 73 2c 20 74 68 65 20 75 73 65 72   tests, the user
d420: 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f  .** needs to kno
d430: 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  w whether or not
d440: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 63   the structure c
d450: 6f 6e 74 61 69 6e 73 20 61 6e 20 53 51 4c 20 4e  ontains an SQL N
d460: 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75 65 20 69 6e  ULL .** value in
d470: 20 6f 72 64 65 72 20 74 6f 20 63 6f 72 72 65 63   order to correc
d480: 74 6c 79 20 65 76 61 6c 75 61 74 65 20 65 78 70  tly evaluate exp
d490: 72 65 73 73 69 6f 6e 73 20 6c 69 6b 65 20 22 58  ressions like "X
d4a0: 20 49 4e 20 28 59 2c 20 5a 29 22 2e 0a 2a 2a 20   IN (Y, Z)"..** 
d4b0: 49 66 20 74 68 65 72 65 20 69 73 20 61 20 63 68  If there is a ch
d4c0: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 73 74  ance that the st
d4d0: 72 75 63 74 75 72 65 20 6d 61 79 20 63 6f 6e 74  ructure may cont
d4e0: 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ain a NULL value
d4f0: 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20   at.** runtime, 
d500: 74 68 65 6e 20 61 20 72 65 67 69 73 74 65 72 20  then a register 
d510: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
d520: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
d530: 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20  mber written.** 
d540: 74 6f 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2e 20  to *prNotFound. 
d550: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  If there is no c
d560: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 73  hance that the s
d570: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
d580: 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75  s a.** NULL valu
d590: 65 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74 46 6f  e, then *prNotFo
d5a0: 75 6e 64 20 69 73 20 6c 65 66 74 20 75 6e 63 68  und is left unch
d5b0: 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
d5c0: 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
d5d0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20  located and its 
d5e0: 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20  location stored 
d5f0: 69 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c 20  in *prNotFound, 
d600: 74 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e 69 74  then.** its init
d610: 69 61 6c 20 76 61 6c 75 65 20 69 73 20 4e 55 4c  ial value is NUL
d620: 4c 2e 20 49 66 20 74 68 65 20 73 74 72 75 63 74  L. If the struct
d630: 75 72 65 20 64 6f 65 73 20 6e 6f 74 20 72 65 6d  ure does not rem
d640: 61 69 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20  ain constant.** 
d650: 66 6f 72 20 74 68 65 20 64 75 72 61 74 69 6f 6e  for the duration
d660: 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 28 69   of the query (i
d670: 2e 65 2e 20 74 68 65 20 73 65 74 20 69 73 20 61  .e. the set is a
d680: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d   correlated sub-
d690: 73 65 6c 65 63 74 29 2c 20 0a 2a 2a 20 74 68 65  select), .** the
d6a0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61 6c   value of the al
d6b0: 6c 6f 63 61 74 65 64 20 72 65 67 69 73 74 65 72  located register
d6c0: 20 69 73 20 72 65 73 65 74 20 74 6f 20 4e 55 4c   is reset to NUL
d6d0: 4c 20 65 61 63 68 20 74 69 6d 65 20 74 68 65 20  L each time the 
d6e0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 73  .** structure is
d6f0: 20 72 65 70 6f 70 75 6c 61 74 65 64 2e 20 54 68   repopulated. Th
d700: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61  is allows the ca
d710: 6c 6c 65 72 20 74 6f 20 75 73 65 20 76 64 62 65  ller to use vdbe
d720: 20 63 6f 64 65 20 0a 2a 2a 20 65 71 75 69 76 61   code .** equiva
d730: 6c 65 6e 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c  lent to the foll
d740: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  owing:.**.**   i
d750: 66 28 20 72 65 67 69 73 74 65 72 3d 3d 4e 55 4c  f( register==NUL
d760: 4c 20 29 7b 0a 2a 2a 20 20 20 20 20 68 61 73 5f  L ){.**     has_
d770: 6e 75 6c 6c 20 3d 20 3c 74 65 73 74 20 69 66 20  null = <test if 
d780: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63  data structure c
d790: 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a  ontains null>.**
d7a0: 20 20 20 20 20 72 65 67 69 73 74 65 72 20 3d 20       register = 
d7b0: 31 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 69  1.**   }.**.** i
d7c0: 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
d7d0: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 3c 74 65   running the <te
d7e0: 73 74 20 69 66 20 64 61 74 61 20 73 74 72 75 63  st if data struc
d7f0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75  ture contains nu
d800: 6c 6c 3e 0a 2a 2a 20 74 65 73 74 20 6d 6f 72 65  ll>.** test more
d810: 20 6f 66 74 65 6e 20 74 68 61 6e 20 69 73 20 6e   often than is n
d820: 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 23 69 66  ecessary..*/.#if
d830: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d840: 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
d850: 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
d860: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
d870: 45 78 70 72 20 2a 70 58 2c 20 69 6e 74 20 2a 70  Expr *pX, int *p
d880: 72 4e 6f 74 46 6f 75 6e 64 29 7b 0a 20 20 53 65  rNotFound){.  Se
d890: 6c 65 63 74 20 2a 70 3b 0a 20 20 69 6e 74 20 65  lect *p;.  int e
d8a0: 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Type = 0;.  int 
d8b0: 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
d8c0: 54 61 62 2b 2b 3b 0a 20 20 69 6e 74 20 6d 75 73  Tab++;.  int mus
d8d0: 74 42 65 55 6e 69 71 75 65 20 3d 20 21 70 72 4e  tBeUnique = !prN
d8e0: 6f 74 46 6f 75 6e 64 3b 0a 0a 20 20 2f 2a 20 54  otFound;..  /* T
d8f0: 68 65 20 66 6f 6c 6c 77 69 6e 67 20 69 66 28 2e  he follwing if(.
d900: 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ..) expression i
d910: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 53 45  s true if the SE
d920: 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 0a  LECT is of the .
d930: 20 20 2a 2a 20 73 69 6d 70 6c 65 20 66 6f 72 6d    ** simple form
d940: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
d950: 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20  SELECT <column> 
d960: 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 20 20 2a  FROM <table>.  *
d970: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69  *.  ** If this i
d980: 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 6d  s the case, it m
d990: 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ay be possible t
d9a0: 6f 20 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  o use an existin
d9b0: 67 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 72 20  g table.  ** or 
d9c0: 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66  index instead of
d9d0: 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 65   generating an e
d9e0: 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a  pheremal table..
d9f0: 20 20 2a 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 70    */.  p = pX->p
da00: 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 69 73  Select;.  if( is
da10: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
da20: 74 28 70 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  t(p) ){.    sqli
da30: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
da40: 2d 3e 64 62 3b 0a 20 20 20 20 49 6e 64 65 78 20  ->db;.    Index 
da50: 2a 70 49 64 78 3b 0a 20 20 20 20 45 78 70 72 20  *pIdx;.    Expr 
da60: 2a 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69  *pExpr = p->pELi
da70: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
da80: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
da90: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
daa0: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
dab0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
dac0: 73 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  se);..    /* Thi
dad0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
dae0: 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74  ly called from t
daf0: 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f  wo places. In bo
db00: 74 68 20 63 61 73 65 73 20 74 68 65 20 76 64 62  th cases the vdb
db10: 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72  e.    ** has alr
db20: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
db30: 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65 20 73  ted. So assume s
db40: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29 20  qlite3GetVdbe() 
db50: 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a  is always.    **
db60: 20 73 75 63 63 65 73 73 66 75 6c 20 68 65 72 65   successful here
db70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
db80: 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66 28 20  ert(v);.    if( 
db90: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
dba0: 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  int iMem = ++pPa
dbb0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
dbc0: 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 20 20   int iAddr;.    
dbd0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
dbe0: 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
dbf0: 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 44  ab;.      int iD
dc00: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
dc10: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
dc20: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
dc30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
dc40: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
dc50: 0a 0a 20 20 20 20 20 20 69 41 64 64 72 20 3d 20  ..      iAddr = 
dc60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dc70: 31 28 76 2c 20 4f 50 5f 49 66 2c 20 69 4d 65 6d  1(v, OP_If, iMem
dc80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
dc90: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
dca0: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 4d 65  _Integer, 1, iMe
dcb0: 6d 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  m);..      sqlit
dcc0: 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
dcd0: 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70  se, iTab, iDb, p
dce0: 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
dcf0: 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d  );.      eType =
dd00: 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b   IN_INDEX_ROWID;
dd10: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
dd20: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69  dbeJumpHere(v, i
dd30: 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Addr);.    }else
dd40: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
dd50: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
dd60: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  e used by the co
dd70: 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20  mparison. If an 
dd80: 69 6e 64 65 78 20 69 73 20 74 6f 20 0a 20 20 20  index is to .   
dd90: 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e     ** be used in
dda0: 20 70 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70   place of a temp
ddb0: 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20  -table, it must 
ddc0: 62 65 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72  be ordered accor
ddd0: 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ding.      ** to
dde0: 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20   this collation 
ddf0: 73 65 71 75 65 6e 63 65 2e 0a 20 20 20 20 20 20  sequence..      
de00: 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  */.      CollSeq
de10: 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33   *pReq = sqlite3
de20: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
de30: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
de40: 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a  >pLeft, pExpr);.
de50: 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
de60: 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74  that the affinit
de70: 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
de80: 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74  sed to perform t
de90: 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  he .      ** com
dea0: 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73  parison is the s
deb0: 61 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e  ame as the affin
dec0: 69 74 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ity of the colum
ded0: 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69  n. If.      ** i
dee0: 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20  t is not, it is 
def0: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
df00: 75 73 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20  use any index.. 
df10: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
df20: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70  ble *pTab = p->p
df30: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
df40: 20 20 20 20 20 20 63 68 61 72 20 61 66 66 20 3d        char aff =
df50: 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
df60: 69 74 79 28 70 58 29 3b 0a 20 20 20 20 20 20 69  ity(pX);.      i
df70: 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d  nt affinity_ok =
df80: 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   (pTab->aCol[iCo
df90: 6c 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 61 66 66  l].affinity==aff
dfa0: 7c 7c 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  ||aff==SQLITE_AF
dfb0: 46 5f 4e 4f 4e 45 29 3b 0a 0a 20 20 20 20 20 20  F_NONE);..      
dfc0: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
dfd0: 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20 65  Index; pIdx && e
dfe0: 54 79 70 65 3d 3d 30 20 26 26 20 61 66 66 69 6e  Type==0 && affin
dff0: 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64  ity_ok; pIdx=pId
e000: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
e010: 20 20 20 69 66 28 20 28 70 49 64 78 2d 3e 61 69     if( (pIdx->ai
e020: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29  Column[0]==iCol)
e030: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 52  .         && (pR
e040: 65 71 3d 3d 73 71 6c 69 74 65 33 46 69 6e 64 43  eq==sqlite3FindC
e050: 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
e060: 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  b), pIdx->azColl
e070: 5b 30 5d 2c 20 2d 31 2c 20 30 29 29 0a 20 20 20  [0], -1, 0)).   
e080: 20 20 20 20 20 20 26 26 20 28 21 6d 75 73 74 42        && (!mustB
e090: 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64 78  eUnique || (pIdx
e0a0: 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20  ->nColumn==1 && 
e0b0: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
e0c0: 45 5f 4e 6f 6e 65 29 29 0a 20 20 20 20 20 20 20  E_None)).       
e0d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
e0e0: 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
e0f0: 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50   int iMem = ++pP
e100: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
e110: 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b        int iAddr;
e120: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
e130: 2a 70 4b 65 79 3b 0a 20 20 0a 20 20 20 20 20 20  *pKey;.  .      
e140: 20 20 20 20 70 4b 65 79 20 3d 20 28 63 68 61 72      pKey = (char
e150: 20 2a 29 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   *)sqlite3IndexK
e160: 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
e170: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Idx);.          
e180: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
e190: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
e1a0: 49 64 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Idx->pSchema);. 
e1b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e1c0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
e1d0: 20 69 44 62 29 3b 0a 0a 20 20 20 20 20 20 20 20   iDb);..        
e1e0: 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65    iAddr = sqlite
e1f0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
e200: 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  P_If, iMem);.   
e210: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e220: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
e230: 6e 74 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29  nteger, 1, iMem)
e240: 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 73  ;.  .          s
e250: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e260: 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c  (v, OP_SetNumCol
e270: 75 6d 6e 73 2c 20 30 2c 20 70 49 64 78 2d 3e 6e  umns, 0, pIdx->n
e280: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
e290: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e2a0: 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp4(v, OP_OpenR
e2b0: 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d  ead, iTab, pIdx-
e2c0: 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20  >tnum, iDb,.    
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2e0: 20 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 2c             pKey,
e2f0: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
e300: 46 46 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  FF);.          V
e310: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
e320: 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
e330: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54  ));.          eT
e340: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  ype = IN_INDEX_I
e350: 4e 44 45 58 3b 0a 0a 20 20 20 20 20 20 20 20 20  NDEX;..         
e360: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
e370: 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
e380: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72            if( pr
e390: 4e 6f 74 46 6f 75 6e 64 20 26 26 20 21 70 54 61  NotFound && !pTa
e3a0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f  b->aCol[iCol].no
e3b0: 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  tNull ){.       
e3c0: 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64       *prNotFound
e3d0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
e3e0: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  m;.          }. 
e3f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e400: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
e410: 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20  ( eType==0 ){.  
e420: 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75    int rMayHaveNu
e430: 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ll = 0;.    if( 
e440: 70 72 4e 6f 74 46 6f 75 6e 64 20 29 7b 0a 20 20  prNotFound ){.  
e450: 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20      *prNotFound 
e460: 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d  = rMayHaveNull =
e470: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
e480: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
e490: 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
e4a0: 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79  pParse, pX, rMay
e4b0: 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 65  HaveNull);.    e
e4c0: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
e4d0: 45 50 48 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EPH;.  }else{.  
e4e0: 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69    pX->iTable = i
e4f0: 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Tab;.  }.  retur
e500: 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69  n eType;.}.#endi
e510: 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
e520: 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61  e code for scala
e530: 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65  r subqueries use
e540: 64 20 61 73 20 61 6e 20 65 78 70 72 65 73 73 69  d as an expressi
e550: 6f 6e 0a 2a 2a 20 61 6e 64 20 49 4e 20 6f 70 65  on.** and IN ope
e560: 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65  rators.  Example
e570: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45  s:.**.**     (SE
e580: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
e590: 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75          -- subqu
e5a0: 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54  ery.**     EXIST
e5b0: 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  S (SELECT a FROM
e5c0: 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20   b)   -- EXISTS 
e5d0: 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
e5e0: 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20  x IN (4,5,11)   
e5f0: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e             -- IN
e600: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c   operator with l
e610: 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e  ist on right-han
e620: 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20  d side.**     x 
e630: 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  IN (SELECT a FRO
e640: 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f  M b)     -- IN o
e650: 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62  perator with sub
e660: 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67  query on the rig
e670: 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78  ht.**.** The pEx
e680: 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73  pr parameter des
e690: 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65  cribes the expre
e6a0: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61  ssion that conta
e6b0: 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70  ins the IN.** op
e6c0: 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65  erator or subque
e6d0: 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ry..*/.#ifndef S
e6e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
e6f0: 45 52 59 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ERY.void sqlite3
e700: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50 61  CodeSubselect(Pa
e710: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
e720: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 72 4d  r *pExpr, int rM
e730: 61 79 48 61 76 65 4e 75 6c 6c 29 7b 0a 20 20 69  ayHaveNull){.  i
e740: 6e 74 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b  nt testAddr = 0;
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e760: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69         /* One-ti
e770: 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20  me test address 
e780: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
e790: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
e7a0: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
e7b0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 0a 20 20  0 ) return;...  
e7c0: 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73  /* This code mus
e7d0: 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20  t be run in its 
e7e0: 65 6e 74 69 72 65 74 79 20 65 76 65 72 79 20 74  entirety every t
e7f0: 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
e800: 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e  tered.  ** if an
e810: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
e820: 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a  ng is true:.  **
e830: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
e840: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
e850: 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
e860: 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20  subquery.  **   
e870: 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
e880: 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78  nd side is an ex
e890: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f  pression list co
e8a0: 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c  ntaining variabl
e8b0: 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65  es.  **    *  We
e8c0: 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72   are inside a tr
e8d0: 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  igger.  **.  ** 
e8e0: 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
e8f0: 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74  ove are false, t
e900: 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74  hen we can run t
e910: 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e  his code just on
e920: 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65  ce.  ** save the
e930: 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65   results, and re
e940: 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73  use the same res
e950: 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e  ult on subsequen
e960: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20  t invocations.. 
e970: 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48   */.  if( !ExprH
e980: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
e990: 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  xpr, EP_VarSelec
e9a0: 74 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e 74  t) && !pParse->t
e9b0: 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  rigStack ){.    
e9c0: 69 6e 74 20 6d 65 6d 20 3d 20 2b 2b 70 50 61 72  int mem = ++pPar
e9d0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
e9e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
e9f0: 76 2c 20 4f 50 5f 49 66 2c 20 6d 65 6d 29 3b 0a  v, OP_If, mem);.
ea00: 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 73      testAddr = s
ea10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ea20: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
ea30: 31 2c 20 6d 65 6d 29 3b 0a 20 20 20 20 61 73 73  1, mem);.    ass
ea40: 65 72 74 28 20 74 65 73 74 41 64 64 72 3e 30 20  ert( testAddr>0 
ea50: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
ea60: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
ea70: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
ea80: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
ea90: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
eaa0: 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
eab0: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
eac0: 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  keyInfo;.      i
ead0: 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
eae0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
eaf0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
eb00: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20  nstruction */.. 
eb10: 20 20 20 20 20 69 66 28 20 72 4d 61 79 48 61 76       if( rMayHav
eb20: 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  eNull ){.       
eb30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
eb40: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
eb50: 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b  , rMayHaveNull);
eb60: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
eb70: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
eb80: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
eb90: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20  Expr->pLeft);.. 
eba0: 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20       /* Whether 
ebb0: 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e  this is an 'x IN
ebc0: 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20  (SELECT...)' or 
ebd0: 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69  an 'x IN(<exprli
ebe0: 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65  st>)'.      ** e
ebf0: 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20  xpression it is 
ec00: 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65  handled the same
ec10: 20 77 61 79 2e 20 41 20 76 69 72 74 75 61 6c 20   way. A virtual 
ec20: 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20  table is .      
ec30: 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73  ** filled with s
ec40: 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65  ingle-field inde
ec50: 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74  x keys represent
ec60: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ing the results.
ec70: 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
ec80: 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20  e SELECT or the 
ec90: 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20  <exprlist>..    
eca0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
ecb0: 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73   the 'x' express
ecc0: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
ecd0: 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45  value, or the SE
ece0: 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  LECT....      **
ecf0: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
ed00: 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
ed10: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
ed20: 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20  nity of that.   
ed30: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20     ** column is 
ed40: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68  used to build th
ed50: 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  e index keys. If
ed60: 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68   both 'x' and th
ed70: 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43  e.      ** SELEC
ed80: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
ed90: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
eda0: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
edb0: 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20  y is used.      
edc0: 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c  ** if either col
edd0: 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20  umn has NUMERIC 
ede0: 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e  or INTEGER affin
edf0: 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a  ity. If neither.
ee00: 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72        ** 'x' nor
ee10: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73   the SELECT... s
ee20: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
ee30: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
ee40: 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  ic affinity.    
ee50: 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20    ** is used..  
ee60: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
ee70: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
ee80: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
ee90: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
eea0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
eeb0: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
eec0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
eed0: 31 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  1);.      memset
eee0: 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69  (&keyInfo, 0, si
eef0: 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a  zeof(keyInfo));.
ef00: 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46        keyInfo.nF
ef10: 69 65 6c 64 20 3d 20 31 3b 0a 0a 20 20 20 20 20  ield = 1;..     
ef20: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
ef30: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ect ){.        /
ef40: 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78  * Case 1:     ex
ef50: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
ef60: 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .).        **.  
ef70: 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74        ** Generat
ef80: 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20  e code to write 
ef90: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
efa0: 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74  he select into t
efb0: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
efc0: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c       ** table al
efd0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  located and open
efe0: 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  ed above..      
eff0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c    */.        Sel
f000: 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
f010: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
f020: 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20  pEList;..       
f030: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
f040: 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
f050: 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54  T_Set, pExpr->iT
f060: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64  able);.        d
f070: 65 73 74 2e 61 66 66 69 6e 69 74 79 20 3d 20 28  est.affinity = (
f080: 69 6e 74 29 61 66 66 69 6e 69 74 79 3b 0a 20 20  int)affinity;.  
f090: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
f0a0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30  Expr->iTable&0x0
f0b0: 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d  000FFFF)==pExpr-
f0c0: 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  >iTable );.     
f0d0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
f0e0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
f0f0: 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 26 64 65  pr->pSelect, &de
f100: 73 74 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a  st, 0, 0, 0) ){.
f110: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
f120: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f130: 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
f140: 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  pr->pSelect->pEL
f150: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ist;.        if(
f160: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
f170: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 7b 20 0a 20  t->nExpr>0 ){ . 
f180: 20 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f           keyInfo
f190: 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69  .aColl[0] = sqli
f1a0: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
f1b0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
f1c0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20  pExpr->pLeft,.  
f1d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 4c 69              pELi
f1e0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
f1f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f200: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
f210: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ->pList ){.     
f220: 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20     /* Case 2:   
f230: 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
f240: 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ist).        **.
f250: 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65          ** For e
f260: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ach expression, 
f270: 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b  build an index k
f280: 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c  ey from the eval
f290: 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20  uation and.     
f2a0: 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69     ** store it i
f2b0: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
f2c0: 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e  table. If <expr>
f2d0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
f2e0: 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a  en use.        *
f2f0: 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61  * that columns a
f300: 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69  ffinity when bui
f310: 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73  lding index keys
f320: 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e  . If <expr> is n
f330: 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ot.        ** a 
f340: 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65  column, use nume
f350: 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20  ric affinity..  
f360: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
f370: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
f380: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
f390: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
f3a0: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
f3b0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
f3c0: 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  tem;.        int
f3d0: 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20   r1, r2, r3;..  
f3e0: 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69 6e        if( !affin
f3f0: 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ity ){.         
f400: 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49   affinity = SQLI
f410: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
f420: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6b       }.        k
f430: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20  eyInfo.aColl[0] 
f440: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  = pExpr->pLeft->
f450: 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20  pColl;..        
f460: 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
f470: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
f480: 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a  in <exprlist>. *
f490: 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  /.        r1 = s
f4a0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
f4b0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
f4c0: 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
f4d0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
f4e0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
f4f0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  pList->nExpr, pI
f500: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e  tem=pList->a; i>
f510: 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
f520: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
f530: 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70   *pE2 = pItem->p
f540: 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 20 20 20  Expr;..         
f550: 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65   /* If the expre
f560: 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e  ssion is not con
f570: 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69  stant then we wi
f580: 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  ll need to.     
f590: 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20       ** disable 
f5a0: 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61  the test that wa
f5b0: 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76  s generated abov
f5c0: 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
f5d0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
f5e0: 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78  his code only ex
f5f0: 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65  ecutes once.  Be
f600: 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d  cause for a non-
f610: 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20  constant.       
f620: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
f630: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75   we need to reru
f640: 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68  n this code each
f650: 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20   time..         
f660: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
f670: 28 20 74 65 73 74 41 64 64 72 20 26 26 20 21 73  ( testAddr && !s
f680: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
f690: 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20  tant(pE2) ){.   
f6a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f6b0: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
f6c0: 28 76 2c 20 74 65 73 74 41 64 64 72 2d 31 2c 20  (v, testAddr-1, 
f6d0: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
f6e0: 74 65 73 74 41 64 64 72 20 3d 20 30 3b 0a 20 20  testAddr = 0;.  
f6f0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
f700: 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
f710: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
f720: 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e  and insert it in
f730: 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c  to the temp tabl
f740: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  e */.          p
f750: 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
f760: 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20  lCache++;.      
f770: 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33      r3 = sqlite3
f780: 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
f790: 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b  Parse, pE2, r1);
f7a0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
f7b0: 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62  t( pParse->disab
f7c0: 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a  leColCache>0 );.
f7d0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
f7e0: 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
f7f0: 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 73  e--;.          s
f800: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
f810: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
f820: 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61  d, r3, 1, r2, &a
f830: 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
f840: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
f850: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
f860: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33  hange(pParse, r3
f870: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
f880: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f890: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
f8a0: 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
f8b0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 7d  , r2);.        }
f8c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f8d0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
f8e0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
f8f0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
f900: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
f910: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
f920: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f930: 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
f940: 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e  , (void *)&keyIn
f950: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
f960: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f970: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
f980: 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
f990: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
f9a0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 73       /* This has
f9b0: 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20   to be a scalar 
f9c0: 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74  SELECT.  Generat
f9d0: 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68  e code to put th
f9e0: 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65  e.      ** value
f9f0: 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74 20   of this select 
fa00: 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  in a memory cell
fa10: 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20   and record the 
fa20: 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20  number.      ** 
fa30: 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  of the memory ce
fa40: 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20  ll in iColumn.. 
fa50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
fa60: 61 74 69 63 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  atic const Token
fa70: 20 6f 6e 65 20 3d 20 7b 20 28 75 38 2a 29 22 31   one = { (u8*)"1
fa80: 22 2c 20 30 2c 20 31 20 7d 3b 0a 20 20 20 20 20  ", 0, 1 };.     
fa90: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20   Select *pSel;. 
faa0: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
fab0: 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 70 53 65  dest;..      pSe
fac0: 6c 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  l = pExpr->pSele
fad0: 63 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ct;.      sqlite
fae0: 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
faf0: 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72  &dest, 0, ++pPar
fb00: 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20  se->nMem);.     
fb10: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
fb20: 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
fb30: 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20       dest.eDest 
fb40: 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20  = SRT_Mem;.     
fb50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fb60: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
fb70: 20 30 2c 20 64 65 73 74 2e 69 50 61 72 6d 29 3b   0, dest.iParm);
fb80: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
fb90: 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73  ment((v, "Init s
fba0: 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
fbb0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
fbc0: 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
fbd0: 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b  st = SRT_Exists;
fbe0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
fbf0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fc00: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73  _Integer, 0, des
fc10: 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  t.iParm);.      
fc20: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
fc30: 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72  , "Init EXISTS r
fc40: 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
fc50: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
fc60: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
fc70: 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d  ->db, pSel->pLim
fc80: 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d  it);.      pSel-
fc90: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
fca0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
fcb0: 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c  K_INTEGER, 0, 0,
fcc0: 20 26 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69 66   &one);.      if
fcd0: 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
fce0: 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64  pParse, pSel, &d
fcf0: 65 73 74 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b  est, 0, 0, 0) ){
fd00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
fd10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
fd20: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
fd30: 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20  dest.iParm;.    
fd40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
fd50: 20 7d 0a 0a 20 20 69 66 28 20 74 65 73 74 41 64   }..  if( testAd
fd60: 64 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  dr ){.    sqlite
fd70: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
fd80: 20 74 65 73 74 41 64 64 72 2d 31 29 3b 0a 20 20   testAddr-1);.  
fd90: 7d 0a 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23  }..  return;.}.#
fda0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
fdb0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
fdc0: 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74  ../*.** Duplicat
fdd0: 65 20 61 6e 20 38 2d 62 79 74 65 20 76 61 6c 75  e an 8-byte valu
fde0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  e.*/.static char
fdf0: 20 2a 64 75 70 38 62 79 74 65 73 28 56 64 62 65   *dup8bytes(Vdbe
fe00: 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
fe10: 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 6f 75  *in){.  char *ou
fe20: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
fe30: 6c 6f 63 52 61 77 28 73 71 6c 69 74 65 33 56 64  locRaw(sqlite3Vd
fe40: 62 65 44 62 28 76 29 2c 20 38 29 3b 0a 20 20 69  beDb(v), 8);.  i
fe50: 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 6d 65  f( out ){.    me
fe60: 6d 63 70 79 28 6f 75 74 2c 20 69 6e 2c 20 38 29  mcpy(out, in, 8)
fe70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f  ;.  }.  return o
fe80: 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ut;.}../*.** Gen
fe90: 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
fea0: 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
feb0: 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20  ut the floating 
fec0: 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64  point.** value d
fed0: 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e  escribed by z[0.
fee0: 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73  .n-1] into regis
fef0: 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ter iMem..**.** 
ff00: 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77  The z[] string w
ff10: 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74  ill probably not
ff20: 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61   be zero-termina
ff30: 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a  ted.  But the .*
ff40: 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72  * z[n] character
ff50: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
ff60: 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74  o be something t
ff70: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f  hat does not loo
ff80: 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f  k.** like the co
ff90: 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68  ntinuation of th
ffa0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61  e number..*/.sta
ffb0: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61  tic void codeRea
ffc0: 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74  l(Vdbe *v, const
ffd0: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c   char *z, int n,
ffe0: 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c   int negateFlag,
fff0: 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 61 73   int iMem){.  as
10000 73 65 72 74 28 20 7a 20 7c 7c 20 76 3d 3d 30 20  sert( z || v==0 
10010 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 44 62  || sqlite3VdbeDb
10020 28 76 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  (v)->mallocFaile
10030 64 20 29 3b 0a 20 20 69 66 28 20 7a 20 29 7b 0a  d );.  if( z ){.
10040 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65      double value
10050 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a  ;.    char *zV;.
10060 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 64      assert( !isd
10070 69 67 69 74 28 7a 5b 6e 5d 29 20 29 3b 0a 20 20  igit(z[n]) );.  
10080 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c    sqlite3AtoF(z,
10090 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66   &value);.    if
100a0 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76  ( sqlite3IsNaN(v
100b0 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 20 20 73  alue) ){.      s
100c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
100d0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
100e0 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iMem);.    }else
100f0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 61  {.      if( nega
10100 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d  teFlag ) value =
10110 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7a   -value;.      z
10120 56 20 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c  V = dup8bytes(v,
10130 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b   (char*)&value);
10140 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10150 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 52  beAddOp4(v, OP_R
10160 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c  eal, 0, iMem, 0,
10170 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20   zV, P4_REAL);. 
10180 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a     }.  }.}.../*.
10190 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
101a0 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
101b0 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74  will put the int
101c0 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79  eger describe by
101d0 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d  .** text z[0..n-
101e0 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  1] into register
101f0 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   iMem..**.** The
10200 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c   z[] string will
10210 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65   probably not be
10220 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
10230 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a  .  But the .** z
10240 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73  [n] character is
10250 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
10260 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  e something that
10270 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a   does not look.*
10280 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69  * like the conti
10290 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  nuation of the n
102a0 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
102b0 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65   void codeIntege
102c0 72 28 56 64 62 65 20 2a 76 2c 20 45 78 70 72 20  r(Vdbe *v, Expr 
102d0 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46  *pExpr, int negF
102e0 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
102f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
10300 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
10310 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
10320 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  e ){.    int i =
10330 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
10340 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
10350 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71  ) i = -i;.    sq
10360 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10370 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
10380 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65  , iMem);.  }else
10390 20 69 66 28 20 28 7a 20 3d 20 28 63 68 61 72 2a   if( (z = (char*
103a0 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29  )pExpr->token.z)
103b0 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  !=0 ){.    int i
103c0 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45  ;.    int n = pE
103d0 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20  xpr->token.n;.  
103e0 20 20 61 73 73 65 72 74 28 20 21 69 73 64 69 67    assert( !isdig
103f0 69 74 28 7a 5b 6e 5d 29 20 29 3b 0a 20 20 20 20  it(z[n]) );.    
10400 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e  if( sqlite3GetIn
10410 74 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20  t32(z, &i) ){.  
10420 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
10430 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 20 20  ) i = -i;.      
10440 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10450 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
10460 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d   i, iMem);.    }
10470 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
10480 46 69 74 73 49 6e 36 34 42 69 74 73 28 7a 2c 20  FitsIn64Bits(z, 
10490 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20  negFlag) ){.    
104a0 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20    i64 value;.   
104b0 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20     char *zV;.   
104c0 20 20 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34     sqlite3Atoi64
104d0 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20  (z, &value);.   
104e0 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
104f0 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b   value = -value;
10500 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38  .      zV = dup8
10510 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29  bytes(v, (char*)
10520 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73  &value);.      s
10530 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
10540 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c  (v, OP_Int64, 0,
10550 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34   iMem, 0, zV, P4
10560 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c  _INT64);.    }el
10570 73 65 7b 0a 20 20 20 20 20 20 63 6f 64 65 52 65  se{.      codeRe
10580 61 6c 28 76 2c 20 7a 2c 20 6e 2c 20 6e 65 67 46  al(v, z, n, negF
10590 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  lag, iMem);.    
105a0 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  }.  }.}.../*.** 
105b0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
105c0 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
105d0 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
105e0 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61  olumn from.** ta
105f0 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f  ble pTab and sto
10600 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  re the column va
10610 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73 74 65  lue in a registe
10620 72 2e 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a  r.  An effort.**
10630 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72   is made to stor
10640 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  e the column val
10650 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ue in register i
10660 52 65 67 2c 20 62 75 74 20 74 68 69 73 20 69 73  Reg, but this is
10670 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74 65  .** not guarante
10680 65 64 2e 20 20 54 68 65 20 6c 6f 63 61 74 69 6f  ed.  The locatio
10690 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  n of the column 
106a0 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65  value is returne
106b0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  d..**.** There m
106c0 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63  ust be an open c
106d0 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e  ursor to pTab in
106e0 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69   iTable when thi
106f0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
10700 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c  called.  If iCol
10710 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20  umn<0 then code 
10720 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61  is generated tha
10730 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72  t extracts the r
10740 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  owid..**.** This
10750 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 61   routine might a
10760 74 74 65 6d 70 74 20 74 6f 20 72 65 75 73 65 20  ttempt to reuse 
10770 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
10780 20 63 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a 20   column that.** 
10790 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
107a0 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 61 20 72   loaded into a r
107b0 65 67 69 73 74 65 72 2e 20 20 54 68 65 20 76 61  egister.  The va
107c0 6c 75 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 0a  lue will always.
107d0 2a 2a 20 62 65 20 75 73 65 64 20 69 66 20 69 74  ** be used if it
107e0 20 68 61 73 20 6e 6f 74 20 75 6e 64 65 72 67 6f   has not undergo
107f0 6e 65 20 61 6e 79 20 61 66 66 69 6e 69 74 79 20  ne any affinity 
10800 63 68 61 6e 67 65 73 2e 20 20 42 75 74 20 69 66  changes.  But if
10810 0a 2a 2a 20 61 6e 20 61 66 66 69 6e 69 74 79 20  .** an affinity 
10820 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72  change has occur
10830 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 61  red, then the ca
10840 63 68 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20  ched value will 
10850 6f 6e 6c 79 20 62 65 0a 2a 2a 20 75 73 65 64 20  only be.** used 
10860 69 66 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67 20  if allowAffChng 
10870 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20  is true..*/.int 
10880 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
10890 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  etColumn(.  Pars
108a0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
108b0 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
108c0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
108d0 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
108e0 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
108f0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
10900 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
10910 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
10920 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
10930 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
10940 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
10950 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
10960 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
10970 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
10980 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
10990 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  iReg,        /* 
109a0 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
109b0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 61 6c 6c 6f  re */.  int allo
109c0 77 41 66 66 43 68 6e 67 20 2f 2a 20 54 72 75 65  wAffChng /* True
109d0 20 69 66 20 70 72 69 6f 72 20 61 66 66 69 6e 69   if prior affini
109e0 74 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 4f  ty changes are O
109f0 4b 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  K */.){.  Vdbe *
10a00 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
10a10 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
10a20 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
10a30 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  p;..  for(i=0, p
10a40 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
10a50 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  he; i<pParse->nC
10a60 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b  olCache; i++, p+
10a70 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
10a80 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26  Table==iTable &&
10a90 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f   p->iColumn==iCo
10aa0 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 20 20  lumn.           
10ab0 26 26 20 28 21 70 2d 3e 61 66 66 43 68 61 6e 67  && (!p->affChang
10ac0 65 20 7c 7c 20 61 6c 6c 6f 77 41 66 66 43 68 6e  e || allowAffChn
10ad0 67 29 20 29 7b 0a 23 69 66 20 30 0a 20 20 20 20  g) ){.#if 0.    
10ae0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10af0 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b  Op0(v, OP_Noop);
10b00 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
10b10 6e 74 28 28 76 2c 20 22 4f 50 54 3a 20 74 61 62  nt((v, "OPT: tab
10b20 25 64 2e 63 6f 6c 25 64 20 2d 3e 20 72 25 64 22  %d.col%d -> r%d"
10b30 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
10b40 6e 2c 20 70 2d 3e 69 52 65 67 29 29 3b 0a 23 65  n, p->iReg));.#e
10b50 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72  ndif.      retur
10b60 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d  n p->iReg;.    }
10b70 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28  .  }  .  assert(
10b80 20 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69   v!=0 );.  if( i
10b90 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
10ba0 69 6e 74 20 6f 70 20 3d 20 28 70 54 61 62 20 26  int op = (pTab &
10bb0 26 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  & IsVirtual(pTab
10bc0 29 29 20 3f 20 4f 50 5f 56 52 6f 77 69 64 20 3a  )) ? OP_VRowid :
10bd0 20 4f 50 5f 52 6f 77 69 64 3b 0a 20 20 20 20 73   OP_Rowid;.    s
10be0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10bf0 28 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20  (v, op, iTable, 
10c00 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69  iReg);.  }else i
10c10 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
10c20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10c30 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
10c40 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
10c50 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73  n, iReg);.  }els
10c60 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  e{.    int op = 
10c70 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
10c80 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f  ? OP_VColumn : O
10c90 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  P_Column;.    sq
10ca0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
10cb0 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69  v, op, iTable, i
10cc0 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
10cd0 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
10ce0 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c  Default(v, pTab,
10cf0 20 69 43 6f 6c 75 6d 6e 29 3b 0a 23 69 66 6e 64   iColumn);.#ifnd
10d00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
10d10 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
10d20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c    if( pTab->aCol
10d30 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  [iColumn].affini
10d40 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ty==SQLITE_AFF_R
10d50 45 41 4c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  EAL ){.      sql
10d60 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10d70 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  , OP_RealAffinit
10d80 79 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 0a  y, iReg);.    }.
10d90 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28  #endif.  }.  if(
10da0 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
10db0 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20  ColCache==0 ){. 
10dc0 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69     i = pParse->i
10dd0 43 6f 6c 43 61 63 68 65 3b 0a 20 20 20 20 70 20  ColCache;.    p 
10de0 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43  = &pParse->aColC
10df0 61 63 68 65 5b 69 5d 3b 0a 20 20 20 20 70 2d 3e  ache[i];.    p->
10e00 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b  iTable = iTable;
10e10 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20  .    p->iColumn 
10e20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  = iColumn;.    p
10e30 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ->iReg = iReg;. 
10e40 20 20 20 70 2d 3e 61 66 66 43 68 61 6e 67 65 20     p->affChange 
10e50 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  = 0;.    i++;.  
10e60 20 20 69 66 28 20 69 3e 3d 41 72 72 61 79 53 69    if( i>=ArraySi
10e70 7a 65 28 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43  ze(pParse->aColC
10e80 61 63 68 65 29 20 29 20 69 20 3d 20 30 3b 0a 20  ache) ) i = 0;. 
10e90 20 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d     if( i>pParse-
10ea0 3e 6e 43 6f 6c 43 61 63 68 65 20 29 20 70 50 61  >nColCache ) pPa
10eb0 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 3d  rse->nColCache =
10ec0 20 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   i;.    pParse->
10ed0 69 43 6f 6c 43 61 63 68 65 20 3d 20 69 3b 0a 20  iColCache = i;. 
10ee0 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67   }.  return iReg
10ef0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
10f00 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68   all column cach
10f10 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69  e entries associ
10f20 61 74 65 64 20 77 69 74 68 20 74 68 65 20 76 64  ated with the vd
10f30 62 65 0a 2a 2a 20 63 75 72 73 6f 72 20 77 69 74  be.** cursor wit
10f40 68 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  h cursor number 
10f50 69 54 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  iTable..*/.void 
10f60 73 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72  sqlite3ExprClear
10f70 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73  ColumnCache(Pars
10f80 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
10f90 54 61 62 6c 65 29 7b 0a 20 20 69 66 28 20 69 54  Table){.  if( iT
10fa0 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 70 50  able<0 ){.    pP
10fb0 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20  arse->nColCache 
10fc0 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  = 0;.    pParse-
10fd0 3e 69 43 6f 6c 43 61 63 68 65 20 3d 20 30 3b 0a  >iColCache = 0;.
10fe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
10ff0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
11000 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43   i<pParse->nColC
11010 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ache; i++){.    
11020 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43    if( pParse->aC
11030 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 54 61 62 6c  olCache[i].iTabl
11040 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  e==iTable ){.   
11050 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
11060 3d 3d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  ==pParse->nColCa
11070 63 68 65 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  che-1 );.       
11080 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
11090 68 65 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e  he[i] = pParse->
110a0 61 43 6f 6c 43 61 63 68 65 5b 2d 2d 70 50 61 72  aColCache[--pPar
110b0 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a  se->nColCache];.
110c0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
110d0 69 43 6f 6c 43 61 63 68 65 20 3d 20 70 50 61 72  iColCache = pPar
110e0 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 20  se->nColCache;. 
110f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11100 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  .}../*.** Record
11110 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61   the fact that a
11120 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67  n affinity chang
11130 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f  e has occurred o
11140 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69  n iCount.** regi
11150 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77  sters starting w
11160 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76  ith iStart..*/.v
11170 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
11180 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
11190 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
111a0 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e  , int iStart, in
111b0 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 69 6e 74  t iCount){.  int
111c0 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b   iEnd = iStart +
111d0 20 69 43 6f 75 6e 74 20 2d 20 31 3b 0a 20 20 69   iCount - 1;.  i
111e0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
111f0 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43   i<pParse->nColC
11200 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ache; i++){.    
11210 69 6e 74 20 72 20 3d 20 70 50 61 72 73 65 2d 3e  int r = pParse->
11220 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65  aColCache[i].iRe
11230 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 53  g;.    if( r>=iS
11240 74 61 72 74 20 26 26 20 72 3c 3d 69 45 6e 64 20  tart && r<=iEnd 
11250 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
11260 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 61 66  >aColCache[i].af
11270 66 43 68 61 6e 67 65 20 3d 20 31 3b 0a 20 20 20  fChange = 1;.   
11280 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
11290 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
112a0 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66 72   move content fr
112b0 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69 46 72  om registers iFr
112c0 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d  om...iFrom+nReg-
112d0 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f  1.** over to iTo
112e0 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65  ..iTo+nReg-1. Ke
112f0 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ep the column ca
11300 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a  che up-to-date..
11310 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
11320 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72 73  xprCodeMove(Pars
11330 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
11340 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69  From, int iTo, i
11350 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
11360 69 3b 0a 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d  i;.  if( iFrom==
11370 69 54 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  iTo ) return;.  
11380 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11390 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  3(pParse->pVdbe,
113a0 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c   OP_Move, iFrom,
113b0 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 66   iTo, nReg);.  f
113c0 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
113d0 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
113e0 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70  ){.    int x = p
113f0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
11400 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 69 66  [i].iReg;.    if
11410 28 20 78 3e 3d 69 46 72 6f 6d 20 26 26 20 78 3c  ( x>=iFrom && x<
11420 69 46 72 6f 6d 2b 6e 52 65 67 20 29 7b 0a 20 20  iFrom+nReg ){.  
11430 20 20 20 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c      pParse->aCol
11440 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 20 2b 3d  Cache[i].iReg +=
11450 20 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20 20 20 20   iTo-iFrom;.    
11460 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
11470 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
11480 63 6f 70 79 20 63 6f 6e 74 65 6e 74 20 66 72 6f  copy content fro
11490 6d 20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f  m registers iFro
114a0 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31  m...iFrom+nReg-1
114b0 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e  .** over to iTo.
114c0 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a  .iTo+nReg-1..*/.
114d0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
114e0 43 6f 64 65 43 6f 70 79 28 50 61 72 73 65 20 2a  CodeCopy(Parse *
114f0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
11500 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20  m, int iTo, int 
11510 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nReg){.  int i;.
11520 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 69 54 6f    if( iFrom==iTo
11530 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
11540 28 69 3d 30 3b 20 69 3c 6e 52 65 67 3b 20 69 2b  (i=0; i<nReg; i+
11550 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
11560 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
11570 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79  ->pVdbe, OP_Copy
11580 2c 20 69 46 72 6f 6d 2b 69 2c 20 69 54 6f 2b 69  , iFrom+i, iTo+i
11590 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
115a0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
115b0 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 74  ny register in t
115c0 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e  he range iFrom..
115d0 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a  iTo (inclusive).
115e0 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20 70 61  ** is used as pa
115f0 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  rt of the column
11600 20 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69   cache..*/.stati
11610 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75  c int usedAsColu
11620 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  mnCache(Parse *p
11630 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
11640 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e  , int iTo){.  in
11650 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
11660 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
11670 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  che; i++){.    i
11680 6e 74 20 72 20 3d 20 70 50 61 72 73 65 2d 3e 61  nt r = pParse->a
11690 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67  ColCache[i].iReg
116a0 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72  ;.    if( r>=iFr
116b0 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72  om && r<=iTo ) r
116c0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
116d0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
116e0 2a 20 54 68 65 72 65 73 20 69 73 20 61 20 76 61  * Theres is a va
116f0 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
11700 69 43 75 72 72 65 6e 74 2e 20 20 57 65 20 75 6c  iCurrent.  We ul
11710 74 69 6d 61 74 65 6c 79 20 77 61 6e 74 0a 2a 2a  timately want.**
11720 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65   the value to be
11730 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 54 61   in register iTa
11740 72 67 65 74 2e 20 20 49 74 20 6d 69 67 68 74 20  rget.  It might 
11750 62 65 20 74 68 61 74 0a 2a 2a 20 69 43 75 72 72  be that.** iCurr
11760 65 6e 74 20 61 6e 64 20 69 54 61 72 67 65 74 20  ent and iTarget 
11770 61 72 65 20 74 68 65 20 73 61 6d 65 20 72 65 67  are the same reg
11780 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  ister..**.** We 
11790 61 72 65 20 67 6f 69 6e 67 20 74 6f 20 6d 6f 64  are going to mod
117a0 69 66 79 20 74 68 65 20 76 61 6c 75 65 2c 20 73  ify the value, s
117b0 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b  o we need to mak
117c0 65 20 73 75 72 65 20 69 74 0a 2a 2a 20 69 73 20  e sure it.** is 
117d0 6e 6f 74 20 61 20 63 61 63 68 65 64 20 72 65 67  not a cached reg
117e0 69 73 74 65 72 2e 20 20 49 66 20 69 43 75 72 72  ister.  If iCurr
117f0 65 6e 74 20 69 73 20 61 20 63 61 63 68 65 64 20  ent is a cached 
11800 72 65 67 69 73 74 65 72 2c 0a 2a 2a 20 74 68 65  register,.** the
11810 6e 20 74 72 79 20 74 6f 20 6d 6f 76 65 20 74 68  n try to move th
11820 65 20 76 61 6c 75 65 20 6f 76 65 72 20 74 6f 20  e value over to 
11830 69 54 61 72 67 65 74 2e 20 20 49 66 20 69 54 61  iTarget.  If iTa
11840 72 67 65 74 20 69 73 20 61 0a 2a 2a 20 63 61 63  rget is a.** cac
11850 68 65 64 20 72 65 67 69 73 74 65 72 2c 20 74 68  hed register, th
11860 65 6e 20 63 6c 65 61 72 20 74 68 65 20 63 6f 72  en clear the cor
11870 72 65 73 70 6f 6e 64 69 6e 67 20 63 61 63 68 65  responding cache
11880 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   line..**.** Ret
11890 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
118a0 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
118b0 65 6e 64 73 20 75 70 20 69 6e 2e 0a 2a 2f 0a 69  ends up in..*/.i
118c0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 57 72  nt sqlite3ExprWr
118d0 69 74 61 62 6c 65 52 65 67 69 73 74 65 72 28 50  itableRegister(P
118e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
118f0 74 20 69 43 75 72 72 65 6e 74 2c 20 69 6e 74 20  t iCurrent, int 
11900 69 54 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20  iTarget){.  int 
11910 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  i;.  assert( pPa
11920 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b  rse->pVdbe!=0 );
11930 0a 20 20 69 66 28 20 21 75 73 65 64 41 73 43 6f  .  if( !usedAsCo
11940 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
11950 2c 20 69 43 75 72 72 65 6e 74 2c 20 69 43 75 72  , iCurrent, iCur
11960 72 65 6e 74 29 20 29 7b 0a 20 20 20 20 72 65 74  rent) ){.    ret
11970 75 72 6e 20 69 43 75 72 72 65 6e 74 3b 0a 20 20  urn iCurrent;.  
11980 7d 0a 20 20 69 66 28 20 69 43 75 72 72 65 6e 74  }.  if( iCurrent
11990 21 3d 69 54 61 72 67 65 74 20 29 7b 0a 20 20 20  !=iTarget ){.   
119a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
119b0 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
119c0 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 43 75 72  , OP_SCopy, iCur
119d0 72 65 6e 74 2c 20 69 54 61 72 67 65 74 29 3b 0a  rent, iTarget);.
119e0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
119f0 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  <pParse->nColCac
11a00 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  he; i++){.    if
11a10 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  ( pParse->aColCa
11a20 63 68 65 5b 69 5d 2e 69 52 65 67 3d 3d 69 54 61  che[i].iReg==iTa
11a30 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 70 50  rget ){.      pP
11a40 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
11a50 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f  i] = pParse->aCo
11a60 6c 43 61 63 68 65 5b 2d 2d 70 50 61 72 73 65 2d  lCache[--pParse-
11a70 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a 20 20 20  >nColCache];.   
11a80 20 20 20 70 50 61 72 73 65 2d 3e 69 43 6f 6c 43     pParse->iColC
11a90 61 63 68 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  ache = pParse->n
11aa0 43 6f 6c 43 61 63 68 65 3b 0a 20 20 20 20 7d 0a  ColCache;.    }.
11ab0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 54 61    }.  return iTa
11ac0 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rget;.}../*.** I
11ad0 66 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74 72  f the last instr
11ae0 75 63 74 69 6f 6e 20 63 6f 64 65 64 20 69 73 20  uction coded is 
11af0 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 63 6f 70  an ephemeral cop
11b00 79 20 6f 66 20 61 6e 79 20 6f 66 0a 2a 2a 20 74  y of any of.** t
11b10 68 65 20 72 65 67 69 73 74 65 72 73 20 69 6e 20  he registers in 
11b20 74 68 65 20 6e 52 65 67 20 72 65 67 69 73 74 65  the nReg registe
11b30 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  rs beginning wit
11b40 68 20 69 52 65 67 2c 20 74 68 65 6e 0a 2a 2a 20  h iReg, then.** 
11b50 63 6f 6e 76 65 72 74 20 74 68 65 20 6c 61 73 74  convert the last
11b60 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 72 6f   instruction fro
11b70 6d 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 4f 50  m OP_SCopy to OP
11b80 5f 43 6f 70 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  _Copy..*/.void s
11b90 71 6c 69 74 65 33 45 78 70 72 48 61 72 64 43 6f  qlite3ExprHardCo
11ba0 70 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  py(Parse *pParse
11bb0 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
11bc0 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 61 64 64  nReg){.  int add
11bd0 72 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  r;.  VdbeOp *pOp
11be0 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
11bf0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
11c00 65 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  e;.  addr = sqli
11c10 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
11c20 64 72 28 76 29 3b 0a 20 20 70 4f 70 20 3d 20 73  dr(v);.  pOp = s
11c30 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
11c40 76 2c 20 61 64 64 72 2d 31 29 3b 0a 20 20 61 73  v, addr-1);.  as
11c50 73 65 72 74 28 20 70 4f 70 20 7c 7c 20 70 50 61  sert( pOp || pPa
11c60 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
11c70 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
11c80 4f 70 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64  Op && pOp->opcod
11c90 65 3d 3d 4f 50 5f 53 43 6f 70 79 20 26 26 20 70  e==OP_SCopy && p
11ca0 4f 70 2d 3e 70 31 3e 3d 69 52 65 67 20 26 26 20  Op->p1>=iReg && 
11cb0 70 4f 70 2d 3e 70 31 3c 69 52 65 67 2b 6e 52 65  pOp->p1<iReg+nRe
11cc0 67 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70  g ){.    pOp->op
11cd0 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a  code = OP_Copy;.
11ce0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
11cf0 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
11d00 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65  the current Vdbe
11d10 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
11d20 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
11d30 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74  sion.  Attempt t
11d40 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
11d50 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
11d60 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74  "target"..** Ret
11d70 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
11d80 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61   where results a
11d90 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
11da0 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69   With this routi
11db0 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ne, there is no 
11dc0 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
11dd0 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20  results will.** 
11de0 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72  be stored in tar
11df0 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
11e00 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64   might be stored
11e10 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   in some other.*
11e20 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74  * register if it
11e30 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74   is convenient t
11e40 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61  o do so.  The ca
11e50 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
11e60 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65  * must check the
11e70 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64   return code and
11e80 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74   move the result
11e90 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64  s to the desired
11ea0 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f  .** register..*/
11eb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
11ec0 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73 65  CodeTarget(Parse
11ed0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
11ee0 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
11ef0 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  t){.  Vdbe *v = 
11f00 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
11f10 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20  /* The VM under 
11f20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
11f30 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
11f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11f50 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20  he opcode being 
11f60 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  coded */.  int i
11f70 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20  nReg = target;  
11f80 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20       /* Results 
11f90 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
11fa0 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e  er inReg */.  in
11fb0 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20  t regFree1 = 0; 
11fc0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
11fd0 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73  n-zero free this
11fe0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
11ff0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
12000 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20  Free2 = 0;      
12010 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
12020 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70  o free this temp
12030 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a  orary register *
12040 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20  /.  int r1, r2, 
12050 72 33 2c 20 72 34 3b 20 20 20 20 20 20 20 2f 2a  r3, r4;       /*
12060 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74 65   Various registe
12070 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20  r numbers */..  
12080 61 73 73 65 72 74 28 20 76 21 3d 30 20 7c 7c 20  assert( v!=0 || 
12090 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
120a0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73  ocFailed );.  as
120b0 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26  sert( target>0 &
120c0 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65  & target<=pParse
120d0 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20  ->nMem );.  if( 
120e0 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  v==0 ) return 0;
120f0 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
12100 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f   ){.    op = TK_
12110 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NULL;.  }else{. 
12120 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f     op = pExpr->o
12130 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  p;.  }.  switch(
12140 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
12150 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b  TK_AGG_COLUMN: {
12160 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a  .      AggInfo *
12170 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72  pAggInfo = pExpr
12180 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  ->pAggInfo;.    
12190 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
121a0 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41  _col *pCol = &pA
121b0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78  ggInfo->aCol[pEx
121c0 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20  pr->iAgg];.     
121d0 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e   if( !pAggInfo->
121e0 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20  directMode ){.  
121f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
12200 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20  ol->iMem>0 );.  
12210 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 43        inReg = pC
12220 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  ol->iMem;.      
12230 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
12240 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e 66  else if( pAggInf
12250 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  o->useSortingIdx
12260 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
12270 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
12280 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67   OP_Column, pAgg
12290 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78  Info->sortingIdx
122a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
122b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122c0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
122d0 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  umn, target);.  
122e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
122f0 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74     }.      /* Ot
12300 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68  herwise, fall th
12310 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43  ru into the TK_C
12320 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20  OLUMN case */.  
12330 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
12340 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
12350 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
12360 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  e<0 ){.        /
12370 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  * This only happ
12380 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e 67 20  ens when coding 
12390 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74  check constraint
123a0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  s */.        ass
123b0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63 6b 42  ert( pParse->ckB
123c0 61 73 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  ase>0 );.       
123d0 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e   inReg = pExpr->
123e0 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65  iColumn + pParse
123f0 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20  ->ckBase;.      
12400 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
12410 65 73 74 63 61 73 65 28 20 28 70 45 78 70 72 2d  estcase( (pExpr-
12420 3e 66 6c 61 67 73 20 26 20 45 50 5f 41 6e 79 41  >flags & EP_AnyA
12430 66 66 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ff)!=0 );.      
12440 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
12450 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
12460 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mn(pParse, pExpr
12470 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ->pTab,.        
12480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12490 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
124a0 69 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e  iColumn, pExpr->
124b0 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 2c 0a  iTable, target,.
124c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124e0 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
124f0 45 50 5f 41 6e 79 41 66 66 29 3b 0a 20 20 20 20  EP_AnyAff);.    
12500 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
12510 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
12520 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
12530 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
12540 76 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72  v, pExpr, 0, tar
12550 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
12560 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
12570 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
12580 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
12590 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
125a0 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
125b0 6b 65 6e 2e 6e 2c 20 30 2c 20 74 61 72 67 65 74  ken.n, 0, target
125c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
125d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
125e0 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
125f0 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
12600 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c  Expr(pParse->db,
12610 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73   pExpr);.      s
12620 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
12630 28 76 2c 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  (v,OP_String8, 0
12640 2c 20 74 61 72 67 65 74 2c 20 30 2c 0a 20 20 20  , target, 0,.   
12650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12660 20 20 20 20 20 28 63 68 61 72 2a 29 70 45 78 70       (char*)pExp
12670 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
12680 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20  r->token.n);.   
12690 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
126a0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
126b0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
126c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
126d0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
126e0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
126f0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
12700 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f  QLITE_OMIT_BLOB_
12710 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65  LITERAL.    case
12720 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
12730 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63    int n;.      c
12740 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
12750 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b      char *zBlob;
12760 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12770 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 3d 33  Expr->token.n>=3
12780 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12790 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  ( pExpr->token.z
127a0 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70  [0]=='x' || pExp
127b0 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27  r->token.z[0]=='
127c0 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  X' );.      asse
127d0 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  rt( pExpr->token
127e0 2e 7a 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20  .z[1]=='\'' );. 
127f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
12800 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 70 45 78 70  pr->token.z[pExp
12810 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31 5d 3d 3d 27  r->token.n-1]=='
12820 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d  \'' );.      n =
12830 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20   pExpr->token.n 
12840 2d 20 33 3b 0a 20 20 20 20 20 20 7a 20 3d 20 28  - 3;.      z = (
12850 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
12860 65 6e 2e 7a 20 2b 20 32 3b 0a 20 20 20 20 20 20  en.z + 2;.      
12870 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48  zBlob = sqlite3H
12880 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33  exToBlob(sqlite3
12890 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29  VdbeDb(v), z, n)
128a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
128b0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
128c0 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65  Blob, n/2, targe
128d0 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f  t, 0, zBlob, P4_
128e0 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
128f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
12900 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
12910 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
12920 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12930 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61 62  Op2(v, OP_Variab
12940 6c 65 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  le, pExpr->iTabl
12950 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  e, target);.    
12960 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
12970 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20 20 20 20 20  en.n>1 ){.      
12980 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
12990 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
129a0 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
129b0 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
129c0 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  .n);.      }.   
129d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
129e0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
129f0 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  STER: {.      in
12a00 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  Reg = pExpr->iTa
12a10 62 6c 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ble;.      break
12a20 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
12a30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
12a40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
12a50 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78  T: {.      /* Ex
12a60 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
12a70 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c   form:   CAST(pL
12a80 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f  eft AS token) */
12a90 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20  .      int aff, 
12aa0 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 52  to_op;.      inR
12ab0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
12ac0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
12ad0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
12ae0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
12af0 61 66 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66  aff = sqlite3Aff
12b00 69 6e 69 74 79 54 79 70 65 28 26 70 45 78 70 72  inityType(&pExpr
12b10 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
12b20 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51  to_op = aff - SQ
12b30 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20  LITE_AFF_TEXT + 
12b40 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20  OP_ToText;.     
12b50 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
12b60 4f 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20  OP_ToText    || 
12b70 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
12b80 54 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20  TEXT    );.     
12b90 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
12ba0 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20  OP_ToBlob    || 
12bb0 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
12bc0 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20  NONE    );.     
12bd0 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
12be0 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20  OP_ToNumeric || 
12bf0 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
12c00 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20  NUMERIC );.     
12c10 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
12c20 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20  OP_ToInt     || 
12c30 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
12c40 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20  INTEGER );.     
12c50 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
12c60 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20  OP_ToReal    || 
12c70 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
12c80 52 45 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20  REAL    );.     
12c90 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70   testcase( to_op
12ca0 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 29 3b 0a 20  ==OP_ToText );. 
12cb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74       testcase( t
12cc0 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20  o_op==OP_ToBlob 
12cd0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
12ce0 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e  e( to_op==OP_ToN
12cf0 75 6d 65 72 69 63 20 29 3b 0a 20 20 20 20 20 20  umeric );.      
12d00 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
12d10 3d 4f 50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20 20  =OP_ToInt );.   
12d20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f     testcase( to_
12d30 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 29 3b  op==OP_ToReal );
12d40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12d50 62 65 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f  beAddOp1(v, to_o
12d60 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20  p, inReg);.     
12d70 20 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41   testcase( usedA
12d80 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61  sColumnCache(pPa
12d90 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65  rse, inReg, inRe
12da0 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g) );.      sqli
12db0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
12dc0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
12dd0 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20  e, inReg, 1);.  
12de0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12df0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12e00 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
12e10 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
12e20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
12e30 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
12e40 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
12e50 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
12e60 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
12e70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
12e80 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20  K_LT==OP_Lt );. 
12e90 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
12ea0 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20  LE==OP_Le );.   
12eb0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
12ec0 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20  ==OP_Gt );.     
12ed0 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
12ee0 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Ge );.      a
12ef0 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50  ssert( TK_EQ==OP
12f00 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Eq );.      ass
12f10 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  ert( TK_NE==OP_N
12f20 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
12f30 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29  ase( op==TK_LT )
12f40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
12f50 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20  ( op==TK_LE );. 
12f60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
12f70 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
12f80 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
12f90 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_GE );.      t
12fa0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
12fb0 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EQ );.      test
12fc0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20  case( op==TK_NE 
12fd0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
12fe0 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61  pareOperands(pPa
12ff0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
13000 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65  t, &r1, &regFree
13010 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
13020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13030 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67       pExpr->pRig
13040 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65  ht, &r2, &regFre
13050 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
13060 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
13070 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
13080 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
13090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130a0 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c    r1, r2, inReg,
130b0 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29   SQLITE_STOREP2)
130c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
130d0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
130e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
130f0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
13100 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13110 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
13120 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
13130 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
13140 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
13150 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65  K_STAR:.    case
13160 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63   TK_MINUS:.    c
13170 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20  ase TK_REM:.    
13180 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a  case TK_BITAND:.
13190 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
131a0 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
131b0 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54  LASH:.    case T
131c0 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61  K_LSHIFT:.    ca
131d0 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20  se TK_RSHIFT: . 
131e0 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
131f0 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
13200 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e  t( TK_AND==OP_An
13210 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
13220 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20  t( TK_OR==OP_Or 
13230 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13240 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64   TK_PLUS==OP_Add
13250 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
13260 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53  ( TK_MINUS==OP_S
13270 75 62 74 72 61 63 74 20 29 3b 0a 20 20 20 20 20  ubtract );.     
13280 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d   assert( TK_REM=
13290 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b  =OP_Remainder );
132a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
132b0 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74  K_BITAND==OP_Bit
132c0 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  And );.      ass
132d0 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f  ert( TK_BITOR==O
132e0 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20 20 20 20  P_BitOr );.     
132f0 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53   assert( TK_SLAS
13300 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a  H==OP_Divide );.
13310 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
13320 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _LSHIFT==OP_Shif
13330 74 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 61  tLeft );.      a
13340 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54  ssert( TK_RSHIFT
13350 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20  ==OP_ShiftRight 
13360 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13370 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43   TK_CONCAT==OP_C
13380 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20 20 20 74  oncat );.      t
13390 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
133a0 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73  AND );.      tes
133b0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52  tcase( op==TK_OR
133c0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
133d0 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20  se( op==TK_PLUS 
133e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
133f0 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20  e( op==TK_MINUS 
13400 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
13410 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b  e( op==TK_REM );
13420 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13430 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29   op==TK_BITAND )
13440 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13450 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29  ( op==TK_BITOR )
13460 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13470 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29  ( op==TK_SLASH )
13480 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13490 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20  ( op==TK_LSHIFT 
134a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
134b0 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54  e( op==TK_RSHIFT
134c0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
134d0 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41  se( op==TK_CONCA
134e0 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
134f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
13500 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
13510 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
13520 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
13530 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
13540 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
13550 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
13560 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71  Free2);.      sq
13570 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
13580 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74  v, op, r2, r1, t
13590 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65  arget);.      te
135a0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
135b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
135c0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
135d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
135e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
135f0 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
13600 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
13610 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
13620 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13630 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66  Left );.      if
13640 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
13650 46 4c 4f 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e  FLOAT || pLeft->
13660 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
13670 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  {.        if( pL
13680 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
13690 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  T ){.          c
136a0 6f 64 65 52 65 61 6c 28 76 2c 20 28 63 68 61 72  odeReal(v, (char
136b0 2a 29 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a  *)pLeft->token.z
136c0 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e  , pLeft->token.n
136d0 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
136e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
136f0 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67         codeInteg
13700 65 72 28 76 2c 20 70 4c 65 66 74 2c 20 31 2c 20  er(v, pLeft, 1, 
13710 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
13720 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
13730 20 20 20 20 20 20 20 20 72 65 67 46 72 65 65 31          regFree1
13740 20 3d 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47   = r1 = sqlite3G
13750 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
13760 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13770 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13780 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
13790 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  1);.        r2 =
137a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
137b0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
137c0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
137d0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73  ree2);.        s
137e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
137f0 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c  (v, OP_Subtract,
13800 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29   r2, r1, target)
13810 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
13820 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
13830 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13840 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
13850 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13860 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
13870 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  BITNOT:.    case
13880 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
13890 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e   assert( TK_BITN
138a0 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b  OT==OP_BitNot );
138b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
138c0 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b  K_NOT==OP_Not );
138d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
138e0 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29   op==TK_BITNOT )
138f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13900 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a  ( op==TK_NOT );.
13910 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
13920 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
13930 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
13940 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
13950 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
13960 65 28 20 69 6e 52 65 67 3d 3d 74 61 72 67 65 74  e( inReg==target
13970 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13980 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e  se( usedAsColumn
13990 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e  Cache(pParse, in
139a0 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20  Reg, inReg) );. 
139b0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
139c0 69 74 65 33 45 78 70 72 57 72 69 74 61 62 6c 65  ite3ExprWritable
139d0 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c  Register(pParse,
139e0 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
139f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13a00 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20  beAddOp1(v, op, 
13a10 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72  inReg);.      br
13a20 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
13a30 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
13a40 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
13a50 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
13a60 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65  addr;.      asse
13a70 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
13a80 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  P_IsNull );.    
13a90 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
13aa0 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
13ab0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13ac0 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
13ad0 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
13ae0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
13af0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ULL );.      sql
13b00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13b10 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
13b20 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
13b30 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
13b40 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
13b50 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
13b60 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
13b70 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
13b80 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
13b90 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
13ba0 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20  beAddOp1(v, op, 
13bb0 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
13bc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13bd0 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65  OP_AddImm, targe
13be0 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  t, -1);.      sq
13bf0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
13c00 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
13c10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13c20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
13c30 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
13c40 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20   AggInfo *pInfo 
13c50 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
13c60 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  o;.      if( pIn
13c70 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
13c80 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13c90 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
13ca0 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25   of aggregate: %
13cb0 54 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  T",.            
13cc0 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20  &pExpr->span);. 
13cd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13ce0 20 20 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66      inReg = pInf
13cf0 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e  o->aFunc[pExpr->
13d00 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20  iAgg].iMem;.    
13d10 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
13d20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
13d30 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20  TK_CONST_FUNC:. 
13d40 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
13d50 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
13d60 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
13d70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
13d80 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70     int nExpr = p
13d90 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
13da0 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46  xpr : 0;.      F
13db0 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20  uncDef *pDef;.  
13dc0 20 20 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20      int nId;.   
13dd0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
13de0 49 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f  Id;.      int co
13df0 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  nstMask = 0;.   
13e00 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
13e10 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
13e20 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  arse->db;.      
13e30 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  u8 enc = ENC(db)
13e40 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  ;.      CollSeq 
13e50 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 0a 20 20 20  *pColl = 0;..   
13e60 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
13e70 3d 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 20 29  =TK_CONST_FUNC )
13e80 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
13e90 28 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ( op==TK_FUNCTIO
13ea0 4e 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d  N );.      zId =
13eb0 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
13ec0 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49  oken.z;.      nI
13ed0 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  d = pExpr->token
13ee0 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  .n;.      pDef =
13ef0 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
13f00 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
13f10 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72   zId, nId, nExpr
13f20 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
13f30 20 61 73 73 65 72 74 28 20 70 44 65 66 21 3d 30   assert( pDef!=0
13f40 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
13f50 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  ist ){.        n
13f60 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  Expr = pList->nE
13f70 78 70 72 3b 0a 20 20 20 20 20 20 20 20 72 31 20  xpr;.        r1 
13f80 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
13f90 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45  Range(pParse, nE
13fa0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  xpr);.        sq
13fb0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
13fc0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
13fd0 69 73 74 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  ist, r1, 1);.   
13fe0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13ff0 20 20 6e 45 78 70 72 20 3d 20 72 31 20 3d 20 30    nExpr = r1 = 0
14000 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
14010 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
14020 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
14030 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65   /* Possibly ove
14040 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69  rload the functi
14050 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20  on if the first 
14060 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20  argument is.    
14070 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74    ** a virtual t
14080 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20  able column..   
14090 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
140a0 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  or infix functio
140b0 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20  ns (LIKE, GLOB, 
140c0 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43  REGEXP, and MATC
140d0 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  H) use the.     
140e0 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d   ** second argum
140f0 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72  ent, not the fir
14100 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d  st, as the argum
14110 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20  ent to test to. 
14120 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69       ** see if i
14130 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
14140 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
14150 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  .  This is done 
14160 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  because.      **
14170 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
14180 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74  d of infix funct
14190 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e  ions (the operan
141a0 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20  d we want to.   
141b0 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76     ** control ov
141c0 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20  erloading) ends 
141d0 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  up as the second
141e0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
141f0 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
14200 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73  on.  The express
14210 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69  ion "A glob B" i
14220 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
14230 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28  .      ** "glob(
14240 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74  B,A).  We want t
14250 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22  o use the A in "
14260 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73  A glob B" to tes
14270 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66  t.      ** for f
14280 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64  unction overload
14290 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65  ing.  But we use
142a0 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22   the B term in "
142b0 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20  glob(B,A)"..    
142c0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e    */.      if( n
142d0 45 78 70 72 3e 3d 32 20 26 26 20 28 70 45 78 70  Expr>=2 && (pExp
142e0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
142f0 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  fixFunc) ){.    
14300 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
14310 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
14320 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
14330 20 6e 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61   nExpr, pList->a
14340 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [1].pExpr);.    
14350 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 45 78 70    }else if( nExp
14360 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  r>0 ){.        p
14370 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
14380 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
14390 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 45 78 70  n(db, pDef, nExp
143a0 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r, pList->a[0].p
143b0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23  Expr);.      }.#
143c0 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28  endif.      for(
143d0 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20  i=0; i<nExpr && 
143e0 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<32; i++){.    
143f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
14400 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c  xprIsConstant(pL
14410 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
14420 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
14430 6e 73 74 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69  nstMask |= (1<<i
14440 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
14450 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e       if( pDef->n
14460 65 65 64 43 6f 6c 6c 53 65 71 20 26 26 20 21 70  eedCollSeq && !p
14470 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
14480 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
14490 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
144a0 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  rse, pList->a[i]
144b0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
144c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
144d0 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43   if( pDef->needC
144e0 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ollSeq ){.      
144f0 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
14500 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
14510 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20  b->pDfltColl; . 
14520 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14530 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
14540 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c  ollSeq, 0, 0, 0,
14550 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
14560 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
14570 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
14580 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
14590 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e  OP_Function, con
145a0 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72 67  stMask, r1, targ
145b0 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
145c0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
145d0 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43  r*)pDef, P4_FUNC
145e0 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  DEF);.      sqli
145f0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
14600 76 2c 20 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  v, nExpr);.     
14610 20 69 66 28 20 6e 45 78 70 72 20 29 7b 0a 20 20   if( nExpr ){.  
14620 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
14630 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
14640 61 72 73 65 2c 20 72 31 2c 20 6e 45 78 70 72 29  arse, r1, nExpr)
14650 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14660 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
14670 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
14680 50 61 72 73 65 2c 20 72 31 2c 20 6e 45 78 70 72  Parse, r1, nExpr
14690 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
146a0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
146b0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
146c0 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  RY.    case TK_E
146d0 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20  XISTS:.    case 
146e0 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
146f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14700 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20  =TK_EXISTS );.  
14710 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14720 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20  ==TK_SELECT );. 
14730 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
14740 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20  iColumn==0 ){.  
14750 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
14760 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
14770 65 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  e, pExpr, 0);.  
14780 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65      }.      inRe
14790 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  g = pExpr->iColu
147a0 6d 6e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  mn;.      break;
147b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
147c0 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
147d0 6e 74 20 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 30  nt rNotFound = 0
147e0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 4d 61 79  ;.      int rMay
147f0 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  HaveNull = 0;.  
14800 20 20 20 20 69 6e 74 20 6a 32 2c 20 6a 33 2c 20      int j2, j3, 
14810 6a 34 2c 20 6a 35 3b 0a 20 20 20 20 20 20 63 68  j4, j5;.      ch
14820 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  ar affinity;.   
14830 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 0a 20     int eType;.. 
14840 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d       VdbeNoopCom
14850 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20  ment((v, "begin 
14860 49 4e 20 65 78 70 72 20 72 25 64 22 2c 20 74 61  IN expr r%d", ta
14870 72 67 65 74 29 29 3b 0a 20 20 20 20 20 20 65 54  rget));.      eT
14880 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ype = sqlite3Fin
14890 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c  dInIndex(pParse,
148a0 20 70 45 78 70 72 2c 20 26 72 4d 61 79 48 61 76   pExpr, &rMayHav
148b0 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 69 66  eNull);.      if
148c0 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 29  ( rMayHaveNull )
148d0 7b 0a 20 20 20 20 20 20 20 20 72 4e 6f 74 46 6f  {.        rNotFo
148e0 75 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  und = ++pParse->
148f0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  nMem;.      }.. 
14900 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f       /* Figure o
14910 75 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  ut the affinity 
14920 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74 65  to use to create
14930 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20   a key from the 
14940 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a  results.      **
14950 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
14960 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20  on. affinityStr 
14970 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20  stores a static 
14980 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20  string suitable 
14990 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50 34 20  for.      ** P4 
149a0 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  of OP_MakeRecord
149b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
149c0 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70   affinity = comp
149d0 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
149e0 45 78 70 72 29 3b 0a 0a 0a 20 20 20 20 20 20 2f  Expr);...      /
149f0 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70 72  * Code the <expr
14a00 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49  > from "<expr> I
14a10 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65  N (...)". The te
14a20 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20 20  mporary table.  
14a30 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54      ** pExpr->iT
14a40 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  able contains th
14a50 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61  e values that ma
14a60 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29 20  ke up the (...) 
14a70 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  set..      */.  
14a80 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
14a90 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20  bleColCache++;. 
14aa0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14ab0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
14ac0 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
14ad0 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  t);.      pParse
14ae0 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
14af0 65 2d 2d 3b 0a 20 20 20 20 20 20 6a 32 20 3d 20  e--;.      j2 = 
14b00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14b10 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
14b20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
14b30 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
14b40 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
14b50 20 20 20 20 6a 33 20 3d 20 73 71 6c 69 74 65 33      j3 = sqlite3
14b60 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
14b70 5f 4d 75 73 74 42 65 49 6e 74 2c 20 74 61 72 67  _MustBeInt, targ
14b80 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 34 20  et);.        j4 
14b90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14ba0 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  Op3(v, OP_NotExi
14bb0 73 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  sts, pExpr->iTab
14bc0 6c 65 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  le, 0, target);.
14bd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14be0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14bf0 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
14c00 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 35 20  et);.        j5 
14c10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14c20 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
14c30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14c40 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14c50 6a 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  j3);.        sql
14c60 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
14c70 28 76 2c 20 6a 34 29 3b 0a 20 20 20 20 20 20 20  (v, j4);.       
14c80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14c90 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
14ca0 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
14cb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14cc0 20 20 20 72 32 20 3d 20 72 65 67 46 72 65 65 32     r2 = regFree2
14cd0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
14ce0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20  pReg(pParse);.. 
14cf0 20 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65         /* Create
14d00 20 61 20 72 65 63 6f 72 64 20 61 6e 64 20 74 65   a record and te
14d10 73 74 20 66 6f 72 20 73 65 74 20 6d 65 6d 62 65  st for set membe
14d20 72 73 68 69 70 2e 20 49 66 20 74 68 65 20 73 65  rship. If the se
14d30 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  t contains.     
14d40 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 2c     ** the value,
14d50 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68   then jump to th
14d60 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 65 73  e end of the tes
14d70 74 20 63 6f 64 65 2e 20 54 68 65 20 74 61 72 67  t code. The targ
14d80 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  et.        ** re
14d90 67 69 73 74 65 72 20 73 74 69 6c 6c 20 63 6f 6e  gister still con
14da0 74 61 69 6e 73 20 74 68 65 20 74 72 75 65 20 28  tains the true (
14db0 31 29 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e  1) value written
14dc0 20 74 6f 20 69 74 20 65 61 72 6c 69 65 72 2e 0a   to it earlier..
14dd0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
14de0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14df0 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
14e00 65 63 6f 72 64 2c 20 74 61 72 67 65 74 2c 20 31  ecord, target, 1
14e10 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c  , r2, &affinity,
14e20 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
14e30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14e40 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
14e50 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
14e60 20 20 6a 35 20 3d 20 73 71 6c 69 74 65 33 56 64    j5 = sqlite3Vd
14e70 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46  beAddOp3(v, OP_F
14e80 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
14e90 62 6c 65 2c 20 30 2c 20 72 32 29 3b 0a 0a 20 20  ble, 0, r2);..  
14ea0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
14eb0 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  set membership t
14ec0 65 73 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  est fails, then 
14ed0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
14ee0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 78  e .        ** "x
14ef0 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72 65   IN (...)" expre
14f00 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 69  ssion must be ei
14f10 74 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20  ther 0 or NULL. 
14f20 49 66 20 74 68 65 20 73 65 74 0a 20 20 20 20 20  If the set.     
14f30 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e     ** contains n
14f40 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74  o NULL values, t
14f50 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
14f60 73 20 30 2e 20 49 66 20 74 68 65 20 73 65 74 20  s 0. If the set 
14f70 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
14f80 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
14f90 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68   NULL values, th
14fa0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  en the result of
14fb0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
14fc0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c  expression is al
14fd0 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20  so NULL..       
14fe0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
14ff0 72 4e 6f 74 46 6f 75 6e 64 3d 3d 30 20 29 7b 0a  rNotFound==0 ){.
15000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
15010 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66  s branch runs if
15020 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20   it is known at 
15030 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 28 6e 6f  compile time (no
15040 77 29 20 74 68 61 74 20 0a 20 20 20 20 20 20 20  w) that .       
15050 20 20 20 2a 2a 20 74 68 65 20 73 65 74 20 63 6f     ** the set co
15060 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76  ntains no NULL v
15070 61 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70 70  alues. This happ
15080 65 6e 73 20 61 73 20 74 68 65 20 72 65 73 75 6c  ens as the resul
15090 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  t.          ** o
150a0 66 20 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63  f a "NOT NULL" c
150b0 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65  onstraint in the
150c0 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
150d0 2e 20 4e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20  . No need.      
150e0 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74      ** to test t
150f0 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  he data structur
15100 65 20 61 74 20 72 75 6e 74 69 6d 65 20 69 6e 20  e at runtime in 
15110 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
15120 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
15130 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15140 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
15150 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
15160 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
15170 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
15180 62 6c 6f 63 6b 20 70 6f 70 75 6c 61 74 65 73 20  block populates 
15190 74 68 65 20 72 4e 6f 74 46 6f 75 6e 64 20 72 65  the rNotFound re
151a0 67 69 73 74 65 72 20 77 69 74 68 20 65 69 74 68  gister with eith
151b0 65 72 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20  er NULL.        
151c0 20 20 2a 2a 20 6f 72 20 30 20 28 61 6e 20 69 6e    ** or 0 (an in
151d0 74 65 67 65 72 20 76 61 6c 75 65 29 2e 20 49 66  teger value). If
151e0 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74   the data struct
151f0 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ure contains one
15200 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
15210 20 6d 6f 72 65 20 4e 55 4c 4c 73 2c 20 74 68 65   more NULLs, the
15220 6e 20 73 65 74 20 72 4e 6f 74 46 6f 75 6e 64 20  n set rNotFound 
15230 74 6f 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69  to NULL. Otherwi
15240 73 65 2c 20 73 65 74 20 69 74 0a 20 20 20 20 20  se, set it.     
15250 20 20 20 20 20 2a 2a 20 74 6f 20 30 2e 20 49 66       ** to 0. If
15260 20 72 65 67 69 73 74 65 72 20 72 4d 61 79 48 61   register rMayHa
15270 76 65 4e 75 6c 6c 20 69 73 20 61 6c 72 65 61 64  veNull is alread
15280 79 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61  y set to some va
15290 6c 75 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  lue.          **
152a0 20 6f 74 68 65 72 20 74 68 61 6e 20 4e 55 4c 4c   other than NULL
152b0 2c 20 74 68 65 6e 20 74 68 65 20 74 65 73 74 20  , then the test 
152c0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
152d0 20 72 75 6e 20 61 6e 64 20 0a 20 20 20 20 20 20   run and .      
152e0 20 20 20 20 2a 2a 20 72 4e 6f 74 46 6f 75 6e 64      ** rNotFound
152f0 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75   is already popu
15300 6c 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20  lated..         
15310 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 74   */.          st
15320 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
15330 6e 75 6c 6c 52 65 63 6f 72 64 5b 5d 20 3d 20 7b  nullRecord[] = {
15340 20 30 78 30 32 2c 20 30 78 30 30 20 7d 3b 0a 20   0x02, 0x00 };. 
15350 20 20 20 20 20 20 20 20 20 6a 33 20 3d 20 73 71           j3 = sq
15360 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
15370 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72  v, OP_NotNull, r
15380 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20  MayHaveNull);.  
15390 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
153a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
153b0 4e 75 6c 6c 2c 20 30 2c 20 72 4e 6f 74 46 6f 75  Null, 0, rNotFou
153c0 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  nd);.          s
153d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
153e0 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 32 2c 20  (v, OP_Blob, 2, 
153f0 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 30 2c  rMayHaveNull, 0,
15400 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
15410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
15420 75 6c 6c 52 65 63 6f 72 64 2c 20 50 34 5f 53 54  ullRecord, P4_ST
15430 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  ATIC);.         
15440 20 6a 34 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j4 = sqlite3Vdb
15450 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f  eAddOp3(v, OP_Fo
15460 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
15470 6c 65 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e  le, 0, rMayHaveN
15480 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ull);.          
15490 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
154a0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
154b0 20 30 2c 20 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a   0, rNotFound);.
154c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
154d0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
154e0 20 6a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20   j4);.          
154f0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
15500 65 72 65 28 76 2c 20 6a 33 29 3b 0a 0a 20 20 20  ere(v, j3);..   
15510 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74         /* Copy t
15520 68 65 20 76 61 6c 75 65 20 6f 66 20 72 65 67 69  he value of regi
15530 73 74 65 72 20 72 4e 6f 74 46 6f 75 6e 64 20 28  ster rNotFound (
15540 77 68 69 63 68 20 69 73 20 65 69 74 68 65 72 20  which is either 
15550 4e 55 4c 4c 20 6f 72 20 30 29 0a 09 20 20 2a 2a  NULL or 0)..  **
15560 20 69 6e 74 6f 20 74 68 65 20 74 61 72 67 65 74   into the target
15570 20 72 65 67 69 73 74 65 72 2e 20 54 68 69 73 20   register. This 
15580 77 69 6c 6c 20 62 65 20 74 68 65 20 72 65 73 75  will be the resu
15590 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  lt of the.      
155a0 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
155b0 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  n..          */.
155c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
155d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
155e0 50 5f 43 6f 70 79 2c 20 72 4e 6f 74 46 6f 75 6e  P_Copy, rNotFoun
155f0 64 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  d, target);.    
15600 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15610 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
15620 75 6d 70 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a  umpHere(v, j2);.
15630 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15640 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 35 29  eJumpHere(v, j5)
15650 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
15660 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20  ent((v, "end IN 
15670 65 78 70 72 20 72 25 64 22 2c 20 74 61 72 67 65  expr r%d", targe
15680 74 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  t));.      break
15690 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
156a0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20     /*.    **    
156b0 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
156c0 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
156d0 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65  This is equivale
156e0 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20  nt to.    **.   
156f0 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20   **    x>=y AND 
15700 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  x<=z.    **.    
15710 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69  ** X is stored i
15720 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
15730 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72      ** Y is stor
15740 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
15750 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a  st->a[0].pExpr..
15760 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72      ** Z is stor
15770 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
15780 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a  st->a[1].pExpr..
15790 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
157a0 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
157b0 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
157c0 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
157d0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
157e0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74  rList_item *pLIt
157f0 65 6d 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  em = pExpr->pLis
15800 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72  t->a;.      Expr
15810 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65   *pRight = pLIte
15820 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20  m->pExpr;..     
15830 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72   codeCompareOper
15840 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70 4c 65  ands(pParse, pLe
15850 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65  ft, &r1, &regFre
15860 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e1,.            
15870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15880 20 20 20 20 20 20 70 52 69 67 68 74 2c 20 26 72        pRight, &r
15890 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  2, &regFree2);. 
158a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
158b0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
158c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
158d0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
158e0 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47     r3 = sqlite3G
158f0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
15900 29 3b 0a 20 20 20 20 20 20 72 34 20 3d 20 73 71  );.      r4 = sq
15910 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
15920 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63  pParse);.      c
15930 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
15940 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
15950 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20 20  , OP_Ge,.       
15960 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
15970 32 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f 53 54  2, r3, SQLITE_ST
15980 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 70 4c  OREP2);.      pL
15990 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52  Item++;.      pR
159a0 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70  ight = pLItem->p
159b0 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
159c0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
159d0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
159e0 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e2);.      r2 = 
159f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
15a00 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67  emp(pParse, pRig
15a10 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
15a20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15a30 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
15a40 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
15a50 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
15a60 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72  pRight, OP_Le, r
15a70 31 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54  1, r2, r4, SQLIT
15a80 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20  E_STOREP2);.    
15a90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15aa0 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72  Op3(v, OP_And, r
15ab0 33 2c 20 72 34 2c 20 74 61 72 67 65 74 29 3b 0a  3, r4, target);.
15ac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
15ad0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
15ae0 73 65 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 73  se, r3);.      s
15af0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15b00 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 34 29  pReg(pParse, r4)
15b10 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15b20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
15b30 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
15b40 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
15b50 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
15b60 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
15b70 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
15b80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15b90 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46  .    /*.    ** F
15ba0 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20  orm A:.    **   
15bb0 43 41 53 45 20 78 20 57 48 45 4e 20 65 31 20 54  CASE x WHEN e1 T
15bc0 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54  HEN r1 WHEN e2 T
15bd0 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20  HEN r2 ... WHEN 
15be0 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
15bf0 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
15c00 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20   ** Form B:.    
15c10 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 65  **   CASE WHEN e
15c20 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65  1 THEN r1 WHEN e
15c30 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48  2 THEN r2 ... WH
15c40 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c  EN eN THEN rN EL
15c50 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
15c60 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73      ** Form A is
15c70 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72   can be transfor
15c80 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75  med into the equ
15c90 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61  ivalent form B a
15ca0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a  s follows:.    *
15cb0 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d  *   CASE WHEN x=
15cc0 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  e1 THEN r1 WHEN 
15cd0 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  x=e2 THEN r2 ...
15ce0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57  .    **        W
15cf0 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e  HEN x=eN THEN rN
15d00 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
15d10 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20  **.    ** X (if 
15d20 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e  it exists) is in
15d30 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
15d40 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 70 45     ** Y is in pE
15d50 78 70 72 2d 3e 70 52 69 67 68 74 2e 20 20 54 68  xpr->pRight.  Th
15d60 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69  e Y is also opti
15d70 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 72 65 20  onal.  If there 
15d80 69 73 20 6e 6f 0a 20 20 20 20 2a 2a 20 45 4c 53  is no.    ** ELS
15d90 45 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 20  E clause and no 
15da0 6f 74 68 65 72 20 74 65 72 6d 20 6d 61 74 63 68  other term match
15db0 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  es, then the res
15dc0 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ult of the.    *
15dd0 2a 20 65 78 70 72 73 73 69 6f 6e 20 69 73 20 4e  * exprssion is N
15de0 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69  ULL..    ** Ei i
15df0 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  s in pExpr->pLis
15e00 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69  t->a[i*2] and Ri
15e10 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   is pExpr->pList
15e20 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20  ->a[i*2+1]..    
15e30 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
15e40 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72  sult of the expr
15e50 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69  ession is the Ri
15e60 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d   for the first m
15e70 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20  atching Ei,.    
15e80 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  ** or if there i
15e90 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69  s no matching Ei
15ea0 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20  , the ELSE term 
15eb0 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  Y, or if there i
15ec0 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45  s.    ** no ELSE
15ed0 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20   term, NULL..   
15ee0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
15ef0 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e  CASE: {.      in
15f00 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20  t endLabel;     
15f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f  /* GOTO label fo
15f30 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74  r end of CASE st
15f40 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mt */.      int 
15f50 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20 20  nextCase;       
15f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15f70 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
15f80 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65  next WHEN clause
15f90 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45   */.      int nE
15fa0 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
15fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
15fc0 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e  x number of WHEN
15fd0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
15fe0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16000 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
16010 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c  r */.      ExprL
16020 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16040 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72  List of WHEN ter
16050 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  ms */.      stru
16060 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
16070 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a   *aListelem;  /*
16080 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74   Array of WHEN t
16090 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  erms */.      Ex
160a0 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20  pr opCompare;   
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160c0 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70  /* The X==Ei exp
160d0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
160e0 20 45 78 70 72 20 63 61 63 68 65 58 3b 20 20 20   Expr cacheX;   
160f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16100 20 20 20 2f 2a 20 43 61 63 68 65 64 20 65 78 70     /* Cached exp
16110 72 65 73 73 69 6f 6e 20 58 20 2a 2f 0a 20 20 20  ression X */.   
16120 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20     Expr *pX;    
16130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16140 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78       /* The X ex
16150 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
16160 20 20 45 78 70 72 20 2a 70 54 65 73 74 3b 20 20    Expr *pTest;  
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16180 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f      /* X==Ei (fo
16190 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69  rm A) or just Ei
161a0 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 0a 20 20   (form B) */..  
161b0 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
161c0 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
161d0 61 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e 70  assert((pExpr->p
161e0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29  List->nExpr % 2)
161f0 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73   == 0);.      as
16200 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73  sert(pExpr->pLis
16210 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20  t->nExpr > 0);. 
16220 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45       pEList = pE
16230 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
16240 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45    aListelem = pE
16250 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e  List->a;.      n
16260 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
16270 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c  Expr;.      endL
16280 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
16290 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
162a0 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20        if( (pX = 
162b0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30  pExpr->pLeft)!=0
162c0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 63 68   ){.        cach
162d0 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20  eX = *pX;.      
162e0 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
162f0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
16300 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49   pX->op==TK_REGI
16310 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20  STER );.        
16320 63 61 63 68 65 58 2e 69 54 61 62 6c 65 20 3d 20  cacheX.iTable = 
16330 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
16340 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2c 20  emp(pParse, pX, 
16350 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
16360 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
16370 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
16380 20 20 20 20 20 63 61 63 68 65 58 2e 6f 70 20 3d       cacheX.op =
16390 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
163a0 20 20 20 20 20 20 63 61 63 68 65 58 2e 69 43 6f        cacheX.iCo
163b0 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  lumn = 0;.      
163c0 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d    opCompare.op =
163d0 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20   TK_EQ;.        
163e0 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20  opCompare.pLeft 
163f0 3d 20 26 63 61 63 68 65 58 3b 0a 20 20 20 20 20  = &cacheX;.     
16400 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f     pTest = &opCo
16410 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20  mpare;.      }. 
16420 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
16430 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a  ableColCache++;.
16440 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
16450 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a  <nExpr; i=i+2){.
16460 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29          if( pX )
16470 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f  {.          opCo
16480 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61  mpare.pRight = a
16490 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
164a0 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  r;.        }else
164b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 73  {.          pTes
164c0 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  t = aListelem[i]
164d0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
164e0 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43 61  }.        nextCa
164f0 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
16500 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
16510 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16520 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pTest->op==TK_CO
16530 4c 55 4d 4e 20 7c 7c 20 70 54 65 73 74 2d 3e 6f  LUMN || pTest->o
16540 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
16550 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16560 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
16570 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74  rse, pTest, next
16580 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Case, SQLITE_JUM
16590 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
165a0 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73    testcase( aLis
165b0 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72  telem[i+1].pExpr
165c0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
165d0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
165e0 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69  ase( aListelem[i
165f0 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  +1].pExpr->op==T
16600 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
16610 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16620 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c  rCode(pParse, aL
16630 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
16640 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
16650 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16660 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
16670 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c 29 3b  o, 0, endLabel);
16680 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16690 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
166a0 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20  (v, nextCase);. 
166b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
166c0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
166d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
166e0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
166f0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
16700 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
16710 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
16720 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16730 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
16740 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
16750 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16760 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
16770 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20  , endLabel);.   
16780 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
16790 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
167a0 68 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 50  he>0 );.      pP
167b0 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
167c0 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 62  Cache--;.      b
167d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
167e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
167f0 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65  TRIGGER.    case
16800 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20   TK_RAISE: {.   
16810 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e     if( !pParse->
16820 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20  trigStack ){.   
16830 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
16840 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
16850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16860 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79      "RAISE() may
16870 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69   only be used wi
16880 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70  thin a trigger-p
16890 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
168a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
168b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
168c0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45  xpr->iColumn!=OE
168d0 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20  _Ignore ){.     
168e0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
168f0 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52  r->iColumn==OE_R
16900 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20  ollback ||.     
16910 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
16920 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45  r->iColumn == OE
16930 5f 41 62 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20  _Abort ||.      
16940 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
16950 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f  ->iColumn == OE_
16960 46 61 69 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  Fail );.        
16970 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45   sqlite3DequoteE
16980 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  xpr(pParse->db, 
16990 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
169a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
169b0 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53  p4(v, OP_Halt, S
169c0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
169d0 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
169e0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
169f0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
16a00 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
16a10 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
16a20 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73  .n);.      } els
16a30 65 20 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73  e {.         ass
16a40 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ert( pExpr->iCol
16a50 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65  umn == OE_Ignore
16a60 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c   );.         sql
16a70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16a80 2c 20 4f 50 5f 43 6f 6e 74 65 78 74 50 6f 70 2c  , OP_ContextPop,
16a90 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
16aa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16ab0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
16ac0 2c 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  , pParse->trigSt
16ad0 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 29  ack->ignoreJump)
16ae0 3b 0a 20 20 20 20 20 20 20 20 20 56 64 62 65 43  ;.         VdbeC
16af0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 61 69 73  omment((v, "rais
16b00 65 28 49 47 4e 4f 52 45 29 22 29 29 3b 0a 20 20  e(IGNORE)"));.  
16b10 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
16b20 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
16b30 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
16b40 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
16b50 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
16b60 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
16b70 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
16b80 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75  egFree2);.  retu
16b90 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  rn inReg;.}../*.
16ba0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
16bb0 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20   to evaluate an 
16bc0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73  expression and s
16bd0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
16be0 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73  .** into a regis
16bf0 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ter.  Return the
16c00 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
16c10 20 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c   where the resul
16c20 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  ts.** are stored
16c30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
16c40 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d  egister is a tem
16c50 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
16c60 74 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c  that can be deal
16c70 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e  located,.** then
16c80 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65   write its numbe
16c90 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49  r into *pReg.  I
16ca0 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67  f the result reg
16cb0 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20  ister is not.** 
16cc0 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65  a temporary, the
16cd0 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a  n set *pReg to z
16ce0 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ero..*/.int sqli
16cf0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
16d00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
16d10 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
16d20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 31  *pReg){.  int r1
16d30 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
16d40 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
16d50 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
16d60 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
16d70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31  Parse, pExpr, r1
16d80 29 3b 0a 20 20 69 66 28 20 72 32 3d 3d 72 31 20  );.  if( r2==r1 
16d90 29 7b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 72  ){.    *pReg = r
16da0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
16db0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
16dc0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
16dd0 29 3b 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 30  );.    *pReg = 0
16de0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
16df0 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  2;.}../*.** Gene
16e00 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
16e10 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70  ill evaluate exp
16e20 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
16e30 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
16e40 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
16e50 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  er target.  The 
16e60 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72  results are guar
16e70 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72  anteed to appear
16e80 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
16e90 74 61 72 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73  target..*/.int s
16ea0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50  qlite3ExprCode(P
16eb0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
16ec0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
16ed0 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e  arget){.  int in
16ee0 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Reg;..  assert( 
16ef0 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
16f00 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
16f10 20 29 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71   );.  inReg = sq
16f20 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
16f30 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
16f40 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73  r, target);.  as
16f50 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56  sert( pParse->pV
16f60 64 62 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  dbe || pParse->d
16f70 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
16f80 29 3b 0a 20 20 69 66 28 20 69 6e 52 65 67 21 3d  );.  if( inReg!=
16f90 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73 65  target && pParse
16fa0 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 73  ->pVdbe ){.    s
16fb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16fc0 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
16fd0 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c  OP_SCopy, inReg,
16fe0 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 20 20   target);.  }.  
16ff0 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 7d  return target;.}
17000 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
17010 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75   code that evalu
17020 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78  tes the given ex
17030 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74  pression and put
17040 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
17050 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
17060 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d  et..**.** Also m
17070 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
17080 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73  e expression res
17090 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65  ults into anothe
170a0 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74  r "cache" regist
170b0 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79  er.** and modify
170c0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
170d0 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
170e0 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c   time it is eval
170f0 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65  uated,.** the re
17100 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f  sult is a copy o
17110 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69  f the cache regi
17120 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ster..**.** This
17130 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
17140 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73   for expressions
17150 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d   that are used m
17160 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65  ultiple .** time
17170 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61  s.  They are eva
17180 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20  luated once and 
17190 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
171a0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
171b0 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a   are reused..*/.
171c0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
171d0 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73  odeAndCache(Pars
171e0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
171f0 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
17200 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
17210 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
17220 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 20 20 69    int inReg;.  i
17230 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
17240 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
17250 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
17260 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
17270 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  0 );.  if( pExpr
17280 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ->op!=TK_REGISTE
17290 52 20 29 7b 20 20 0a 20 20 20 20 69 6e 74 20 69  R ){  .    int i
172a0 4d 65 6d 3b 0a 20 20 20 20 69 4d 65 6d 20 3d 20  Mem;.    iMem = 
172b0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
172c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
172d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
172e0 2c 20 69 6e 52 65 67 2c 20 69 4d 65 6d 29 3b 0a  , inReg, iMem);.
172f0 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
17300 65 20 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 70 45  e = iMem;.    pE
17310 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70  xpr->iColumn = p
17320 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 70 45  Expr->op;.    pE
17330 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47  xpr->op = TK_REG
17340 49 53 54 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ISTER;.  }.  ret
17350 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a  urn inReg;.}../*
17360 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
17370 69 66 20 70 45 78 70 72 20 69 73 20 61 6e 20 63  if pExpr is an c
17380 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
17390 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70 72 6f  on that is appro
173a0 70 72 69 61 74 65 0a 2a 2a 20 66 6f 72 20 66 61  priate.** for fa
173b0 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61  ctoring out of a
173c0 20 6c 6f 6f 70 2e 20 20 41 70 70 72 6f 70 72 69   loop.  Appropri
173d0 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ate expressions 
173e0 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  are:.**.**    * 
173f0 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
17400 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74  that evaluates t
17410 6f 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 70  o two or more op
17420 63 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  codes..**.**    
17430 2a 20 20 41 6e 79 20 4f 50 5f 49 6e 74 65 67 65  *  Any OP_Intege
17440 72 2c 20 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f 53  r, OP_Real, OP_S
17450 74 72 69 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c 20  tring, OP_Blob, 
17460 4f 50 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20 20  OP_Null, .**    
17470 20 20 20 6f 72 20 4f 50 5f 56 61 72 69 61 62 6c     or OP_Variabl
17480 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
17490 6e 65 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65  need to be place
174a0 64 20 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20 20  d in a .**      
174b0 20 73 70 65 63 69 66 69 63 20 72 65 67 69 73 74   specific regist
174c0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  er..**.** There 
174d0 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 66  is no point in f
174e0 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 73 69 6e  actoring out sin
174f0 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20  gle-instruction 
17500 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72  constant.** expr
17510 65 73 73 69 6f 6e 73 20 74 68 61 74 20 6e 65 65  essions that nee
17520 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69  d to be placed i
17530 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72  n a particular r
17540 65 67 69 73 74 65 72 2e 20 20 0a 2a 2a 20 57 65  egister.  .** We
17550 20 63 6f 75 6c 64 20 66 61 63 74 6f 72 20 74 68   could factor th
17560 65 6d 20 6f 75 74 2c 20 62 75 74 20 74 68 65 6e  em out, but then
17570 20 77 65 20 77 6f 75 6c 64 20 65 6e 64 20 75 70   we would end up
17580 20 61 64 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f 50   adding an.** OP
17590 5f 53 43 6f 70 79 20 69 6e 73 74 72 75 63 74 69  _SCopy instructi
175a0 6f 6e 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76  on to move the v
175b0 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 63 6f  alue into the co
175c0 72 72 65 63 74 20 72 65 67 69 73 74 65 72 0a 2a  rrect register.*
175d0 2a 20 6c 61 74 65 72 2e 20 20 57 65 20 6d 69 67  * later.  We mig
175e0 68 74 20 61 73 20 77 65 6c 6c 20 6a 75 73 74 20  ht as well just 
175f0 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  use the original
17600 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64   instruction and
17610 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 4f 50  .** avoid the OP
17620 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74 69  _SCopy..*/.stati
17630 63 20 69 6e 74 20 69 73 41 70 70 72 6f 70 72 69  c int isAppropri
17640 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67 28  ateForFactoring(
17650 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
17660 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
17670 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 29  nstantNotJoin(p)
17680 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
17690 3b 20 20 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73 74  ;  /* Only const
176a0 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ant expressions 
176b0 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  are appropriate 
176c0 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 2a 2f  for factoring */
176d0 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66  .  }.  if( (p->f
176e0 6c 61 67 73 20 26 20 45 50 5f 46 69 78 65 64 44  lags & EP_FixedD
176f0 65 73 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  est)==0 ){.    r
17700 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6e 79  eturn 1;  /* Any
17710 20 63 6f 6e 73 74 61 6e 74 20 77 69 74 68 6f 75   constant withou
17720 74 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e  t a fixed destin
17730 61 74 69 6f 6e 20 69 73 20 61 70 70 72 6f 70 72  ation is appropr
17740 69 61 74 65 20 2a 2f 0a 20 20 7d 0a 20 20 77 68  iate */.  }.  wh
17750 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ile( p->op==TK_U
17760 50 4c 55 53 20 29 20 70 20 3d 20 70 2d 3e 70 4c  PLUS ) p = p->pL
17770 65 66 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70  eft;.  switch( p
17780 2d 3e 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66 20  ->op ){.#ifndef 
17790 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
177a0 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
177b0 65 20 54 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64 69  e TK_BLOB:.#endi
177c0 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  f.    case TK_VA
177d0 52 49 41 42 4c 45 3a 0a 20 20 20 20 63 61 73 65  RIABLE:.    case
177e0 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
177f0 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
17800 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
17810 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
17820 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 74 65  RING: {.      te
17830 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
17840 4b 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20  K_BLOB );.      
17850 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
17860 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 3b 0a  =TK_VARIABLE );.
17870 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17880 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  p->op==TK_INTEGE
17890 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  R );.      testc
178a0 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46  ase( p->op==TK_F
178b0 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 74 65  LOAT );.      te
178c0 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
178d0 4b 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  K_NULL );.      
178e0 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
178f0 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20  =TK_STRING );.  
17900 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 2d 69 6e      /* Single-in
17910 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74 61  struction consta
17920 6e 74 73 20 77 69 74 68 20 61 20 66 69 78 65 64  nts with a fixed
17930 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 72 65   destination are
17940 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72  .      ** better
17950 20 64 6f 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20 20   done in-line.  
17960 49 66 20 77 65 20 66 61 63 74 6f 72 20 74 68 65  If we factor the
17970 6d 2c 20 74 68 65 79 20 77 69 6c 6c 20 6a 75 73  m, they will jus
17980 74 20 65 6e 64 0a 20 20 20 20 20 20 2a 2a 20 75  t end.      ** u
17990 70 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20  p generating an 
179a0 4f 50 5f 53 43 6f 70 79 20 74 6f 20 6d 6f 76 65  OP_SCopy to move
179b0 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 74 68   the value to th
179c0 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20  e destination.  
179d0 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72 2e      ** register.
179e0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
179f0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   0;.    }.    ca
17a00 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
17a10 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c         if( p->pL
17a20 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
17a30 54 20 7c 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f  T || p->pLeft->o
17a40 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b  p==TK_INTEGER ){
17a50 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  .         return
17a60 20 30 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20   0;.       }.   
17a70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17a80 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
17a90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17aa0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
17ab0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70  1;.}../*.** If p
17ac0 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61  Expr is a consta
17ad0 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  nt expression th
17ae0 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  at is appropriat
17af0 65 20 66 6f 72 0a 2a 2a 20 66 61 63 74 6f 72 69  e for.** factori
17b00 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ng out of a loop
17b10 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20  , then evaluate 
17b20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
17b30 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65  * into a registe
17b40 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 68  r and convert th
17b50 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 74  e expression int
17b60 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a  o a TK_REGISTER.
17b70 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  ** expression..*
17b80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 76 61  /.static int eva
17b90 6c 43 6f 6e 73 74 45 78 70 72 28 76 6f 69 64 20  lConstExpr(void 
17ba0 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78  *pArg, Expr *pEx
17bb0 70 72 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  pr){.  Parse *pP
17bc0 61 72 73 65 20 3d 20 28 50 61 72 73 65 2a 29 70  arse = (Parse*)p
17bd0 41 72 67 3b 0a 20 20 73 77 69 74 63 68 28 20 70  Arg;.  switch( p
17be0 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
17bf0 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52  case TK_REGISTER
17c00 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
17c10 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
17c20 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a  se TK_FUNCTION:.
17c30 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
17c40 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
17c50 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  se TK_CONST_FUNC
17c60 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
17c70 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 20   arguments to a 
17c80 66 75 6e 63 74 69 6f 6e 20 68 61 76 65 20 61 20  function have a 
17c90 66 69 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f  fixed destinatio
17ca0 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 4d 61 72 6b  n..      ** Mark
17cb0 20 74 68 65 6d 20 74 68 69 73 20 77 61 79 20 74   them this way t
17cc0 6f 20 61 76 6f 69 64 20 67 65 6e 65 72 61 74 65  o avoid generate
17cd0 64 20 75 6e 6e 65 65 64 65 64 20 4f 50 5f 53 43  d unneeded OP_SC
17ce0 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e 73  opy.      ** ins
17cf0 74 72 75 63 74 69 6f 6e 73 2e 20 0a 20 20 20 20  tructions. .    
17d00 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c    */.      ExprL
17d10 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
17d20 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  pr->pList;.     
17d30 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
17d40 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c        int i = pL
17d50 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
17d60 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
17d70 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
17d80 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  = pList->a;.    
17d90 20 20 20 20 66 6f 72 28 3b 20 69 3e 30 3b 20 69      for(; i>0; i
17da0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
17db0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
17dc0 6d 2d 3e 70 45 78 70 72 20 29 20 70 49 74 65 6d  m->pExpr ) pItem
17dd0 2d 3e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c  ->pExpr->flags |
17de0 3d 20 45 50 5f 46 69 78 65 64 44 65 73 74 3b 0a  = EP_FixedDest;.
17df0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17e00 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
17e10 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
17e20 73 41 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46  sAppropriateForF
17e30 61 63 74 6f 72 69 6e 67 28 70 45 78 70 72 29 20  actoring(pExpr) 
17e40 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20  ){.    int r1 = 
17e50 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
17e60 20 20 20 20 69 6e 74 20 72 32 3b 0a 20 20 20 20      int r2;.    
17e70 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
17e80 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
17e90 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20  e, pExpr, r1);. 
17ea0 20 20 20 69 66 28 20 72 31 21 3d 72 32 20 29 20     if( r1!=r2 ) 
17eb0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
17ec0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
17ed0 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43  );.    pExpr->iC
17ee0 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 6f  olumn = pExpr->o
17ef0 70 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  p;.    pExpr->op
17f00 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
17f10 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
17f20 65 20 3d 20 72 32 3b 0a 20 20 20 20 72 65 74 75  e = r2;.    retu
17f30 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
17f40 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  rn 0;.}../*.** P
17f50 72 65 65 76 61 6c 75 61 74 65 20 63 6f 6e 73 74  reevaluate const
17f60 61 6e 74 20 73 75 62 65 78 70 72 65 73 73 69 6f  ant subexpressio
17f70 6e 73 20 77 69 74 68 69 6e 20 70 45 78 70 72 20  ns within pExpr 
17f80 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
17f90 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
17fa0 73 74 65 72 73 2e 20 20 4d 6f 64 69 66 79 20 70  sters.  Modify p
17fb0 45 78 70 72 20 73 6f 20 74 68 61 74 20 74 68 65  Expr so that the
17fc0 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65 78 70   constant subexp
17fd0 72 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 54  resions.** are T
17fe0 4b 5f 52 45 47 49 53 54 45 52 20 6f 70 63 6f 64  K_REGISTER opcod
17ff0 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  es that refer to
18000 20 74 68 65 20 70 72 65 63 6f 6d 70 75 74 65 64   the precomputed
18010 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 76 6f 69 64   values..*/.void
18020 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18030 43 6f 6e 73 74 61 6e 74 73 28 50 61 72 73 65 20  Constants(Parse 
18040 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
18050 45 78 70 72 29 7b 0a 20 20 20 77 61 6c 6b 45 78  Expr){.   walkEx
18060 70 72 54 72 65 65 28 70 45 78 70 72 2c 20 65 76  prTree(pExpr, ev
18070 61 6c 43 6f 6e 73 74 45 78 70 72 2c 20 70 50 61  alConstExpr, pPa
18080 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rse);.}.../*.** 
18090 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
180a0 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61  at pushes the va
180b0 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65  lue of every ele
180c0 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65  ment of the give
180d0 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
180e0 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75  list into a sequ
180f0 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
18100 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74  s beginning at t
18110 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  arget..**.** Ret
18120 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
18130 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75  f elements evalu
18140 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
18150 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
18160 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
18170 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
18180 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
18190 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
181a0 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70  st,   /* The exp
181b0 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
181c0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  be coded */.  in
181d0 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20 20  t target,       
181e0 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
181f0 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  te results */.  
18200 69 6e 74 20 64 6f 48 61 72 64 43 6f 70 79 20 20  int doHardCopy  
18210 20 20 20 2f 2a 20 43 61 6c 6c 20 73 71 6c 69 74     /* Call sqlit
18220 65 33 45 78 70 72 48 61 72 64 43 6f 70 79 20 6f  e3ExprHardCopy o
18230 6e 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 20 69  n each element i
18240 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 73  f true */.){.  s
18250 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
18260 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
18270 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74  t i, n;.  assert
18280 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50  ( pList!=0 || pP
18290 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
182a0 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
182b0 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
182c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
182d0 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
182e0 20 29 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d   );.  n = pList-
182f0 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28 70 49  >nExpr;.  for(pI
18300 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
18310 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74  0; i<n; i++, pIt
18320 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
18330 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
18340 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  e, pItem->pExpr,
18350 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
18360 69 66 28 20 64 6f 48 61 72 64 43 6f 70 79 20 29  if( doHardCopy )
18370 20 73 71 6c 69 74 65 33 45 78 70 72 48 61 72 64   sqlite3ExprHard
18380 43 6f 70 79 28 70 50 61 72 73 65 2c 20 74 61 72  Copy(pParse, tar
18390 67 65 74 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 72  get, n);.  }.  r
183a0 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
183b0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
183c0 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
183d0 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
183e0 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
183f0 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
18400 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
18410 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
18420 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  ue but execution
18430 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
18440 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
18450 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
18460 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   false..**.** If
18470 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
18480 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
18490 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
184a0 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e  nor false), then
184b0 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d  .** take the jum
184c0 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e  p if the jumpIfN
184d0 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49  ull flag is SQLI
184e0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a  TE_JUMPIFNULL..*
184f0 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64  *.** This code d
18500 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61  epends on the fa
18510 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  ct that certain 
18520 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78  token values (ex
18530 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20  : TK_EQ).** are 
18540 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f  the same as opco
18550 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f  de values (ex: O
18560 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65  P_Eq) that imple
18570 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70  ment the corresp
18580 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  onding.** operat
18590 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f  ion.  Special co
185a0 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63  mments in vdbe.c
185b0 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64   and the mkopcod
185c0 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e  eh.awk script in
185d0 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f  .** the make pro
185e0 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65  cess cause these
185f0 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e   values to align
18600 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20  .  Assert()s in 
18610 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f  the code.** belo
18620 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  w verify that th
18630 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  e numbers are al
18640 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  igned correctly.
18650 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18660 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65  ExprIfTrue(Parse
18670 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
18680 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
18690 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
186a0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
186b0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
186c0 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
186d0 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
186e0 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
186f0 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  0;.  int r1, r2;
18700 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70  ..  assert( jump
18710 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a  IfNull==SQLITE_J
18720 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d  UMPIFNULL || jum
18730 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
18740 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70  if( v==0 || pExp
18750 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
18760 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
18770 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
18780 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
18790 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
187a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
187b0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
187c0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
187d0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
187e0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
187f0 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
18800 61 63 68 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ache==0 );.     
18810 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
18820 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
18830 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d  r->pLeft, d2,jum
18840 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a  pIfNull^SQLITE_J
18850 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
18860 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c    pParse->disabl
18870 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20  eColCache++;.   
18880 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
18890 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
188a0 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
188b0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
188c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
188d0 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
188e0 61 63 68 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  ache>0 );.      
188f0 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
18900 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20  olCache--;.     
18910 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
18920 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
18930 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18940 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
18950 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OR: {.      test
18960 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
18970 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
18980 74 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64  tcase( pParse->d
18990 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d  isableColCache==
189a0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
189b0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
189c0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
189d0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
189e0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ull);.      pPar
189f0 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
18a00 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  che++;.      sql
18a10 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
18a20 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
18a30 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
18a40 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61  IfNull);.      a
18a50 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
18a60 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30  isableColCache>0
18a70 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   );.      pParse
18a80 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
18a90 65 2d 2d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e--;.      break
18aa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18ab0 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
18ac0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
18ad0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
18ae0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
18af0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
18b00 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
18b10 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
18b20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18b30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
18b40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
18b50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
18b60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
18b70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
18b80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
18b90 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
18ba0 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b   TK_LT==OP_Lt );
18bb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
18bc0 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  K_LE==OP_Le );. 
18bd0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
18be0 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20  GT==OP_Gt );.   
18bf0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
18c00 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ge );.     
18c10 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d   assert( TK_EQ==
18c20 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61  OP_Eq );.      a
18c30 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50  ssert( TK_NE==OP
18c40 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _Ne );.      tes
18c50 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54  tcase( op==TK_LT
18c60 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
18c70 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b  se( op==TK_LE );
18c80 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18c90 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20   op==TK_GT );.  
18ca0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
18cb0 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20  ==TK_GE );.     
18cc0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
18cd0 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65  K_EQ );.      te
18ce0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
18cf0 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
18d00 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
18d10 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  =0 );.      code
18d20 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28  CompareOperands(
18d30 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
18d40 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46  Left, &r1, &regF
18d50 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20  ree1,.          
18d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d70 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
18d80 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67  Right, &r2, &reg
18d90 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
18da0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
18db0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
18dc0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
18dd0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
18de0 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
18df0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
18e00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18e10 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
18e20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
18e30 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
18e40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18e50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
18e60 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
18e70 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
18e80 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
18e90 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
18ea0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18eb0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
18ec0 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  otNull );.      
18ed0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
18ee0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
18ef0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
18f00 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
18f10 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
18f20 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
18f30 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
18f40 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
18f50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18f60 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
18f70 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65   dest);.      te
18f80 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
18f90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
18fa0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
18fb0 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
18fc0 0a 20 20 20 20 20 20 2f 2a 20 20 20 20 78 20 42  .      /*    x B
18fd0 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20  ETWEEN y AND z. 
18fe0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
18ff0 20 49 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   Is equivalent t
19000 6f 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  o .      **.    
19010 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44    **    x>=y AND
19020 20 78 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a 20   x<=z.      **. 
19030 20 20 20 20 20 2a 2a 20 43 6f 64 65 20 69 74 20       ** Code it 
19040 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20  as such, taking 
19050 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63  care to do the c
19060 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73  ommon subexpress
19070 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65  ion.      ** ele
19080 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a  mentation of x..
19090 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45        */.      E
190a0 78 70 72 20 65 78 70 72 41 6e 64 3b 0a 20 20 20  xpr exprAnd;.   
190b0 20 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74     Expr compLeft
190c0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d  ;.      Expr com
190d0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 45 78  pRight;.      Ex
190e0 70 72 20 65 78 70 72 58 3b 0a 0a 20 20 20 20 20  pr exprX;..     
190f0 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d   exprX = *pExpr-
19100 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78  >pLeft;.      ex
19110 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e  prAnd.op = TK_AN
19120 44 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64  D;.      exprAnd
19130 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65  .pLeft = &compLe
19140 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e  ft;.      exprAn
19150 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70  d.pRight = &comp
19160 52 69 67 68 74 3b 0a 20 20 20 20 20 20 63 6f 6d  Right;.      com
19170 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45  pLeft.op = TK_GE
19180 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74  ;.      compLeft
19190 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
191a0 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e  .      compLeft.
191b0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
191c0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
191d0 72 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67  r;.      compRig
191e0 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20  ht.op = TK_LE;. 
191f0 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70       compRight.p
19200 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
19210 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70       compRight.p
19220 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
19230 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
19240 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e 69 54  ;.      exprX.iT
19250 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78  able = sqlite3Ex
19260 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
19270 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46  e, &exprX, &regF
19280 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
19290 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
192a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
192b0 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  X.op = TK_REGIST
192c0 45 52 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ER;.      testca
192d0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
192e0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
192f0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
19300 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
19310 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
19320 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
19330 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
19340 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
19350 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
19360 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
19370 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
19380 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19390 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp3(v, OP_If, 
193a0 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r1, dest, jumpIf
193b0 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20  Null!=0);.      
193c0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
193d0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
193e0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
193f0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
19400 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
19410 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
19420 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
19430 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
19440 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
19450 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
19460 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  ree2);  .}../*.*
19470 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
19480 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
19490 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
194a0 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
194b0 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
194c0 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
194d0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
194e0 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  lse but executio
194f0 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
19500 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
19510 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
19520 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
19530 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
19540 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
19550 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
19560 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a  nor false) then.
19570 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49  ** jump if jumpI
19580 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f  fNull is SQLITE_
19590 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61  JUMPIFNULL or fa
195a0 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75  ll through if ju
195b0 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30  mpIfNull.** is 0
195c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
195d0 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72  3ExprIfFalse(Par
195e0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
195f0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
19600 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
19610 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
19620 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
19630 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
19640 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
19650 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
19660 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
19670 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
19680 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
19690 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
196a0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
196b0 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45    if( v==0 || pE
196c0 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
196d0 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  ..  /* The value
196e0 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e   of pExpr->op an
196f0 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64  d op are related
19700 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
19710 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78  *.  **       pEx
19720 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
19730 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20    op.  **       
19740 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20  ---------       
19750 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20     ----------.  
19760 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55  **       TK_ISNU
19770 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e  LL          OP_N
19780 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  otNull.  **     
19790 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20    TK_NOTNULL    
197a0 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20       OP_IsNull. 
197b0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20   **       TK_NE 
197c0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
197d0 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Eq.  **       TK
197e0 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20  _EQ             
197f0 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Ne.  **     
19800 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20    TK_GT         
19810 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20       OP_Le.  ** 
19820 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20        TK_LE     
19830 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20           OP_Gt. 
19840 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20   **       TK_GE 
19850 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
19860 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Lt.  **       TK
19870 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _LT             
19880 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a   OP_Ge.  **.  **
19890 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65   For other value
198a0 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20  s of pExpr->op, 
198b0 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  op is undefined 
198c0 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a  and unused..  **
198d0 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b   The value of TK
198e0 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
198f0 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64  nts are arranged
19900 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20   such that we.  
19910 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ** can compute t
19920 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65  he mapping above
19930 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   using the follo
19940 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e  wing expression.
19950 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20  .  ** Assert()s 
19960 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
19970 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63  computation is c
19980 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f  orrect..  */.  o
19990 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b  p = ((pExpr->op+
199a0 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31  (TK_ISNULL&1))^1
199b0 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b  )-(TK_ISNULL&1);
199c0 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f  ..  /* Verify co
199d0 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20  rrect alignment 
199e0 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
199f0 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20  onstants.  */.  
19a00 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
19a10 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
19a20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  op==OP_NotNull )
19a30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
19a40 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op!=TK_NOTNUL
19a50 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75  L || op==OP_IsNu
19a60 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
19a70 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45  pExpr->op!=TK_NE
19a80 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b   || op==OP_Eq );
19a90 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
19aa0 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f  ->op!=TK_EQ || o
19ab0 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73  p==OP_Ne );.  as
19ac0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
19ad0 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LT || op==OP
19ae0 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ge );.  assert(
19af0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
19b00 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29  E || op==OP_Gt )
19b10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
19b20 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  r->op!=TK_GT || 
19b30 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61  op==OP_Le );.  a
19b40 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
19b50 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GE || op==O
19b60 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63  P_Lt );..  switc
19b70 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
19b80 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
19b90 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
19ba0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
19bb0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
19bc0 73 65 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  se( pParse->disa
19bd0 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29  bleColCache==0 )
19be0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
19bf0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
19c00 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
19c10 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
19c20 6c 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  l);.      pParse
19c30 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
19c40 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e++;.      sqlit
19c50 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
19c60 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
19c70 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
19c80 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73  fNull);.      as
19c90 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69  sert( pParse->di
19ca0 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20  sableColCache>0 
19cb0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
19cc0 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
19cd0 2d 2d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  --;.      break;
19ce0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19cf0 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69  TK_OR: {.      i
19d00 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
19d10 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
19d20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19d30 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
19d40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
19d50 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
19d60 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a  eColCache==0 );.
19d70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19d80 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
19d90 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
19da0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  , jumpIfNull^SQL
19db0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
19dc0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
19dd0 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b  isableColCache++
19de0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
19df0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
19e00 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
19e10 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
19e20 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ll);.      asser
19e30 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62  t( pParse->disab
19e40 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a  leColCache>0 );.
19e50 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69        pParse->di
19e60 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b  sableColCache--;
19e70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19e80 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
19e90 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
19ea0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
19eb0 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
19ec0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
19ed0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
19ee0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
19ef0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
19f00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19f10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
19f20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
19f30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
19f40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
19f50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
19f60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
19f70 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
19f80 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a  e( op==TK_LT );.
19f90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19fa0 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  op==TK_LE );.   
19fb0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
19fc0 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  =TK_GT );.      
19fd0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
19fe0 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GE );.      tes
19ff0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51  tcase( op==TK_EQ
1a000 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1a010 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b  se( op==TK_NE );
1a020 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a030 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1a040 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
1a050 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72  areOperands(pPar
1a060 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1a070 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65 31  , &r1, &regFree1
1a080 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0a0 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
1a0b0 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65 65  t, &r2, &regFree
1a0c0 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
1a0d0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
1a0e0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
1a0f0 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
1a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a110 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
1a120 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1a130 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1a140 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1a150 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1a160 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1a170 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1a180 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
1a190 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1a1a0 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 74 65  NULL: {.      te
1a1b0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1a1c0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  SNULL );.      t
1a1d0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1a1e0 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
1a1f0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1a200 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1a210 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1a220 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1a230 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a240 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
1a250 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
1a260 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1a270 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1a280 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1a290 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
1a2a0 20 20 20 20 20 2f 2a 20 20 20 20 78 20 42 45 54       /*    x BET
1a2b0 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
1a2c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
1a2d0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
1a2e0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1a2f0 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
1a300 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  <=z.      **.   
1a310 20 20 20 2a 2a 20 43 6f 64 65 20 69 74 20 61 73     ** Code it as
1a320 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61   such, taking ca
1a330 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  re to do the com
1a340 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f  mon subexpressio
1a350 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65  n.      ** eleme
1a360 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20  ntation of x..  
1a370 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70      */.      Exp
1a380 72 20 65 78 70 72 41 6e 64 3b 0a 20 20 20 20 20  r exprAnd;.     
1a390 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a   Expr compLeft;.
1a3a0 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70 52        Expr compR
1a3b0 69 67 68 74 3b 0a 20 20 20 20 20 20 45 78 70 72  ight;.      Expr
1a3c0 20 65 78 70 72 58 3b 0a 0a 20 20 20 20 20 20 65   exprX;..      e
1a3d0 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70  xprX = *pExpr->p
1a3e0 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72  Left;.      expr
1a3f0 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  And.op = TK_AND;
1a400 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70  .      exprAnd.p
1a410 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74  Left = &compLeft
1a420 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e  ;.      exprAnd.
1a430 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69  pRight = &compRi
1a440 67 68 74 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c  ght;.      compL
1a450 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a  eft.op = TK_GE;.
1a460 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70        compLeft.p
1a470 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
1a480 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52       compLeft.pR
1a490 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
1a4a0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
1a4b0 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74  .      compRight
1a4c0 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20  .op = TK_LE;.   
1a4d0 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65     compRight.pLe
1a4e0 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20  ft = &exprX;.   
1a4f0 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69     compRight.pRi
1a500 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ght = pExpr->pLi
1a510 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
1a520 20 20 20 20 20 20 65 78 70 72 58 2e 69 54 61 62        exprX.iTab
1a530 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  le = sqlite3Expr
1a540 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1a550 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65   &exprX, &regFre
1a560 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
1a570 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1a580 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e   );.      exprX.
1a590 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
1a5a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1a5b0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1a5c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a5d0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1a5e0 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
1a5f0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1a600 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a610 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
1a620 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
1a630 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1a640 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
1a650 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1a660 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a670 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp3(v, OP_IfNot
1a680 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
1a690 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
1a6a0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1a6b0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1a6c0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1a6d0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1a6e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1a6f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
1a700 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1a710 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
1a720 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1a730 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1a740 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  gFree2);.}../*.*
1a750 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70  * Do a deep comp
1a760 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78  arison of two ex
1a770 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20  pression trees. 
1a780 20 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f   Return TRUE (no
1a790 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68  n-zero).** if th
1a7a0 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  ey are identical
1a7b0 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53   and return FALS
1a7c0 45 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  E if they differ
1a7d0 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a   in any way..**.
1a7e0 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69  ** Sometimes thi
1a7f0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
1a800 65 74 75 72 6e 20 46 41 4c 53 45 20 65 76 65 6e  eturn FALSE even
1a810 20 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72   if the two expr
1a820 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c  essions.** reall
1a830 79 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  y are equivalent
1a840 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  .  If we cannot 
1a850 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65  prove that the e
1a860 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a  xpressions are.*
1a870 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20  * identical, we 
1a880 72 65 74 75 72 6e 20 46 41 4c 53 45 20 6a 75 73  return FALSE jus
1a890 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53  t to be safe.  S
1a8a0 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
1a8b0 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 66 61 6c  e.** returns fal
1a8c0 73 65 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20  se, then you do 
1a8d0 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20  not really know 
1a8e0 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74  for certain if t
1a8f0 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73  he two.** expres
1a900 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
1a910 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20  me.  But if you 
1a920 67 65 74 20 61 20 54 52 55 45 20 72 65 74 75 72  get a TRUE retur
1a930 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63  n, then you.** c
1a940 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65  an be sure the e
1a950 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
1a960 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65  he same.  In the
1a970 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a   places where.**
1a980 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1a990 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e   used, it does n
1a9a0 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61  ot hurt to get a
1a9b0 6e 20 65 78 74 72 61 20 46 41 4c 53 45 20 2d 20  n extra FALSE - 
1a9c0 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67  that.** just mig
1a9d0 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d  ht result in som
1a9e0 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65  e slightly slowe
1a9f0 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74  r code.  But ret
1aa00 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63  urning.** an inc
1aa10 6f 72 72 65 63 74 20 54 52 55 45 20 63 6f 75 6c  orrect TRUE coul
1aa20 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66  d lead to a malf
1aa30 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
1aa40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
1aa50 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70  re(Expr *pA, Exp
1aa60 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b  r *pB){.  int i;
1aa70 0a 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42  .  if( pA==0||pB
1aa80 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1aa90 6e 20 70 42 3d 3d 70 41 3b 0a 20 20 7d 0a 20 20  n pB==pA;.  }.  
1aaa0 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e  if( pA->op!=pB->
1aab0 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  op ) return 0;. 
1aac0 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20   if( (pA->flags 
1aad0 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d  & EP_Distinct)!=
1aae0 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pB->flags & EP_
1aaf0 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74 75  Distinct) ) retu
1ab00 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
1ab10 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
1ab20 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70  pA->pLeft, pB->p
1ab30 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e 20 30  Left) ) return 0
1ab40 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
1ab50 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
1ab60 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67  pRight, pB->pRig
1ab70 68 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ht) ) return 0;.
1ab80 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 20    if( pA->pList 
1ab90 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 70  ){.    if( pB->p
1aba0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1abb0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   0;.    if( pA->
1abc0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42  pList->nExpr!=pB
1abd0 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  ->pList->nExpr )
1abe0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66   return 0;.    f
1abf0 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c  or(i=0; i<pA->pL
1ac00 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1ac10 7b 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c  {.      if( !sql
1ac20 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
1ac30 70 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  pA->pList->a[i].
1ac40 70 45 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74  pExpr, pB->pList
1ac50 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
1ac60 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1ac70 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1ac80 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 2d  .  }else if( pB-
1ac90 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65  >pList ){.    re
1aca0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
1acb0 28 20 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c  ( pA->pSelect ||
1acc0 20 70 42 2d 3e 70 53 65 6c 65 63 74 20 29 20 72   pB->pSelect ) r
1acd0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
1ace0 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69  A->iTable!=pB->i
1acf0 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f  Table || pA->iCo
1ad00 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d  lumn!=pB->iColum
1ad10 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  n ) return 0;.  
1ad20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43  if( pA->op!=TK_C
1ad30 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 74 6f 6b  OLUMN && pA->tok
1ad40 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20  en.z ){.    if( 
1ad50 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29  pB->token.z==0 )
1ad60 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
1ad70 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d  f( pB->token.n!=
1ad80 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65  pA->token.n ) re
1ad90 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
1ada0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
1adb0 28 63 68 61 72 2a 29 70 41 2d 3e 74 6f 6b 65 6e  (char*)pA->token
1adc0 2e 7a 2c 28 63 68 61 72 2a 29 70 42 2d 3e 74 6f  .z,(char*)pB->to
1add0 6b 65 6e 2e 7a 2c 70 42 2d 3e 74 6f 6b 65 6e 2e  ken.z,pB->token.
1ade0 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  n)!=0 ){.      r
1adf0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1ae00 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
1ae10 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  .../*.** Add a n
1ae20 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
1ae30 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  e pAggInfo->aCol
1ae40 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
1ae50 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
1ae60 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
1ae70 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
1ae80 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
1ae90 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
1aea0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
1aeb0 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c  ggInfoColumn(sql
1aec0 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
1aed0 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
1aee0 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f   i;.  pInfo->aCo
1aef0 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  l = sqlite3Array
1af00 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
1af10 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66   db,.       pInf
1af20 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  o->aCol,.       
1af30 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43  sizeof(pInfo->aC
1af40 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33  ol[0]),.       3
1af50 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
1af60 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >nColumn,.      
1af70 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e   &pInfo->nColumn
1af80 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69  Alloc,.       &i
1af90 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
1afa0 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41  ;.}    ../*.** A
1afb0 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
1afc0 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
1afd0 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e  ->aFunc[] array.
1afe0 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
1aff0 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
1b000 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
1b010 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
1b020 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
1b030 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
1b040 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e  nt addAggInfoFun
1b050 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  c(sqlite3 *db, A
1b060 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
1b070 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
1b080 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->aFunc = sqlite
1b090 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
1b0a0 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20         db, .    
1b0b0 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c     pInfo->aFunc,
1b0c0 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
1b0d0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c  Info->aFunc[0]),
1b0e0 0a 20 20 20 20 20 20 20 33 2c 0a 20 20 20 20 20  .       3,.     
1b0f0 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c    &pInfo->nFunc,
1b100 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
1b110 6e 46 75 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20 20  nFuncAlloc,.    
1b120 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74     &i.  );.  ret
1b130 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
1b140 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 78  .** This is an x
1b150 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70  Func for walkExp
1b160 72 54 72 65 65 28 29 20 75 73 65 64 20 74 6f 20  rTree() used to 
1b170 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 73 71  implement .** sq
1b180 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
1b190 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20 53  Aggregates().  S
1b1a0 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ee sqlite3ExprAn
1b1b0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a  alyzeAggregates.
1b1c0 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** for additiona
1b1d0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
1b1e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b1f0 65 20 61 6e 61 6c 79 7a 65 73 20 74 68 65 20 61  e analyzes the a
1b200 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1b210 6e 20 61 74 20 70 45 78 70 72 2e 0a 2a 2f 0a 73  n at pExpr..*/.s
1b220 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
1b230 65 41 67 67 72 65 67 61 74 65 28 76 6f 69 64 20  eAggregate(void 
1b240 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78  *pArg, Expr *pEx
1b250 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pr){.  int i;.  
1b260 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
1b270 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20   = (NameContext 
1b280 2a 29 70 41 72 67 3b 0a 20 20 50 61 72 73 65 20  *)pArg;.  Parse 
1b290 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  *pParse = pNC->p
1b2a0 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74  Parse;.  SrcList
1b2b0 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
1b2c0 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67  ->pSrcList;.  Ag
1b2d0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
1b2e0 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b  = pNC->pAggInfo;
1b2f0 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
1b300 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
1b310 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
1b320 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
1b330 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
1b340 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1b350 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  the column is in
1b360 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c   one of the tabl
1b370 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20  es in the FROM. 
1b380 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f       ** clause o
1b390 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
1b3a0 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69  query */.      i
1b3b0 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20  f( pSrcList ){. 
1b3c0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
1b3d0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1b3e0 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b  m = pSrcList->a;
1b3f0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
1b400 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
1b410 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
1b420 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
1b430 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
1b440 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pCol;.         
1b450 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
1b460 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
1b470 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
1b480 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
1b490 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
1b4a0 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72  means that pExpr
1b4b0 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
1b4c0 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
1b4d0 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  * that is in the
1b4e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1b4f0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
1b500 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20  ery.  .         
1b510 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
1b520 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74    ** Make an ent
1b530 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
1b540 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  n in pAggInfo->a
1b550 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20  Col[] if there. 
1b560 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73             ** is
1b570 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68   not an entry th
1b580 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
1b590 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1b5a0 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
1b5b0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
1b5c0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  = pAggInfo->aCol
1b5d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
1b5e0 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66  r(k=0; k<pAggInf
1b5f0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c  o->nColumn; k++,
1b600 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
1b610 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
1b620 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
1b630 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
1b640 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1b650 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  l->iColumn==pExp
1b660 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
1b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
1b680 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
1b690 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1b6a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
1b6b0 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d  f( (k>=pAggInfo-
1b6c0 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20  >nColumn).      
1b6d0 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61         && (k = a
1b6e0 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
1b6f0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
1b700 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20  Info))>=0 .     
1b710 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
1b720 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
1b730 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b  pAggInfo->aCol[k
1b740 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
1b750 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45   pCol->pTab = pE
1b760 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
1b770 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
1b780 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
1b790 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
1b7a0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
1b7b0 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
1b7c0 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
1b7d0 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
1b7e0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1b7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
1b800 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
1b810 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
1b820 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
1b830 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
1b840 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
1b850 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
1b860 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1b870 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
1b880 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
1b890 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
1b8a0 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
1b8b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b8c0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1b8d0 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
1b8e0 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
1b8f0 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
1b900 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
1b910 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
1b920 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
1b930 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
1b940 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
1b950 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b970 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
1b980 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
1b990 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
1b9a0 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
1b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
1b9c0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
1b9d0 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
1b9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9f0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
1ba00 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
1ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1ba20 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
1ba30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ba40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ba50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ba60 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
1ba70 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
1ba80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1ba90 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
1baa0 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
1bab0 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
1bac0 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
1bad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1bae0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1baf0 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
1bb00 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
1bb10 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
1bb20 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
1bb30 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
1bb40 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
1bb50 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
1bb60 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
1bb70 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
1bb80 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
1bb90 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
1bba0 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
1bbb0 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
1bbc0 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
1bbd0 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
1bbe0 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
1bbf0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1bc00 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
1bc10 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
1bc20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
1bc30 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
1bc40 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
1bc50 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
1bc60 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20   = k;.          
1bc70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1bc80 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45     } /* endif pE
1bc90 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
1bca0 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20  em->iCursor */. 
1bcb0 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
1bcc0 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69  loop over pSrcLi
1bcd0 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  st */.      }.  
1bce0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1bcf0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1bd00 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
1bd10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 4e 43        /* The pNC
1bd20 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65 73 74  ->nDepth==0 test
1bd30 20 63 61 75 73 65 73 20 61 67 67 72 65 67 61 74   causes aggregat
1bd40 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73  e functions in s
1bd50 75 62 71 75 65 72 69 65 73 0a 20 20 20 20 20 20  ubqueries.      
1bd60 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72 65 64  ** to be ignored
1bd70 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4e   */.      if( pN
1bd80 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a  C->nDepth==0 ){.
1bd90 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
1bda0 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72   to see if pExpr
1bdb0 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
1bdc0 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65  of another aggre
1bdd0 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  gate .        **
1bde0 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
1bdf0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
1be00 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74   pAggInfo struct
1be10 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ure.        */. 
1be20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
1be30 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65  gInfo_func *pIte
1be40 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  m = pAggInfo->aF
1be50 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  unc;.        for
1be60 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
1be70 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49  ->nFunc; i++, pI
1be80 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
1be90 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1bea0 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e  rCompare(pItem->
1beb0 70 45 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b  pExpr, pExpr) ){
1bec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
1bed0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
1bee0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bef0 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66    if( i>=pAggInf
1bf00 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20  o->nFunc ){.    
1bf10 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69        /* pExpr i
1bf20 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b  s original.  Mak
1bf30 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  e a new entry in
1bf40 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
1bf50 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  [].          */.
1bf60 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63            u8 enc
1bf70 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64   = ENC(pParse->d
1bf80 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  b);.          i 
1bf90 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  = addAggInfoFunc
1bfa0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67  (pParse->db, pAg
1bfb0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
1bfc0 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20    if( i>=0 ){.  
1bfd0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20            pItem 
1bfe0 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  = &pAggInfo->aFu
1bff0 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  nc[i];.         
1c000 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
1c010 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
1c020 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d       pItem->iMem
1c030 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1c040 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  m;.            p
1c050 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71  Item->pFunc = sq
1c060 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
1c070 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  n(pParse->db,.  
1c080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c090 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
1c0a0 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
1c0b0 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20  oken.n,.        
1c0c0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1c0d0 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  ->pList ? pExpr-
1c0e0 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  >pList->nExpr : 
1c0f0 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  0, enc, 0);.    
1c100 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
1c110 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  r->flags & EP_Di
1c120 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
1c130 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
1c140 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  Distinct = pPars
1c150 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
1c160 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1c170 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
1c180 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  m->iDistinct = -
1c190 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
1c1a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1c1b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
1c1c0 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69  * Make pExpr poi
1c1d0 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70  nt to the approp
1c1e0 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e  riate pAggInfo->
1c1f0 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20  aFunc[] entry.  
1c200 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1c210 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69   pExpr->iAgg = i
1c220 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
1c230 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
1c240 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65  Info;.        re
1c250 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
1c260 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1c270 52 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b  Recursively walk
1c280 20 73 75 62 71 75 65 72 69 65 73 20 6c 6f 6f 6b   subqueries look
1c290 69 6e 67 20 66 6f 72 20 54 4b 5f 43 4f 4c 55 4d  ing for TK_COLUM
1c2a0 4e 20 6e 6f 64 65 73 20 74 68 61 74 20 6e 65 65  N nodes that nee
1c2b0 64 0a 20 20 2a 2a 20 74 6f 20 62 65 20 63 68 61  d.  ** to be cha
1c2c0 6e 67 65 64 20 74 6f 20 54 4b 5f 41 47 47 5f 43  nged to TK_AGG_C
1c2d0 4f 4c 55 4d 4e 2e 20 20 42 75 74 20 69 6e 63 72  OLUMN.  But incr
1c2e0 65 6d 65 6e 74 20 6e 44 65 70 74 68 20 73 6f 20  ement nDepth so 
1c2f0 74 68 61 74 0a 20 20 2a 2a 20 54 4b 5f 41 47 47  that.  ** TK_AGG
1c300 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20  _FUNCTION nodes 
1c310 69 6e 20 73 75 62 71 75 65 72 69 65 73 20 77 69  in subqueries wi
1c320 6c 6c 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e  ll be unchanged.
1c330 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  .  */.  if( pExp
1c340 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  r->pSelect ){.  
1c350 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b    pNC->nDepth++;
1c360 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65 63 74 45  .    walkSelectE
1c370 78 70 72 28 70 45 78 70 72 2d 3e 70 53 65 6c 65  xpr(pExpr->pSele
1c380 63 74 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  ct, analyzeAggre
1c390 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20 20 20  gate, pNC);.    
1c3a0 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20  pNC->nDepth--;. 
1c3b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1c3c0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
1c3d0 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
1c3e0 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  sion looking for
1c3f0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1c400 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
1c410 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e  variables that n
1c420 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20  eed to be added 
1c430 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61  to the pParse->a
1c440 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20  Agg[] array..** 
1c450 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  Make additional 
1c460 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20 70  entries to the p
1c470 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72  Parse->aAgg[] ar
1c480 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79  ray as necessary
1c490 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1c4a0 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
1c4b0 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
1c4c0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1c4d0 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c  has been.** anal
1c4e0 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 45  yzed by sqlite3E
1c4f0 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
1c500 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
1c510 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1c520 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74  regates(NameCont
1c530 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a  ext *pNC, Expr *
1c540 70 45 78 70 72 29 7b 0a 20 20 77 61 6c 6b 45 78  pExpr){.  walkEx
1c550 70 72 54 72 65 65 28 70 45 78 70 72 2c 20 61 6e  prTree(pExpr, an
1c560 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c 20  alyzeAggregate, 
1c570 70 4e 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pNC);.}../*.** C
1c580 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41  all sqlite3ExprA
1c590 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
1c5a0 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70  () for every exp
1c5b0 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a  ression in an.**
1c5c0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
1c5d0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
1c5e0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
1c5f0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1c600 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20  r is found, the 
1c610 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74 20  analysis is cut 
1c620 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  short..*/.void s
1c630 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
1c640 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e  eAggList(NameCon
1c650 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c  text *pNC, ExprL
1c660 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73  ist *pList){.  s
1c670 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1c680 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
1c690 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
1c6a0 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65   ){.    for(pIte
1c6b0 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
1c6c0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
1c6d0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
1c6e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1c6f0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
1c700 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70  es(pNC, pItem->p
1c710 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
1c720 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
1c730 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  te or deallocate
1c740 20 74 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72   temporary use r
1c750 65 67 69 73 74 65 72 73 20 64 75 72 69 6e 67 20  egisters during 
1c760 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e  code generation.
1c770 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
1c780 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  etTempReg(Parse 
1c790 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20  *pParse){.  if( 
1c7a0 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
1c7b0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1c7c0 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  n ++pParse->nMem
1c7d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1c7e0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
1c7f0 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  --pParse->nTempR
1c800 65 67 5d 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  eg];.}.void sqli
1c810 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1c820 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
1c830 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66   int iReg){.  if
1c840 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73 65  ( iReg && pParse
1c850 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79  ->nTempReg<Array
1c860 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65  Size(pParse->aTe
1c870 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 73 71  mpReg) ){.    sq
1c880 6c 69 74 65 33 45 78 70 72 57 72 69 74 61 62 6c  lite3ExprWritabl
1c890 65 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65  eRegister(pParse
1c8a0 2c 20 69 52 65 67 2c 20 69 52 65 67 29 3b 0a 20  , iReg, iReg);. 
1c8b0 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70     pParse->aTemp
1c8c0 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d  Reg[pParse->nTem
1c8d0 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a  pReg++] = iReg;.
1c8e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
1c8f0 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63  ocate or dealloc
1c900 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e  ate a block of n
1c910 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20  Reg consecutive 
1c920 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74  registers.*/.int
1c930 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1c940 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
1c950 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  se, int nReg){. 
1c960 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d   int i, n;.  i =
1c970 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
1c980 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65  eg;.  n = pParse
1c990 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69  ->nRangeReg;.  i
1c9a0 66 28 20 6e 52 65 67 3c 3d 6e 20 26 26 20 21 75  f( nReg<=n && !u
1c9b0 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
1c9c0 28 70 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d  (pParse, i, i+n-
1c9d0 31 29 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  1) ){.    pParse
1c9e0 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e  ->iRangeReg += n
1c9f0 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Reg;.    pParse-
1ca00 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52  >nRangeReg -= nR
1ca10 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  eg;.  }else{.   
1ca20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65   i = pParse->nMe
1ca30 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
1ca40 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20  >nMem += nReg;. 
1ca50 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
1ca60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
1ca70 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61  easeTempRange(Pa
1ca80 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1ca90 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29   iReg, int nReg)
1caa0 7b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61  {.  if( nReg>pPa
1cab0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29  rse->nRangeReg )
1cac0 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52  {.    pParse->nR
1cad0 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a  angeReg = nReg;.
1cae0 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e      pParse->iRan
1caf0 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  geReg = iReg;.  
1cb00 7d 0a 7d 0a                                      }.}.