/ Hex Artifact Content
Login

Artifact 4531fb111f8addb74f785435efa05699d906c269:


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 35 33 20 32 30 30 38 2f 30 33 2f 31 30 20  .353 2008/03/10 
0220: 31 34 3a 31 32 3a 35 33 20 64 72 68 20 45 78 70  14:12:53 drh Exp
0230: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0240: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
0250: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0260: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0270: 65 20 27 61 66 66 69 6e 69 74 79 27 20 6f 66 20  e 'affinity' of 
0280: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
0290: 45 78 70 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  Expr if any..**.
02a0: 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
02b0: 20 63 6f 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72   column, a refer
02c0: 65 6e 63 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  ence to a column
02d0: 20 76 69 61 20 61 6e 20 27 41 53 27 20 61 6c 69   via an 'AS' ali
02e0: 61 73 2c 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d  as,.** or a sub-
02f0: 73 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  select with a co
0300: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 65 74 75  lumn as the retu
0310: 72 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  rn value, then t
0320: 68 65 20 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  he .** affinity 
0330: 6f 66 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  of that column i
0340: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
0350: 72 77 69 73 65 2c 20 30 78 30 30 20 69 73 20 72  rwise, 0x00 is r
0360: 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69  eturned,.** indi
0370: 63 61 74 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69  cating no affini
0380: 74 79 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ty for the expre
0390: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ssion..**.** i.e
03a0: 2e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  . the WHERE clau
03b0: 73 65 20 65 78 70 72 65 73 73 73 69 6f 6e 73 20  se expresssions 
03c0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
03d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a   statements all.
03e0: 2a 2a 20 68 61 76 65 20 61 6e 20 61 66 66 69 6e  ** have an affin
03f0: 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ity:.**.** CREAT
0400: 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a  E TABLE t1(a);.*
0410: 2a 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  * SELECT * FROM 
0420: 74 31 20 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53  t1 WHERE a;.** S
0430: 45 4c 45 43 54 20 61 20 41 53 20 62 20 46 52 4f  ELECT a AS b FRO
0440: 4d 20 74 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a  M t1 WHERE b;.**
0450: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0460: 31 20 57 48 45 52 45 20 28 73 65 6c 65 63 74 20  1 WHERE (select 
0470: 61 20 66 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63  a from t1);.*/.c
0480: 68 61 72 20 73 71 6c 69 74 65 33 45 78 70 72 41  har sqlite3ExprA
0490: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
04a0: 78 70 72 29 7b 0a 20 20 69 6e 74 20 6f 70 20 3d  xpr){.  int op =
04b0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
04c0: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
04d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
04e0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
04f0: 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  y(pExpr->pSelect
0500: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
0510: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0520: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0530: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0540: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 72 65 74  _CAST ){.    ret
0550: 75 72 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e  urn sqlite3Affin
0560: 69 74 79 54 79 70 65 28 26 70 45 78 70 72 2d 3e  ityType(&pExpr->
0570: 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  token);.  }.#end
0580: 69 66 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70  if.  return pExp
0590: 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a  r->affinity;.}..
05a0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
05b0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
05c0: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
05d0: 70 45 78 70 72 20 74 6f 20 62 65 20 74 68 65 20  pExpr to be the 
05e0: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
05f0: 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79 20 70  uence named by p
0600: 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e 20  Token.   Return 
0610: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
0620: 20 72 65 76 69 73 65 64 20 65 78 70 72 65 73 73   revised express
0630: 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ion..** The coll
0640: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  ating sequence i
0650: 73 20 6d 61 72 6b 65 64 20 61 73 20 22 65 78 70  s marked as "exp
0660: 6c 69 63 69 74 22 20 75 73 69 6e 67 20 74 68 65  licit" using the
0670: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 0a 2a   EP_ExpCollate.*
0680: 2a 20 66 6c 61 67 2e 20 20 41 6e 20 65 78 70 6c  * flag.  An expl
0690: 69 63 69 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  icit collating s
06a0: 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 6f 76 65  equence will ove
06b0: 72 72 69 64 65 20 69 6d 70 6c 69 63 69 74 0a 2a  rride implicit.*
06c0: 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * collating sequ
06d0: 65 6e 63 65 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ences..*/.Expr *
06e0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f  sqlite3ExprSetCo
06f0: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
0700: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54  , Expr *pExpr, T
0710: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
0720: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 30 3b  char *zColl = 0;
0730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
0740: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
0750: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
0760: 63 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20  ce */.  CollSeq 
0770: 2a 70 43 6f 6c 6c 3b 0a 20 20 7a 43 6f 6c 6c 20  *pColl;.  zColl 
0780: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
0790: 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
07a0: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
07b0: 20 70 45 78 70 72 20 26 26 20 7a 43 6f 6c 6c 20   pExpr && zColl 
07c0: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
07d0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
07e0: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
07f0: 6c 2c 20 2d 31 29 3b 0a 20 20 20 20 69 66 28 20  l, -1);.    if( 
0800: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
0810: 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43  Expr->pColl = pC
0820: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 45 78 70 72  oll;.      pExpr
0830: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78  ->flags |= EP_Ex
0840: 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 0a  pCollate;.    }.
0850: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
0860: 65 65 28 7a 43 6f 6c 6c 29 3b 0a 20 20 72 65 74  ee(zColl);.  ret
0870: 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a  urn pExpr;.}../*
0880: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
0890: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
08a0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
08b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
08c0: 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20  pr. If.** there 
08d0: 69 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f  is no default co
08e0: 6c 6c 61 74 69 6f 6e 20 74 79 70 65 2c 20 72 65  llation type, re
08f0: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53  turn 0..*/.CollS
0900: 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43  eq *sqlite3ExprC
0910: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
0920: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
0930: 72 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  r){.  CollSeq *p
0940: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20  Coll = 0;.  if( 
0950: 70 45 78 70 72 20 29 7b 0a 20 20 20 20 69 6e 74  pExpr ){.    int
0960: 20 6f 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d   op;.    pColl =
0970: 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20   pExpr->pColl;. 
0980: 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f     op = pExpr->o
0990: 70 3b 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d  p;.    if( (op==
09a0: 54 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54  TK_CAST || op==T
09b0: 4b 5f 55 50 4c 55 53 29 20 26 26 20 21 70 43 6f  K_UPLUS) && !pCo
09c0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ll ){.      retu
09d0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
09e0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
09f0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
0a00: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c   }.  }.  if( sql
0a10: 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71  ite3CheckCollSeq
0a20: 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20  (pParse, pColl) 
0a30: 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ){ .    pColl = 
0a40: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
0a50: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
0a60: 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70 65 72  pExpr is an oper
0a70: 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  and of a compari
0a80: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61  son operator.  a
0a90: 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79  ff2 is the.** ty
0aa0: 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  pe affinity of t
0ab0: 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64  he other operand
0ac0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
0ad0: 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74  returns the.** t
0ae0: 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  ype affinity tha
0af0: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
0b00: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69   for the compari
0b10: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
0b20: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d  .char sqlite3Com
0b30: 70 61 72 65 41 66 66 69 6e 69 74 79 28 45 78 70  pareAffinity(Exp
0b40: 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61  r *pExpr, char a
0b50: 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ff2){.  char aff
0b60: 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  1 = sqlite3ExprA
0b70: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
0b80: 20 20 69 66 28 20 61 66 66 31 20 26 26 20 61 66    if( aff1 && af
0b90: 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74  f2 ){.    /* Bot
0ba0: 68 20 73 69 64 65 73 20 6f 66 20 74 68 65 20 63  h sides of the c
0bb0: 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f  omparison are co
0bc0: 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61  lumns. If one ha
0bd0: 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a  s numeric.    **
0be0: 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65 20 74   affinity, use t
0bf0: 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65 20 75  hat. Otherwise u
0c00: 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a  se no affinity..
0c10: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
0c20: 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
0c30: 66 66 69 6e 69 74 79 28 61 66 66 31 29 20 7c 7c  ffinity(aff1) ||
0c40: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
0c50: 63 41 66 66 69 6e 69 74 79 28 61 66 66 32 29 20  cAffinity(aff2) 
0c60: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
0c70: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
0c80: 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  IC;.    }else{. 
0c90: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
0ca0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
0cb0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
0cc0: 61 66 66 31 20 26 26 20 21 61 66 66 32 20 29 7b  aff1 && !aff2 ){
0cd0: 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20  .    /* Neither 
0ce0: 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70  side of the comp
0cf0: 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75  arison is a colu
0d00: 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 65  mn.  Compare the
0d10: 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 20  .    ** results 
0d20: 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f  directly..    */
0d30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
0d40: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d  TE_AFF_NONE;.  }
0d50: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65  else{.    /* One
0d60: 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d   side is a colum
0d70: 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69 73 20  n, the other is 
0d80: 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c  not. Use the col
0d90: 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a  umns affinity. *
0da0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 66  /.    assert( af
0db0: 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30  f1==0 || aff2==0
0dc0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   );.    return (
0dd0: 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a 20 20  aff1 + aff2);.  
0de0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  }.}../*.** pExpr
0df0: 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   is a comparison
0e00: 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65 74 75   operator.  Retu
0e10: 72 6e 20 74 68 65 20 74 79 70 65 20 61 66 66 69  rn the type affi
0e20: 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64  nity that should
0e30: 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74  .** be applied t
0e40: 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20  o both operands 
0e50: 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74  prior to doing t
0e60: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a  he comparison..*
0e70: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 63 6f  /.static char co
0e80: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
0e90: 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  (Expr *pExpr){. 
0ea0: 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61 73 73   char aff;.  ass
0eb0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
0ec0: 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_EQ || pExpr->
0ed0: 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78  op==TK_IN || pEx
0ee0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pr->op==TK_LT ||
0ef0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
0f00: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70  ->op==TK_GT || p
0f10: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20  Expr->op==TK_GE 
0f20: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
0f30: 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  _LE ||.         
0f40: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
0f50: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
0f60: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20  Expr->pLeft );. 
0f70: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78   aff = sqlite3Ex
0f80: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
0f90: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
0fa0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b  pExpr->pRight ){
0fb0: 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74  .    aff = sqlit
0fc0: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
0fd0: 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  y(pExpr->pRight,
0fe0: 20 61 66 66 29 3b 0a 20 20 7d 0a 20 20 65 6c 73   aff);.  }.  els
0ff0: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65  e if( pExpr->pSe
1000: 6c 65 63 74 20 29 7b 0a 20 20 20 20 61 66 66 20  lect ){.    aff 
1010: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
1020: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
1030: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
1040: 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66  >a[0].pExpr, aff
1050: 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  );.  }.  else if
1060: 28 20 21 61 66 66 20 29 7b 0a 20 20 20 20 61 66  ( !aff ){.    af
1070: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f = SQLITE_AFF_N
1080: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ONE;.  }.  retur
1090: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
10a0: 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61  pExpr is a compa
10b0: 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e  rison expression
10c0: 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20  , eg. '=', '<', 
10d0: 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20  IN(...) etc..** 
10e0: 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20  idx_affinity is 
10f0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
1100: 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  an indexed colum
1110: 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a  n. Return true.*
1120: 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77  * if the index w
1130: 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64 78  ith affinity idx
1140: 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65  _affinity may be
1150: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
1160: 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72  nt.** the compar
1170: 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a  ison in pExpr..*
1180: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64  /.int sqlite3Ind
1190: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70  exAffinityOk(Exp
11a0: 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69  r *pExpr, char i
11b0: 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20  dx_affinity){.  
11c0: 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61  char aff = compa
11d0: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45  risonAffinity(pE
11e0: 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28 20  xpr);.  switch( 
11f0: 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65 20  aff ){.    case 
1200: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a  SQLITE_AFF_NONE:
1210: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1220: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1230: 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20  _AFF_TEXT:.     
1240: 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66 69   return idx_affi
1250: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
1260: 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61 75  _TEXT;.    defau
1270: 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
1280: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
1290: 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61 66  cAffinity(idx_af
12a0: 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a  finity);.  }.}..
12b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
12c0: 20 50 35 20 76 61 6c 75 65 20 74 68 61 74 20 73   P5 value that s
12d0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
12e0: 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61  r a binary compa
12f0: 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20  rison.** opcode 
1300: 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74  (OP_Eq, OP_Ge et
1310: 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  c.) used to comp
1320: 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20 70  are pExpr1 and p
1330: 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  Expr2..*/.static
1340: 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61 72   u8 binaryCompar
1350: 65 50 35 28 45 78 70 72 20 2a 70 45 78 70 72 31  eP5(Expr *pExpr1
1360: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c 20  , Expr *pExpr2, 
1370: 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
1380: 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63 68 61  .  u8 aff = (cha
1390: 72 29 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  r)sqlite3ExprAff
13a0: 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a 20  inity(pExpr2);. 
13b0: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f   aff = sqlite3Co
13c0: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
13d0: 78 70 72 31 2c 20 61 66 66 29 20 7c 20 6a 75 6d  xpr1, aff) | jum
13e0: 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72  pIfNull;.  retur
13f0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
1400: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1410: 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   to the collatio
1420: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
1430: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62  should be used b
1440: 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f  y.** a binary co
1450: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
1460: 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66  r comparing pLef
1470: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a  t and pRight..**
1480: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20  .** If the left 
1490: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hand expression 
14a0: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
14b0: 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74  sequence type, t
14c0: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65  hen it is.** use
14d0: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  d. Otherwise the
14e0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
14f0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  nce for the righ
1500: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
1510: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72  n.** is used, or
1520: 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49   the default (BI
1530: 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72  NARY) if neither
1540: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
1550: 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74  a collating.** t
1560: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ype..**.** Argum
1570: 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20  ent pRight (but 
1580: 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62  not pLeft) may b
1590: 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  e a null pointer
15a0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
15b0: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e  ** it is not con
15c0: 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c  sidered..*/.Coll
15d0: 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61  Seq *sqlite3Bina
15e0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
15f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1600: 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  e, .  Expr *pLef
1610: 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67  t, .  Expr *pRig
1620: 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ht.){.  CollSeq 
1630: 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pColl;.  assert
1640: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28  ( pLeft );.  if(
1650: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
1660: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b  EP_ExpCollate ){
1670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65  .    assert( pLe
1680: 66 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20  ft->pColl );.   
1690: 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e   pColl = pLeft->
16a0: 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 20 69  pColl;.  }else i
16b0: 66 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69  f( pRight && pRi
16c0: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
16d0: 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  ExpCollate ){.  
16e0: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
16f0: 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 70  ->pColl );.    p
1700: 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70  Coll = pRight->p
1710: 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Coll;.  }else{. 
1720: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1730: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
1740: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
1750: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
1760: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1770: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1780: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
1790: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
17a0: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
17b0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
17c0: 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  de for a compari
17d0: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
17e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
17f0: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
1800: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
1810: 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64  The parsing (and
1820: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1830: 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  ) context */.  E
1840: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
1850: 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65   /* The left ope
1860: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
1870: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
1880: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1890: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65   */.  int opcode
18a0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ,       /* The c
18b0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65  omparison opcode
18c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69   */.  int in1, i
18d0: 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73  nt in2, /* Regis
18e0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72  ter holding oper
18f0: 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ands */.  int de
1900: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
1910: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
1920: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
1930: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
1940: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
1950: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
1960: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
1970: 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b   p5;.  int addr;
1980: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a  .  CollSeq *p4;.
1990: 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42  .  p4 = sqlite3B
19a0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
19b0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
19c0: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35  t, pRight);.  p5
19d0: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
19e0: 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  P5(pLeft, pRight
19f0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1a00: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
1a10: 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65  dbeAddOp4(pParse
1a20: 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c  ->pVdbe, opcode,
1a30: 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c   in2, dest, in1,
1a40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
1a60: 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45  d*)p4, P4_COLLSE
1a70: 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Q);.  sqlite3Vdb
1a80: 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65  eChangeP5(pParse
1a90: 2d 3e 70 56 64 62 65 2c 20 70 35 29 3b 0a 20 20  ->pVdbe, p5);.  
1aa0: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
1ab0: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
1ac0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
1ad0: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
1ae0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
1af0: 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  .  Memory.** for
1b00: 20 74 68 69 73 20 6e 6f 64 65 20 69 73 20 6f 62   this node is ob
1b10: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
1b20: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 20 54  te3_malloc().  T
1b30: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
1b40: 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ion.** is respon
1b50: 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
1b60: 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65   sure the node e
1b70: 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66  ventually gets f
1b80: 72 65 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  reed..*/.Expr *s
1b90: 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71  qlite3Expr(.  sq
1ba0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1bb0: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
1bc0: 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  for sqlite3DbMal
1bd0: 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62  locZero() (may b
1be0: 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74  e null) */.  int
1bf0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
1c00: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
1c10: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45  on opcode */.  E
1c20: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
1c30: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f         /* Left o
1c40: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
1c50: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20 20   *pRight,       
1c60: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65      /* Right ope
1c70: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1c80: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20  Token *pToken   
1c90: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
1ca0: 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ken */.){.  Expr
1cb0: 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d   *pNew;.  pNew =
1cc0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1cd0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1ce0: 45 78 70 72 29 29 3b 0a 20 20 69 66 28 20 70 4e  Expr));.  if( pN
1cf0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ew==0 ){.    /* 
1d00: 57 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  When malloc fail
1d10: 73 2c 20 64 65 6c 65 74 65 20 70 4c 65 66 74 20  s, delete pLeft 
1d20: 61 6e 64 20 70 52 69 67 68 74 2e 20 45 78 70 72  and pRight. Expr
1d30: 65 73 73 69 6f 6e 73 20 70 61 73 73 65 64 20 74  essions passed t
1d40: 6f 20 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66  o .    ** this f
1d50: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 61 6c 77  unction must alw
1d60: 61 79 73 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ays be allocated
1d70: 20 77 69 74 68 20 73 71 6c 69 74 65 33 45 78 70   with sqlite3Exp
1d80: 72 28 29 20 66 6f 72 20 74 68 69 73 20 0a 20 20  r() for this .  
1d90: 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 0a 20 20    ** reason. .  
1da0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
1db0: 45 78 70 72 44 65 6c 65 74 65 28 70 4c 65 66 74  ExprDelete(pLeft
1dc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1dd0: 70 72 44 65 6c 65 74 65 28 70 52 69 67 68 74 29  prDelete(pRight)
1de0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1df0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d    }.  pNew->op =
1e00: 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65   op;.  pNew->pLe
1e10: 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e  ft = pLeft;.  pN
1e20: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69  ew->pRight = pRi
1e30: 67 68 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 41 67  ght;.  pNew->iAg
1e40: 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54  g = -1;.  if( pT
1e50: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  oken ){.    asse
1e60: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d  rt( pToken->dyn=
1e70: 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  =0 );.    pNew->
1e80: 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b  span = pNew->tok
1e90: 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20  en = *pToken;.  
1ea0: 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 20  }else if( pLeft 
1eb0: 29 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  ){.    if( pRigh
1ec0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
1ed0: 65 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c  e3ExprSpan(pNew,
1ee0: 20 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26   &pLeft->span, &
1ef0: 70 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20  pRight->span);. 
1f00: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
1f10: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1f20: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
1f30: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
1f40: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a   EP_ExpCollate;.
1f50: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43          pNew->pC
1f60: 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70 43  oll = pRight->pC
1f70: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
1f80: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74   }.    if( pLeft
1f90: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
1fa0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
1fb0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
1fc0: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
1fd0: 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c       pNew->pColl
1fe0: 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b   = pLeft->pColl;
1ff0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
2000: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
2010: 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  ht(pNew);.  retu
2020: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
2030: 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c  * Works like sql
2040: 69 74 65 33 45 78 70 72 28 29 20 65 78 63 65 70  ite3Expr() excep
2050: 74 20 74 68 61 74 20 69 74 20 74 61 6b 65 73 20  t that it takes 
2060: 61 6e 20 65 78 74 72 61 20 50 61 72 73 65 2a 0a  an extra Parse*.
2070: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  ** argument and 
2080: 6e 6f 74 69 66 69 65 73 20 74 68 65 20 61 73 73  notifies the ass
2090: 6f 63 69 61 74 65 64 20 63 6f 6e 6e 65 63 74 69  ociated connecti
20a0: 6f 6e 20 6f 62 6a 65 63 74 20 69 66 20 6d 61 6c  on object if mal
20b0: 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 45 78  loc fails..*/.Ex
20c0: 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72  pr *sqlite3PExpr
20d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
20e0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
20f0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
2100: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
2110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
2120: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
2130: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
2140: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
2150: 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   Left operand */
2160: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
2170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
2180: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
2190: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
21a0: 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75  oken     /* Argu
21b0: 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b  ment token */.){
21c0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
21d0: 33 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62  3Expr(pParse->db
21e0: 2c 20 6f 70 2c 20 70 4c 65 66 74 2c 20 70 52 69  , op, pLeft, pRi
21f0: 67 68 74 2c 20 70 54 6f 6b 65 6e 29 3b 0a 7d 0a  ght, pToken);.}.
2200: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f 69 6e  ./*.** When doin
2210: 67 20 61 20 6e 65 73 74 65 64 20 70 61 72 73 65  g a nested parse
2220: 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c 75 64  , you can includ
2230: 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78  e terms in an ex
2240: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61 74  pression.** that
2250: 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69 73 3a   look like this:
2260: 20 20 20 23 31 20 23 32 20 2e 2e 2e 20 20 54 68     #1 #2 ...  Th
2270: 65 73 65 20 74 65 72 6d 73 20 72 65 66 65 72 20  ese terms refer 
2280: 74 6f 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20  to registers.** 
2290: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  in the virtual m
22a0: 61 63 68 69 6e 65 2e 20 20 23 4e 20 69 73 20 74  achine.  #N is t
22b0: 68 65 20 4e 2d 74 68 20 72 65 67 69 73 74 65 72  he N-th register
22c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
22d0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
22e0: 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  y the parser to 
22f0: 64 65 61 6c 20 77 69 74 68 20 6f 6e 20 6f 66 20  deal with on of 
2300: 74 68 6f 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  those terms..** 
2310: 49 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 67  It immediately g
2320: 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
2330: 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   store the value
2340: 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 6c 6f 63   in a memory loc
2350: 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65  ation..** The re
2360: 74 75 72 6e 73 20 61 6e 20 65 78 70 72 65 73 73  turns an express
2370: 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 63 6f  ion that will co
2380: 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  de to extract th
2390: 65 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20  e value from.** 
23a0: 74 68 61 74 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  that memory loca
23b0: 74 69 6f 6e 20 61 73 20 6e 65 65 64 65 64 2e 0a  tion as needed..
23c0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
23d0: 52 65 67 69 73 74 65 72 45 78 70 72 28 50 61 72  RegisterExpr(Par
23e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
23f0: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 56 64  n *pToken){.  Vd
2400: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2410: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
2420: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
2430: 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  nested==0 ){.   
2440: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2450: 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c  (pParse, "near \
2460: 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72  "%T\": syntax er
2470: 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  ror", pToken);. 
2480: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
2490: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
24a0: 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29  K_NULL, 0, 0, 0)
24b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30  ;.  }.  if( v==0
24c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
24d0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
24e0: 70 50 61 72 73 65 2c 20 54 4b 5f 52 45 47 49 53  pParse, TK_REGIS
24f0: 54 45 52 2c 20 30 2c 20 30 2c 20 70 54 6f 6b 65  TER, 0, 0, pToke
2500: 6e 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  n);.  if( p==0 )
2510: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
2520: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65   /* Malloc faile
2530: 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 69 54  d */.  }.  p->iT
2540: 61 62 6c 65 20 3d 20 61 74 6f 69 28 28 63 68 61  able = atoi((cha
2550: 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d  r*)&pToken->z[1]
2560: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
2570: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f  ../*.** Join two
2580: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69   expressions usi
2590: 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  ng an AND operat
25a0: 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65  or.  If either e
25b0: 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20  xpression is.** 
25c0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20  NULL, then just 
25d0: 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72  return the other
25e0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
25f0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
2600: 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62  rAnd(sqlite3 *db
2610: 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45  , Expr *pLeft, E
2620: 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20  xpr *pRight){.  
2630: 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a  if( pLeft==0 ){.
2640: 20 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68      return pRigh
2650: 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  t;.  }else if( p
2660: 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Right==0 ){.    
2670: 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20  return pLeft;.  
2680: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2690: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  n sqlite3Expr(db
26a0: 2c 20 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c  , TK_AND, pLeft,
26b0: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d   pRight, 0);.  }
26c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
26d0: 65 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c  e Expr.span fiel
26e0: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  d of the given e
26f0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61  xpression to spa
2700: 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65  n all.** text be
2710: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69  tween the two gi
2720: 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76  ven tokens..*/.v
2730: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
2740: 70 61 6e 28 45 78 70 72 20 2a 70 45 78 70 72 2c  pan(Expr *pExpr,
2750: 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54   Token *pLeft, T
2760: 6f 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20  oken *pRight){. 
2770: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 21   assert( pRight!
2780: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2790: 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66  pLeft!=0 );.  if
27a0: 28 20 70 45 78 70 72 20 26 26 20 70 52 69 67 68  ( pExpr && pRigh
27b0: 74 2d 3e 7a 20 26 26 20 70 4c 65 66 74 2d 3e 7a  t->z && pLeft->z
27c0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
27d0: 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 7c 7c  pLeft->dyn==0 ||
27e0: 20 70 4c 65 66 74 2d 3e 7a 5b 70 4c 65 66 74 2d   pLeft->z[pLeft-
27f0: 3e 6e 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  >n]==0 );.    if
2800: 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20  ( pLeft->dyn==0 
2810: 26 26 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d 3d  && pRight->dyn==
2820: 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
2830: 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74  ->span.z = pLeft
2840: 2d 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ->z;.      pExpr
2850: 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68  ->span.n = pRigh
2860: 74 2d 3e 6e 20 2b 20 28 70 52 69 67 68 74 2d 3e  t->n + (pRight->
2870: 7a 20 2d 20 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20  z - pLeft->z);. 
2880: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2890: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20  pExpr->span.z = 
28a0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
28b0: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
28c0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
28d0: 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63   node for a func
28e0: 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70  tion with multip
28f0: 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e  le.** arguments.
2900: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
2910: 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61  3ExprFunction(Pa
2920: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
2930: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  rList *pList, To
2940: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
2950: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 61 73  Expr *pNew;.  as
2960: 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a  sert( pToken );.
2970: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
2980: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
2990: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
29a0: 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70  Expr) );.  if( p
29b0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
29c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
29d0: 65 74 65 28 70 4c 69 73 74 29 3b 20 2f 2a 20 41  ete(pList); /* A
29e0: 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d  void leaking mem
29f0: 6f 72 79 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  ory when malloc 
2a00: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
2a10: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
2a20: 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54  w->op = TK_FUNCT
2a30: 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ION;.  pNew->pLi
2a40: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73  st = pList;.  as
2a50: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79  sert( pToken->dy
2a60: 6e 3d 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  n==0 );.  pNew->
2a70: 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b  token = *pToken;
2a80: 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20  .  pNew->span = 
2a90: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 0a 20 20  pNew->token;..  
2aa0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
2ab0: 69 67 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65  ight(pNew);.  re
2ac0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
2ad0: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
2ae0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
2af0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
2b00: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
2b10: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
2b20: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
2b30: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
2b40: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
2b50: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
2b60: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
2b70: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
2b80: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
2b90: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
2ba0: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
2bb0: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
2bc0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
2bd0: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
2be0: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
2bf0: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65  n" is not too be
2c00: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
2c10: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
2c20: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
2c30: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
2c40: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
2c50: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
2c60: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
2c70: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
2c80: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
2c90: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
2ca0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
2cb0: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
2cc0: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
2cd0: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
2ce0: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
2cf0: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
2d00: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
2d10: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69  the next sequeni
2d20: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
2d30: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
2d40: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
2d50: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
2d60: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
2d70: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
2d80: 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ){.  Token *pTok
2d90: 65 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  en;.  sqlite3 *d
2da0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2db0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
2dc0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 6f 6b  ) return;.  pTok
2dd0: 65 6e 20 3d 20 26 70 45 78 70 72 2d 3e 74 6f 6b  en = &pExpr->tok
2de0: 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  en;.  assert( pT
2df0: 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20  oken->n>=1 );.  
2e00: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e  assert( pToken->
2e10: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
2e20: 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d  ( pToken->z[0]!=
2e30: 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  0 );.  if( pToke
2e40: 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  n->n==1 ){.    /
2e50: 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68  * Wildcard of th
2e60: 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73  e form "?".  Ass
2e70: 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72  ign the next var
2e80: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  iable number */.
2e90: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
2ea0: 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  e = ++pParse->nV
2eb0: 61 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ar;.  }else if( 
2ec0: 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f  pToken->z[0]=='?
2ed0: 27 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  ' ){.    /* Wild
2ee0: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
2ef0: 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72   "?nnn".  Conver
2f00: 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e  t "nnn" to an in
2f10: 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a  teger and.    **
2f20: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
2f30: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
2f40: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  /.    int i;.   
2f50: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
2f60: 20 69 20 3d 20 61 74 6f 69 28 28 63 68 61 72 2a   i = atoi((char*
2f70: 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b  )&pToken->z[1]);
2f80: 0a 20 20 20 20 69 66 28 20 69 3c 31 20 7c 7c 20  .    if( i<1 || 
2f90: 69 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52  i>SQLITE_MAX_VAR
2fa0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 29 7b 0a  IABLE_NUMBER ){.
2fb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2fc0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
2fd0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d  ariable number m
2fe0: 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f  ust be between ?
2ff0: 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20  1 and ?%d",.    
3000: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58        SQLITE_MAX
3010: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
3020: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
3030: 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20   i>pParse->nVar 
3040: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
3050: 3e 6e 56 61 72 20 3d 20 69 3b 0a 20 20 20 20 7d  >nVar = i;.    }
3060: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
3070: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
3080: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72  e form ":aaa" or
3090: 20 22 24 61 61 61 22 2e 20 20 52 65 75 73 65 20   "$aaa".  Reuse 
30a0: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
30b0: 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
30c0: 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70  as the prior app
30d0: 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73  earance of the s
30e0: 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20  ame name, or if 
30f0: 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20  the name.    ** 
3100: 68 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72  has never appear
3110: 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65  ed before, reuse
3120: 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62   the same variab
3130: 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2f  le number.    */
3140: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  .    int i, n;. 
3150: 20 20 20 6e 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e     n = pToken->n
3160: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
3170: 3c 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  <pParse->nVarExp
3180: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; i++){.      E
3190: 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69  xpr *pE;.      i
31a0: 66 28 20 28 70 45 20 3d 20 70 50 61 72 73 65 2d  f( (pE = pParse-
31b0: 3e 61 70 56 61 72 45 78 70 72 5b 69 5d 29 21 3d  >apVarExpr[i])!=
31c0: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70  0.          && p
31d0: 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20  E->token.n==n.  
31e0: 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d          && memcm
31f0: 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  p(pE->token.z, p
3200: 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20  Token->z, n)==0 
3210: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
3220: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 2d 3e 69  ->iTable = pE->i
3230: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 62  Table;.        b
3240: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
3250: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 70    }.    if( i>=p
3260: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 20  Parse->nVarExpr 
3270: 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
3280: 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73  iTable = ++pPars
3290: 65 2d 3e 6e 56 61 72 3b 0a 20 20 20 20 20 20 69  e->nVar;.      i
32a0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  f( pParse->nVarE
32b0: 78 70 72 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61  xpr>=pParse->nVa
32c0: 72 45 78 70 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a  rExprAlloc-1 ){.
32d0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
32e0: 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b 3d  nVarExprAlloc +=
32f0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70   pParse->nVarExp
3300: 72 41 6c 6c 6f 63 20 2b 20 31 30 3b 0a 20 20 20  rAlloc + 10;.   
3310: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56       pParse->apV
3320: 61 72 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20  arExpr =.       
3330: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65       sqlite3DbRe
3340: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 0a 20 20 20  allocOrFree(.   
3350: 20 20 20 20 20 20 20 20 20 20 20 64 62 2c 0a 20             db,. 
3360: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
3370: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 2c 0a  rse->apVarExpr,.
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
3390: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c  arse->nVarExprAl
33a0: 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 50 61 72 73  loc*sizeof(pPars
33b0: 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 30 5d 29  e->apVarExpr[0])
33c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
33d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
33e0: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
33f0: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61  led ){.        a
3400: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61  ssert( pParse->a
3410: 70 56 61 72 45 78 70 72 21 3d 30 20 29 3b 0a 20  pVarExpr!=0 );. 
3420: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
3430: 70 56 61 72 45 78 70 72 5b 70 50 61 72 73 65 2d  pVarExpr[pParse-
3440: 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70  >nVarExpr++] = p
3450: 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Expr;.      }.  
3460: 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21    }.  } .  if( !
3470: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20  pParse->nErr && 
3480: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 53 51 4c  pParse->nVar>SQL
3490: 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
34a0: 5f 4e 55 4d 42 45 52 20 29 7b 0a 20 20 20 20 73  _NUMBER ){.    s
34b0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
34c0: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
34d0: 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29   SQL variables")
34e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
34f0: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
3500: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
3510: 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
3520: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3530: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
3540: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
3550: 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 64 79 6e   if( p->span.dyn
3560: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
3570: 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a  (char*)p->span.z
3580: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65  );.  if( p->toke
3590: 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 33 5f  n.dyn ) sqlite3_
35a0: 66 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e 74  free((char*)p->t
35b0: 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69 74  oken.z);.  sqlit
35c0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
35d0: 70 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65  pLeft);.  sqlite
35e0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
35f0: 52 69 67 68 74 29 3b 0a 20 20 73 71 6c 69 74 65  Right);.  sqlite
3600: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
3610: 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c  p->pList);.  sql
3620: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
3630: 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  (p->pSelect);.  
3640: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
3650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 45 78  .}../*.** The Ex
3660: 70 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64 20 6d  pr.token field m
3670: 69 67 68 74 20 62 65 20 61 20 73 74 72 69 6e 67  ight be a string
3680: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 69 73   literal that is
3690: 20 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 73   quoted..** If s
36a0: 6f 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 71 75  o, remove the qu
36b0: 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 2e 0a 2a  otation marks..*
36c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
36d0: 71 75 6f 74 65 45 78 70 72 28 73 71 6c 69 74 65  quoteExpr(sqlite
36e0: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b  3 *db, Expr *p){
36f0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 41 6e  .  if( ExprHasAn
3700: 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  yProperty(p, EP_
3710: 44 65 71 75 6f 74 65 64 29 20 29 7b 0a 20 20 20  Dequoted) ){.   
3720: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 45   return;.  }.  E
3730: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
3740: 2c 20 45 50 5f 44 65 71 75 6f 74 65 64 29 3b 0a  , EP_Dequoted);.
3750: 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64    if( p->token.d
3760: 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  yn==0 ){.    sql
3770: 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62  ite3TokenCopy(db
3780: 2c 20 26 70 2d 3e 74 6f 6b 65 6e 2c 20 26 70 2d  , &p->token, &p-
3790: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 73  >token);.  }.  s
37a0: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 28 63  qlite3Dequote((c
37b0: 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29  har*)p->token.z)
37c0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
37d0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20  following group 
37e0: 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65  of routines make
37f0: 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20   deep copies of 
3800: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
3810: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73  expression lists
3820: 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20  , ID lists, and 
3830: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
3840: 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63  s.  The copies c
3850: 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64  an.** be deleted
3860: 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65   (by being passe
3870: 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65  d to their respe
3880: 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28  ctive ...Delete(
3890: 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77  ) routines).** w
38a0: 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67  ithout effecting
38b0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a   the originals..
38c0: 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  **.** The expres
38d0: 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61  sion list, ID, a
38e0: 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20  nd source lists 
38f0: 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65  return by sqlite
3900: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a  3ExprListDup(),.
3910: 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  ** sqlite3IdList
3920: 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74  Dup(), and sqlit
3930: 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63  e3SrcListDup() c
3940: 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65  an not be furthe
3950: 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62  r expanded .** b
3960: 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
3970: 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73  ls to sqlite*Lis
3980: 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e  tAppend() routin
3990: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61  es..**.** Any ta
39a0: 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72  bles that the Sr
39b0: 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e  cList might poin
39c0: 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70  t to are not dup
39d0: 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a 45 78 70 72  licated..*/.Expr
39e0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75 70   *sqlite3ExprDup
39f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
3a00: 70 72 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a  pr *p){.  Expr *
3a10: 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pNew;.  if( p==0
3a20: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
3a30: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
3a40: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
3a50: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
3a60: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
3a70: 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e  n 0;.  memcpy(pN
3a80: 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66 28 2a 70  ew, p, sizeof(*p
3a90: 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 2d 3e  New));.  if( p->
3aa0: 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20  token.z!=0 ){.  
3ab0: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20    pNew->token.z 
3ac0: 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33 44 62  = (u8*)sqlite3Db
3ad0: 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61  StrNDup(db, (cha
3ae0: 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  r*)p->token.z, p
3af0: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
3b00: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  pNew->token.dyn 
3b10: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
3b20: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
3b30: 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20  token.z==0 );.  
3b40: 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a  }.  pNew->span.z
3b50: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c   = 0;.  pNew->pL
3b60: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
3b70: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66  rDup(db, p->pLef
3b80: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67  t);.  pNew->pRig
3b90: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
3ba0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68  Dup(db, p->pRigh
3bb0: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73  t);.  pNew->pLis
3bc0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
3bd0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  istDup(db, p->pL
3be0: 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  ist);.  pNew->pS
3bf0: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
3c00: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e  electDup(db, p->
3c10: 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75  pSelect);.  retu
3c20: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69 64 20  rn pNew;.}.void 
3c30: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
3c40: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f  (sqlite3 *db, To
3c50: 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65 6e 20  ken *pTo, Token 
3c60: 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70  *pFrom){.  if( p
3c70: 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c 69 74 65  To->dyn ) sqlite
3c80: 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70 54  3_free((char*)pT
3c90: 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 70 46 72  o->z);.  if( pFr
3ca0: 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 54 6f  om->z ){.    pTo
3cb0: 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b 0a  ->n = pFrom->n;.
3cc0: 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 28 75 38      pTo->z = (u8
3cd0: 2a 29 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  *)sqlite3DbStrND
3ce0: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 46  up(db, (char*)pF
3cf0: 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e  rom->z, pFrom->n
3d00: 29 3b 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20  );.    pTo->dyn 
3d10: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
3d20: 20 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20    pTo->z = 0;.  
3d30: 7d 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  }.}.ExprList *sq
3d40: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
3d50: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
3d60: 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20 45 78  prList *p){.  Ex
3d70: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
3d80: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
3d90: 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f  item *pItem, *pO
3da0: 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  ldItem;.  int i;
3db0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
3dc0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
3dd0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
3de0: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
3df0: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
3e00: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
3e10: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 43 75 72  0;.  pNew->iECur
3e20: 73 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  sor = 0;.  pNew-
3e30: 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77 2d 3e 6e  >nExpr = pNew->n
3e40: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78 70 72  Alloc = p->nExpr
3e50: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49  ;.  pNew->a = pI
3e60: 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tem = sqlite3DbM
3e70: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 20 70 2d  allocRaw(db,  p-
3e80: 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d  >nExpr*sizeof(p-
3e90: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
3ea0: 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  pItem==0 ){.    
3eb0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
3ec0: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
3ed0: 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65  ;.  } .  pOldIte
3ee0: 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28  m = p->a;.  for(
3ef0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
3f00: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70   i++, pItem++, p
3f10: 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  OldItem++){.    
3f20: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 2c 20  Expr *pNewExpr, 
3f30: 2a 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20 70  *pOldExpr;.    p
3f40: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e  Item->pExpr = pN
3f50: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
3f60: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
3f70: 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Expr = pOldItem-
3f80: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  >pExpr);.    if(
3f90: 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e   pOldExpr->span.
3fa0: 7a 21 3d 30 20 26 26 20 70 4e 65 77 45 78 70 72  z!=0 && pNewExpr
3fb0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77   ){.      /* Alw
3fc0: 61 79 73 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  ays make a copy 
3fd0: 6f 66 20 74 68 65 20 73 70 61 6e 20 66 6f 72 20  of the span for 
3fe0: 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70 72 65 73  top-level expres
3ff0: 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  sions in the.   
4000: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
4010: 20 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f 67 69   list.  The logi
4020: 63 20 69 6e 20 53 45 4c 45 43 54 20 70 72 6f 63  c in SELECT proc
4030: 65 73 73 69 6e 67 20 74 68 61 74 20 64 65 74 65  essing that dete
4040: 72 6d 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20  rmines.      ** 
4050: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
4060: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
4070: 6c 74 20 73 65 74 20 6e 65 65 64 73 20 74 68 69  lt set needs thi
4080: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  s information */
4090: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f  .      sqlite3To
40a0: 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 4e 65  kenCopy(db, &pNe
40b0: 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4f  wExpr->span, &pO
40c0: 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20  ldExpr->span);. 
40d0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
40e0: 20 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c 20   pNewExpr==0 || 
40f0: 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  pNewExpr->span.z
4100: 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  !=0 .           
4110: 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70   || pOldExpr->sp
4120: 61 6e 2e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20  an.z==0.        
4130: 20 20 20 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f      || db->mallo
4140: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70  cFailed );.    p
4150: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
4160: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
4170: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
4180: 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73  e);.    pItem->s
4190: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49  ortOrder = pOldI
41a0: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  tem->sortOrder;.
41b0: 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 41 67 67      pItem->isAgg
41c0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 41   = pOldItem->isA
41d0: 67 67 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64  gg;.    pItem->d
41e0: 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  one = 0;.  }.  r
41f0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
4200: 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c  *.** If cursors,
4210: 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77 73   triggers, views
4220: 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20   and subqueries 
4230: 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20  are all omitted 
4240: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c  from.** the buil
4250: 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20  d, then none of 
4260: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
4270: 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66  utines, except f
4280: 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65  or .** sqlite3Se
4290: 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62  lectDup(), can b
42a0: 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65  e called. sqlite
42b0: 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73 20  3SelectDup() is 
42c0: 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c  sometimes.** cal
42d0: 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  led with a NULL 
42e0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66  argument..*/.#if
42f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4300: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
4310: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4320: 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20  MIT_TRIGGER) \. 
4330: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
4340: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
4350: 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  ).SrcList *sqlit
4360: 65 33 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c  e3SrcListDup(sql
4370: 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73  ite3 *db, SrcLis
4380: 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74  t *p){.  SrcList
4390: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
43a0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
43b0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
43c0: 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  n 0;.  nByte = s
43d0: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e  izeof(*p) + (p->
43e0: 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28  nSrc>0 ? sizeof(
43f0: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
4400: 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70  Src-1) : 0);.  p
4410: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
4420: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 42 79  allocRaw(db, nBy
4430: 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  te );.  if( pNew
4440: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
4450: 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70    pNew->nSrc = p
4460: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
4470: 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >nSrc;.  for(i=0
4480: 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b  ; i<p->nSrc; i++
4490: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
44a0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  cList_item *pNew
44b0: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
44c0: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53  i];.    struct S
44d0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  rcList_item *pOl
44e0: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
44f0: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
4500: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
4510: 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
4520: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
4530: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61   pOldItem->zData
4540: 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  base);.    pNewI
4550: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
4560: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
4570: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
4580: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
4590: 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
45a0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
45b0: 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ldItem->zAlias);
45c0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a  .    pNewItem->j
45d0: 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49 74  ointype = pOldIt
45e0: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  em->jointype;.  
45f0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72    pNewItem->iCur
4600: 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sor = pOldItem->
4610: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65  iCursor;.    pNe
4620: 77 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74  wItem->isPopulat
4630: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  ed = pOldItem->i
4640: 73 50 6f 70 75 6c 61 74 65 64 3b 0a 20 20 20 20  sPopulated;.    
4650: 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d  pTab = pNewItem-
4660: 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d  >pTab = pOldItem
4670: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
4680: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54  pTab ){.      pT
4690: 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  ab->nRef++;.    
46a0: 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  }.    pNewItem->
46b0: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
46c0: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
46d0: 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  OldItem->pSelect
46e0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
46f0: 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  >pOn = sqlite3Ex
4700: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  prDup(db, pOldIt
4710: 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 70 4e  em->pOn);.    pN
4720: 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d  ewItem->pUsing =
4730: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
4740: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
4750: 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65  pUsing);.    pNe
4760: 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d  wItem->colUsed =
4770: 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73   pOldItem->colUs
4780: 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ed;.  }.  return
4790: 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20   pNew;.}.IdList 
47a0: 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75  *sqlite3IdListDu
47b0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  p(sqlite3 *db, I
47c0: 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c  dList *p){.  IdL
47d0: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
47e0: 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   i;.  if( p==0 )
47f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
4800: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
4810: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
4820: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
4830: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
4840: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49  rn 0;.  pNew->nI
4850: 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  d = pNew->nAlloc
4860: 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65   = p->nId;.  pNe
4870: 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62  w->a = sqlite3Db
4880: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 2d  MallocRaw(db, p-
4890: 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  >nId*sizeof(p->a
48a0: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  [0]) );.  if( pN
48b0: 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  ew->a==0 ){.    
48c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
48d0: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
48e0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
48f0: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
4900: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
4910: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
4920: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
4930: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
4940: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
4950: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
4960: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
4970: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
4980: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
4990: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
49a0: 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f  ewItem->idx = pO
49b0: 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d  ldItem->idx;.  }
49c0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
49d0: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
49e0: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
49f0: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
4a00: 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e  p){.  Select *pN
4a10: 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  ew;.  if( p==0 )
4a20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
4a30: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
4a40: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
4a50: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
4a60: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
4a70: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69 73  0;.  pNew->isDis
4a80: 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
4a90: 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70  tinct;.  pNew->p
4aa0: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
4ab0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
4ac0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65  ->pEList);.  pNe
4ad0: 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  w->pSrc = sqlite
4ae0: 33 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20  3SrcListDup(db, 
4af0: 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65 77  p->pSrc);.  pNew
4b00: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
4b10: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
4b20: 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e 65 77  >pWhere);.  pNew
4b30: 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
4b40: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
4b50: 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29  db, p->pGroupBy)
4b60: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
4b70: 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  g = sqlite3ExprD
4b80: 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  up(db, p->pHavin
4b90: 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64  g);.  pNew->pOrd
4ba0: 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
4bb0: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
4bc0: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 4e  >pOrderBy);.  pN
4bd0: 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  ew->op = p->op;.
4be0: 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
4bf0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
4c00: 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29  p(db, p->pPrior)
4c10: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
4c20: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
4c30: 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  p(db, p->pLimit)
4c40: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
4c50: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
4c60: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  up(db, p->pOffse
4c70: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d  t);.  pNew->iLim
4c80: 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  it = -1;.  pNew-
4c90: 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20  >iOffset = -1;. 
4ca0: 20 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c 76 65   pNew->isResolve
4cb0: 64 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65  d = p->isResolve
4cc0: 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41 67 67  d;.  pNew->isAgg
4cd0: 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 70   = p->isAgg;.  p
4ce0: 4e 65 77 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20  New->usesEphm = 
4cf0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 73 61 6c  0;.  pNew->disal
4d00: 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  lowOrderBy = 0;.
4d10: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f    pNew->pRightmo
4d20: 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  st = 0;.  pNew->
4d30: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
4d40: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
4d50: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
4d60: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
4d70: 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31  OpenEphm[2] = -1
4d80: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
4d90: 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20  .}.#else.Select 
4da0: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
4db0: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
4dc0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 61 73 73  elect *p){.  ass
4dd0: 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72  ert( p==0 );.  r
4de0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
4df0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  f.../*.** Add a 
4e00: 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
4e10: 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70  he end of an exp
4e20: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49  ression list.  I
4e30: 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e  f pList is.** in
4e40: 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68  itially NULL, th
4e50: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
4e60: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
4e70: 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  .*/.ExprList *sq
4e80: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
4e90: 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  end(.  Parse *pP
4ea0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
4eb0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
4ec0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
4ed0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
4ee0: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
4ef0: 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74  to append. Might
4f00: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
4f10: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
4f20: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
4f30: 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ion to be append
4f40: 65 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ed */.  Token *p
4f50: 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  Name            
4f60: 2f 2a 20 41 53 20 6b 65 79 77 6f 72 64 20 66 6f  /* AS keyword fo
4f70: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
4f80: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
4f90: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
4fa0: 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  b;.  if( pList==
4fb0: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
4fc0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
4fd0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
4fe0: 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20  ExprList) );.   
4ff0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
5000: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
5010: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  em;.    }.    as
5020: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c  sert( pList->nAl
5030: 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  loc==0 );.  }.  
5040: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  if( pList->nAllo
5050: 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  c<=pList->nExpr 
5060: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
5070: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
5080: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73      int n = pLis
5090: 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b  t->nAlloc*2 + 4;
50a0: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33  .    a = sqlite3
50b0: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c  DbRealloc(db, pL
50c0: 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66  ist->a, n*sizeof
50d0: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
50e0: 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a      if( a==0 ){.
50f0: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
5100: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
5110: 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20 70  st->a = a;.    p
5120: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e  List->nAlloc = n
5130: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5140: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20  pList->a!=0 );. 
5150: 20 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e   if( pExpr || pN
5160: 61 6d 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ame ){.    struc
5170: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
5180: 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d  *pItem = &pList-
5190: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b  >a[pList->nExpr+
51a0: 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  +];.    memset(p
51b0: 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
51c0: 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49  *pItem));.    pI
51d0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
51e0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
51f0: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
5200: 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
5210: 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65   pExpr;.  }.  re
5220: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f  turn pList;..no_
5230: 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41  mem:     .  /* A
5240: 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d  void leaking mem
5250: 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61  ory if malloc ha
5260: 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73  s failed. */.  s
5270: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
5280: 28 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74  (pExpr);.  sqlit
5290: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
52a0: 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  (pList);.  retur
52b0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 0;.}../*.** If
52c0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
52d0: 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74  list pEList cont
52e0: 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69  ains more than i
52f0: 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a  Limit elements,.
5300: 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  ** leave an erro
5310: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
5320: 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rse..*/.void sql
5330: 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63  ite3ExprListChec
5340: 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65  kLength(.  Parse
5350: 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72   *pParse,.  Expr
5360: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20  List *pEList,.  
5370: 69 6e 74 20 69 4c 69 6d 69 74 2c 0a 20 20 63 6f  int iLimit,.  co
5380: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63  nst char *zObjec
5390: 74 0a 29 7b 0a 20 20 69 66 28 20 70 45 4c 69 73  t.){.  if( pELis
53a0: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
53b0: 70 72 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  pr>iLimit ){.   
53c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
53d0: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
53e0: 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73  ny columns in %s
53f0: 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d  ", zObject);.  }
5400: 0a 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .}...#if defined
5410: 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
5420: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
5430: 5f 44 45 50 54 48 3e 30 0a 2f 2a 20 54 68 65 20  _DEPTH>0./* The 
5440: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20  following three 
5450: 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67 68  functions, heigh
5460: 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67 68  tOfExpr(), heigh
5470: 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a  tOfExprList().**
5480: 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65 6c   and heightOfSel
5490: 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64 20  ect(), are used 
54a0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
54b0: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 0a   maximum height.
54c0: 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73  ** of any expres
54d0: 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65  sion tree refere
54e0: 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72 75  nced by the stru
54f0: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
5500: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67  the.** first arg
5510: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
5520: 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65 69  this maximum hei
5530: 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74  ght is greater t
5540: 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
5550: 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a  value pointed.**
5560: 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74 2c   to by pnHeight,
5570: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
5580: 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74 20  meter, then set 
5590: 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68 61  *pnHeight to tha
55a0: 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  t.** value..*/.s
55b0: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
55c0: 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70 2c  tOfExpr(Expr *p,
55d0: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
55e0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
55f0: 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a  if( p->nHeight>*
5600: 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20  pnHeight ){.    
5610: 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 2d    *pnHeight = p-
5620: 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a  >nHeight;.    }.
5630: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
5640: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  d heightOfExprLi
5650: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  st(ExprList *p, 
5660: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
5670: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
5680: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
5690: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
56a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67 68  ++){.      heigh
56b0: 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e  tOfExpr(p->a[i].
56c0: 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74 29  pExpr, pnHeight)
56d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
56e0: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
56f0: 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20  OfSelect(Select 
5700: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
5710: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
5720: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
5730: 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65 69  p->pWhere, pnHei
5740: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
5750: 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  OfExpr(p->pHavin
5760: 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  g, pnHeight);.  
5770: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5780: 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67  ->pLimit, pnHeig
5790: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
57a0: 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73 65 74  fExpr(p->pOffset
57b0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
57c0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
57d0: 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48  t(p->pEList, pnH
57e0: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
57f0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
5800: 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65 69 67  pGroupBy, pnHeig
5810: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5820: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72  fExprList(p->pOr
5830: 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68 74 29  derBy, pnHeight)
5840: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65  ;.    heightOfSe
5850: 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20  lect(p->pPrior, 
5860: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d  pnHeight);.  }.}
5870: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
5880: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
5890: 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72  iable in the str
58a0: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
58b0: 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   an .** argument
58c0: 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  . An expression 
58d0: 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e  with no children
58e0: 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20  , Expr.pList or 
58f0: 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74  .** Expr.pSelect
5900: 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68 65   member has a he
5910: 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f  ight of 1. Any o
5920: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a  ther expression.
5930: 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68 74 20  ** has a height 
5940: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
5950: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
5960: 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66  ny other .** ref
5970: 65 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75  erenced Expr plu
5980: 73 20 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  s one..*/.void s
5990: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
59a0: 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ght(Expr *p){.  
59b0: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
59c0: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
59d0: 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67  p->pLeft, &nHeig
59e0: 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45  ht);.  heightOfE
59f0: 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26  xpr(p->pRight, &
5a00: 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67  nHeight);.  heig
5a10: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
5a20: 70 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29  pList, &nHeight)
5a30: 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65  ;.  heightOfSele
5a40: 63 74 28 70 2d 3e 70 53 65 6c 65 63 74 2c 20 26  ct(p->pSelect, &
5a50: 6e 48 65 69 67 68 74 29 3b 0a 20 20 70 2d 3e 6e  nHeight);.  p->n
5a60: 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74  Height = nHeight
5a70: 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   + 1;.}../*.** R
5a80: 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
5a90: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
5aa0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
5ab0: 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79  referenced.** by
5ac0: 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   the select stat
5ad0: 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
5ae0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  an argument..*/.
5af0: 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
5b00: 74 45 78 70 72 48 65 69 67 68 74 28 53 65 6c 65  tExprHeight(Sele
5b10: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  ct *p){.  int nH
5b20: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
5b30: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26  ghtOfSelect(p, &
5b40: 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75  nHeight);.  retu
5b50: 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65  rn nHeight;.}.#e
5b60: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  ndif../*.** Dele
5b70: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
5b80: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
5b90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
5ba0: 72 4c 69 73 74 44 65 6c 65 74 65 28 45 78 70 72  rListDelete(Expr
5bb0: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
5bc0: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
5bd0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
5be0: 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
5bf0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
5c00: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
5c10: 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e  a!=0 || (pList->
5c20: 6e 45 78 70 72 3d 3d 30 20 26 26 20 70 4c 69 73  nExpr==0 && pLis
5c30: 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b  t->nAlloc==0) );
5c40: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
5c50: 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e  ->nExpr<=pList->
5c60: 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28  nAlloc );.  for(
5c70: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
5c80: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
5c90: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
5ca0: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
5cb0: 78 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d  xprDelete(pItem-
5cc0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
5cd0: 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 6d 2d  ite3_free(pItem-
5ce0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  >zName);.  }.  s
5cf0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73  qlite3_free(pLis
5d00: 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
5d10: 5f 66 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  _free(pList);.}.
5d20: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
5d30: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
5d40: 20 43 61 6c 6c 20 78 46 75 6e 63 20 66 6f 72 20   Call xFunc for 
5d50: 65 61 63 68 20 6e 6f 64 65 20 76 69 73 69 74 65  each node visite
5d60: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
5d70: 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 78  urn value from x
5d80: 46 75 6e 63 20 64 65 74 65 72 6d 69 6e 65 73 20  Func determines 
5d90: 77 68 65 74 68 65 72 20 74 68 65 20 74 72 65 65  whether the tree
5da0: 20 77 61 6c 6b 20 63 6f 6e 74 69 6e 75 65 73 2e   walk continues.
5db0: 0a 2a 2a 20 30 20 6d 65 61 6e 73 20 63 6f 6e 74  .** 0 means cont
5dc0: 69 6e 75 65 20 77 61 6c 6b 69 6e 67 20 74 68 65  inue walking the
5dd0: 20 74 72 65 65 2e 20 20 31 20 6d 65 61 6e 73 20   tree.  1 means 
5de0: 64 6f 20 6e 6f 74 20 77 61 6c 6b 20 63 68 69 6c  do not walk chil
5df0: 64 72 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 63  dren.** of the c
5e00: 75 72 72 65 6e 74 20 6e 6f 64 65 20 62 75 74 20  urrent node but 
5e10: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 73 69  continue with si
5e20: 62 6c 69 6e 67 73 2e 20 20 32 20 6d 65 61 6e 73  blings.  2 means
5e30: 20 61 62 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20   abandon.** the 
5e40: 74 72 65 65 20 77 61 6c 6b 20 63 6f 6d 70 6c 65  tree walk comple
5e50: 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
5e60: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  return value fro
5e70: 6d 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  m this routine i
5e80: 73 20 31 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74  s 1 to abandon t
5e90: 68 65 20 74 72 65 65 20 77 61 6c 6b 0a 2a 2a 20  he tree walk.** 
5ea0: 61 6e 64 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75  and 0 to continu
5eb0: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 54 49 43 45 3a  e..**.** NOTICE:
5ec0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64    This routine d
5ed0: 6f 65 73 20 2a 6e 6f 74 2a 20 64 65 73 63 65 6e  oes *not* descen
5ee0: 64 20 69 6e 74 6f 20 73 75 62 71 75 65 72 69 65  d into subquerie
5ef0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
5f00: 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 45 78   walkExprList(Ex
5f10: 70 72 4c 69 73 74 20 2a 2c 20 69 6e 74 20 28 2a  prList *, int (*
5f20: 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29  )(void *, Expr*)
5f30: 2c 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69  , void *);.stati
5f40: 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 54 72  c int walkExprTr
5f50: 65 65 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ee(Expr *pExpr, 
5f60: 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69  int (*xFunc)(voi
5f70: 64 2a 2c 45 78 70 72 2a 29 2c 20 76 6f 69 64 20  d*,Expr*), void 
5f80: 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63  *pArg){.  int rc
5f90: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
5fa0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
5fb0: 63 20 3d 20 28 2a 78 46 75 6e 63 29 28 70 41 72  c = (*xFunc)(pAr
5fc0: 67 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  g, pExpr);.  if(
5fd0: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   rc==0 ){.    if
5fe0: 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70  ( walkExprTree(p
5ff0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 78 46 75  Expr->pLeft, xFu
6000: 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75  nc, pArg) ) retu
6010: 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 77 61  rn 1;.    if( wa
6020: 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
6030: 2d 3e 70 52 69 67 68 74 2c 20 78 46 75 6e 63 2c  ->pRight, xFunc,
6040: 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   pArg) ) return 
6050: 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45  1;.    if( walkE
6060: 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70  xprList(pExpr->p
6070: 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72  List, xFunc, pAr
6080: 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  g) ) return 1;. 
6090: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3e 31   }.  return rc>1
60a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
60b0: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 66  walkExprTree() f
60c0: 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73  or every express
60d0: 69 6f 6e 20 69 6e 20 6c 69 73 74 20 70 2e 0a 2a  ion in list p..*
60e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c  /.static int wal
60f0: 6b 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  kExprList(ExprLi
6100: 73 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75  st *p, int (*xFu
6110: 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72  nc)(void *, Expr
6120: 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  *), void *pArg){
6130: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
6140: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
6150: 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 21   *pItem;.  if( !
6160: 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
6170: 66 6f 72 28 69 3d 70 2d 3e 6e 45 78 70 72 2c 20  for(i=p->nExpr, 
6180: 70 49 74 65 6d 3d 70 2d 3e 61 3b 20 69 3e 30 3b  pItem=p->a; i>0;
6190: 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
61a0: 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72      if( walkExpr
61b0: 54 72 65 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  Tree(pItem->pExp
61c0: 72 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20  r, xFunc, pArg) 
61d0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
61e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
61f0: 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78  *.** Call walkEx
6200: 70 72 54 72 65 65 28 29 20 66 6f 72 20 65 76 65  prTree() for eve
6210: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
6220: 20 53 65 6c 65 63 74 20 70 2c 20 6e 6f 74 20 69   Select p, not i
6230: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 65 78 70 72  ncluding.** expr
6240: 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
6250: 20 70 61 72 74 20 6f 66 20 73 75 62 2d 73 65 6c   part of sub-sel
6260: 65 63 74 73 20 69 6e 20 61 6e 79 20 46 52 4f 4d  ects in any FROM
6270: 20 63 6c 61 75 73 65 20 6f 72 20 74 68 65 20 4c   clause or the L
6280: 49 4d 49 54 0a 2a 2a 20 6f 72 20 4f 46 46 53 45  IMIT.** or OFFSE
6290: 54 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 2e 0a  T expressions...
62a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61  */.static int wa
62b0: 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 53 65 6c  lkSelectExpr(Sel
62c0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46  ect *p, int (*xF
62d0: 75 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70  unc)(void *, Exp
62e0: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
62f0: 7b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  {.  walkExprList
6300: 28 70 2d 3e 70 45 4c 69 73 74 2c 20 78 46 75 6e  (p->pEList, xFun
6310: 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b  c, pArg);.  walk
6320: 45 78 70 72 54 72 65 65 28 70 2d 3e 70 57 68 65  ExprTree(p->pWhe
6330: 72 65 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  re, xFunc, pArg)
6340: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  ;.  walkExprList
6350: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 78 46  (p->pGroupBy, xF
6360: 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61  unc, pArg);.  wa
6370: 6c 6b 45 78 70 72 54 72 65 65 28 70 2d 3e 70 48  lkExprTree(p->pH
6380: 61 76 69 6e 67 2c 20 78 46 75 6e 63 2c 20 70 41  aving, xFunc, pA
6390: 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c  rg);.  walkExprL
63a0: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
63b0: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20   xFunc, pArg);. 
63c0: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
63d0: 7b 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65 63 74  {.    walkSelect
63e0: 45 78 70 72 28 70 2d 3e 70 50 72 69 6f 72 2c 20  Expr(p->pPrior, 
63f0: 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20  xFunc, pArg);.  
6400: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
6410: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
6420: 74 69 6e 65 20 69 73 20 64 65 73 69 67 6e 65 64  tine is designed
6430: 20 61 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72   as an xFunc for
6440: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 2e   walkExprTree().
6450: 0a 2a 2a 0a 2a 2a 20 70 41 72 67 20 69 73 20 72  .**.** pArg is r
6460: 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  eally a pointer 
6470: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  to an integer.  
6480: 49 66 20 77 65 20 63 61 6e 20 74 65 6c 6c 20 62  If we can tell b
6490: 79 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 61 74 20  y looking.** at 
64a0: 70 45 78 70 72 20 74 68 61 74 20 74 68 65 20 65  pExpr that the e
64b0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
64c0: 6f 6e 74 61 69 6e 73 20 70 45 78 70 72 20 69 73  ontains pExpr is
64d0: 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 0a   not a constant.
64e0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  ** expression, t
64f0: 68 65 6e 20 73 65 74 20 2a 70 41 72 67 20 74 6f  hen set *pArg to
6500: 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 32 20   0 and return 2 
6510: 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74  to abandon the t
6520: 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 20 49 66 20  ree walk..** If 
6530: 70 45 78 70 72 20 64 6f 65 73 20 64 6f 65 73 20  pExpr does does 
6540: 6e 6f 74 20 64 69 73 71 75 61 6c 69 66 79 20 74  not disqualify t
6550: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  he expression fr
6560: 6f 6d 20 62 65 69 6e 67 20 61 20 63 6f 6e 73 74  om being a const
6570: 61 6e 74 0a 2a 2a 20 74 68 65 6e 20 64 6f 20 6e  ant.** then do n
6580: 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 66  othing..**.** Af
6590: 74 65 72 20 77 61 6c 6b 69 6e 67 20 74 68 65 20  ter walking the 
65a0: 77 68 6f 6c 65 20 74 72 65 65 2c 20 69 66 20 6e  whole tree, if n
65b0: 6f 20 6e 6f 64 65 73 20 61 72 65 20 66 6f 75 6e  o nodes are foun
65c0: 64 20 74 68 61 74 20 64 69 73 71 75 61 6c 69 66  d that disqualif
65d0: 79 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73  y.** the express
65e0: 69 6f 6e 20 61 73 20 63 6f 6e 73 74 61 6e 74 2c  ion as constant,
65f0: 20 74 68 65 6e 20 77 65 20 61 73 73 75 6d 65 20   then we assume 
6600: 74 68 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73  the whole expres
6610: 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 74  sion.** is const
6620: 61 6e 74 2e 20 20 53 65 65 20 73 71 6c 69 74 65  ant.  See sqlite
6630: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
6640: 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
6650: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
6660: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
6670: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 76  NodeIsConstant(v
6680: 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20  oid *pArg, Expr 
6690: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 2a  *pExpr){.  int *
66a0: 70 4e 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b  pN = (int*)pArg;
66b0: 0a 0a 20 20 2f 2a 20 49 66 20 2a 70 41 72 67 20  ..  /* If *pArg 
66c0: 69 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65  is 3 then any te
66d0: 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  rm of the expres
66e0: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20  sion that comes 
66f0: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e  from.  ** the ON
6700: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
6710: 73 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71  s of a join disq
6720: 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70  ualifies the exp
6730: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f  ression.  ** fro
6740: 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72  m being consider
6750: 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a  ed constant. */.
6760: 20 20 69 66 28 20 28 2a 70 4e 29 3d 3d 33 20 26    if( (*pN)==3 &
6770: 26 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70  & ExprHasAnyProp
6780: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
6790: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
67a0: 2a 70 4e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  *pN = 0;.    ret
67b0: 75 72 6e 20 32 3b 0a 20 20 7d 0a 0a 20 20 73 77  urn 2;.  }..  sw
67c0: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
67d0: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64  ){.    /* Consid
67e0: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
67f0: 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61  be constant if a
6800: 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  ll their argumen
6810: 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a  ts are constant.
6820: 20 20 20 20 2a 2a 20 61 6e 64 20 2a 70 41 72 67      ** and *pArg
6830: 3d 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ==2 */.    case 
6840: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
6850: 20 20 20 69 66 28 20 28 2a 70 4e 29 3d 3d 32 20     if( (*pN)==2 
6860: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
6870: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
6880: 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  h */.    case TK
6890: 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _ID:.    case TK
68a0: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
68b0: 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 63 61  e TK_DOT:.    ca
68c0: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
68d0: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
68e0: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e  AGG_COLUMN:.#ifn
68f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6900: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
6910: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20  e TK_SELECT:.   
6920: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
6930: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 2a 70  .#endif.      *p
6940: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  N = 0;.      ret
6950: 75 72 6e 20 32 3b 0a 20 20 20 20 63 61 73 65 20  urn 2;.    case 
6960: 54 4b 5f 49 4e 3a 0a 20 20 20 20 20 20 69 66 28  TK_IN:.      if(
6970: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
6980: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4e 20 3d  ){.        *pN =
6990: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
69a0: 72 6e 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 2;.      }.  
69b0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
69c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
69d0: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
69e0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
69f0: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
6a00: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
6a10: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20  constant.** and 
6a20: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
6a30: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
6a40: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a  nction calls..**
6a50: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
6a60: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
6a70: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
6a80: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
6a90: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
6aa0: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
6ab0: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
6ac0: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
6ad0: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
6ae0: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
6af0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
6b00: 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  rIsConstant(Expr
6b10: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f   *p){.  int isCo
6b20: 6e 73 74 20 3d 20 31 3b 0a 20 20 77 61 6c 6b 45  nst = 1;.  walkE
6b30: 78 70 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e  xprTree(p, exprN
6b40: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26  odeIsConstant, &
6b50: 69 73 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75  isConst);.  retu
6b60: 72 6e 20 69 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f  rn isConst;.}../
6b70: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
6b80: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
6b90: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
6ba0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
6bb0: 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f  stant.** that do
6bc0: 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20  es no originate 
6bd0: 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55  from the ON or U
6be0: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
6bf0: 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72  a join..** Retur
6c00: 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76  n 0 if it involv
6c10: 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20  es variables or 
6c20: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f  function calls o
6c30: 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20  r terms from.** 
6c40: 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  an ON or USING c
6c50: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
6c60: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
6c70: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20  antNotJoin(Expr 
6c80: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e  *p){.  int isCon
6c90: 73 74 20 3d 20 33 3b 0a 20 20 77 61 6c 6b 45 78  st = 3;.  walkEx
6ca0: 70 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f  prTree(p, exprNo
6cb0: 64 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69  deIsConstant, &i
6cc0: 73 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72  sConst);.  retur
6cd0: 6e 20 69 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a  n isConst!=0;.}.
6ce0: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
6cf0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
6d00: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
6d10: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
6d20: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20  onstant.** or a 
6d30: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69  function call wi
6d40: 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  th constant argu
6d50: 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61  ments.  Return a
6d60: 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a  nd 0 if there.**
6d70: 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c   are any variabl
6d80: 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  es..**.** For th
6d90: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
6da0: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
6db0: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
6dc0: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
6dd0: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
6de0: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
6df0: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
6e00: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
6e10: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
6e20: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
6e30: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
6e40: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72  tOrFunction(Expr
6e50: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f   *p){.  int isCo
6e60: 6e 73 74 20 3d 20 32 3b 0a 20 20 77 61 6c 6b 45  nst = 2;.  walkE
6e70: 78 70 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e  xprTree(p, exprN
6e80: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26  odeIsConstant, &
6e90: 69 73 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75  isConst);.  retu
6ea0: 72 6e 20 69 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d  rn isConst!=0;.}
6eb0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
6ec0: 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65  xpression p code
6ed0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  s a constant int
6ee0: 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61  eger that is sma
6ef0: 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20  ll enough.** to 
6f00: 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20  fit in a 32-bit 
6f10: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
6f20: 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61  1 and put the va
6f30: 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
6f40: 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65  er.** in *pValue
6f50: 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
6f60: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69  sion is not an i
6f70: 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20  nteger or if it 
6f80: 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f  is too big.** to
6f90: 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64   fit in a signed
6fa0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
6fb0: 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65   return 0 and le
6fc0: 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68  ave *pValue unch
6fd0: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
6fe0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
6ff0: 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
7000: 2a 70 56 61 6c 75 65 29 7b 0a 20 20 73 77 69 74  *pValue){.  swit
7010: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
7020: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
7030: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
7040: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 28 63  lite3GetInt32((c
7050: 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c  har*)p->token.z,
7060: 20 70 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20   pValue) ){.    
7070: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
7080: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7090: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
70a0: 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
70b0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
70c0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
70d0: 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65  p->pLeft, pValue
70e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
70f0: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
7100: 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20       int v;.    
7110: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
7120: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
7130: 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20  eft, &v) ){.    
7140: 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76      *pValue = -v
7150: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
7160: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
7170: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7180: 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61     default: brea
7190: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
71a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
71b0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
71c0: 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61  iven string is a
71d0: 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e   row-id column n
71e0: 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ame..*/.int sqli
71f0: 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74  te3IsRowid(const
7200: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28   char *z){.  if(
7210: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
7220: 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30  z, "_ROWID_")==0
7230: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
7240: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
7250: 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30  p(z, "ROWID")==0
7260: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
7270: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
7280: 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29  p(z, "OID")==0 )
7290: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
72a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
72b0: 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  Given the name o
72c0: 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  f a column of th
72d0: 65 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20  e form X.Y.Z or 
72e0: 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c  Y.Z or just Z, l
72f0: 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e  ook up.** that n
7300: 61 6d 65 20 69 6e 20 74 68 65 20 73 65 74 20 6f  ame in the set o
7310: 66 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20  f source tables 
7320: 69 6e 20 70 53 72 63 4c 69 73 74 20 61 6e 64 20  in pSrcList and 
7330: 6d 61 6b 65 20 74 68 65 20 70 45 78 70 72 20 0a  make the pExpr .
7340: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ** expression no
7350: 64 65 20 72 65 66 65 72 20 62 61 63 6b 20 74 6f  de refer back to
7360: 20 74 68 61 74 20 73 6f 75 72 63 65 20 63 6f 6c   that source col
7370: 75 6d 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  umn.  The follow
7380: 69 6e 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61  ing changes.** a
7390: 72 65 20 6d 61 64 65 20 74 6f 20 70 45 78 70 72  re made to pExpr
73a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72  :.**.**    pExpr
73b0: 2d 3e 69 44 62 20 20 20 20 20 20 20 20 20 20 20  ->iDb           
73c0: 53 65 74 20 74 68 65 20 69 6e 64 65 78 20 69 6e  Set the index in
73d0: 20 64 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68   db->aDb[] of th
73e0: 65 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69  e database holdi
73f0: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ng.**           
7400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
7410: 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70  e table..**    p
7420: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 20 20 20  Expr->iTable    
7430: 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63      Set to the c
7440: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
7450: 20 74 68 65 20 74 61 62 6c 65 20 6f 62 74 61 69   the table obtai
7460: 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ned.**          
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
7480: 72 6f 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a  rom pSrcList..**
7490: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
74a0: 6d 6e 20 20 20 20 20 20 20 53 65 74 20 74 6f 20  mn       Set to 
74b0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
74c0: 72 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62  r within the tab
74d0: 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  le..**    pExpr-
74e0: 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 53  >op            S
74f0: 65 74 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e  et to TK_COLUMN.
7500: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  .**    pExpr->pL
7510: 65 66 74 20 20 20 20 20 20 20 20 20 41 6e 79 20  eft         Any 
7520: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20  expression this 
7530: 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c  points to is del
7540: 65 74 65 64 0a 2a 2a 20 20 20 20 70 45 78 70 72  eted.**    pExpr
7550: 2d 3e 70 52 69 67 68 74 20 20 20 20 20 20 20 20  ->pRight        
7560: 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  Any expression t
7570: 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73  his points to is
7580: 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
7590: 54 68 65 20 70 44 62 54 6f 6b 65 6e 20 69 73 20  The pDbToken is 
75a0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
75b0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 22 58  database (the "X
75c0: 22 29 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ").  This value 
75d0: 6d 61 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d  may be.** NULL m
75e0: 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d 65  eaning that name
75f0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
7600: 59 2e 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20 61  Y.Z or Z.  Any a
7610: 76 61 69 6c 61 62 6c 65 20 64 61 74 61 62 61 73  vailable databas
7620: 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  e.** can be used
7630: 2e 20 20 54 68 65 20 70 54 61 62 6c 65 54 6f 6b  .  The pTableTok
7640: 65 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  en is the name o
7650: 66 20 74 68 65 20 74 61 62 6c 65 20 28 74 68 65  f the table (the
7660: 20 22 59 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20   "Y").  This.** 
7670: 76 61 6c 75 65 20 63 61 6e 20 62 65 20 4e 55 4c  value can be NUL
7680: 4c 20 69 66 20 70 44 62 54 6f 6b 65 6e 20 69 73  L if pDbToken is
7690: 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20   also NULL.  If 
76a0: 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20 4e  pTableToken is N
76b0: 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20  ULL it.** means 
76c0: 74 68 61 74 20 74 68 65 20 66 6f 72 6d 20 6f 66  that the form of
76d0: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5a 20 61   the name is Z a
76e0: 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20  nd that columns 
76f0: 66 72 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a  from any table.*
7700: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a  * can be used..*
7710: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d 65  *.** If the name
7720: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c   cannot be resol
7730: 76 65 64 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c  ved unambiguousl
7740: 79 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  y, leave an erro
7750: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20  r message.** in 
7760: 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
7770: 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74  n non-zero.  Ret
7780: 75 72 6e 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63  urn zero on succ
7790: 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ess..*/.static i
77a0: 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20  nt lookupName(. 
77b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
77c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
77d0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
77e0: 20 20 54 6f 6b 65 6e 20 2a 70 44 62 54 6f 6b 65    Token *pDbToke
77f0: 6e 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  n,     /* Name o
7800: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
7810: 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2c  ontaining table,
7820: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   or NULL */.  To
7830: 6b 65 6e 20 2a 70 54 61 62 6c 65 54 6f 6b 65 6e  ken *pTableToken
7840: 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61  ,  /* Name of ta
7850: 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  ble containing c
7860: 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a  olumn, or NULL *
7870: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75  /.  Token *pColu
7880: 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65  mnToken, /* Name
7890: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
78a0: 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
78b0: 20 2a 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65   *pNC,    /* The
78c0: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 75 73   name context us
78d0: 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 68  ed to resolve th
78e0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72  e name */.  Expr
78f0: 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20   *pExpr         
7900: 20 2f 2a 20 4d 61 6b 65 20 74 68 69 73 20 45 58   /* Make this EX
7910: 50 52 20 6e 6f 64 65 20 70 6f 69 6e 74 20 74 6f  PR node point to
7920: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f   the selected co
7930: 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  lumn */.){.  cha
7940: 72 20 2a 7a 44 62 20 3d 20 30 3b 20 20 20 20 20  r *zDb = 0;     
7950: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
7960: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
7970: 22 58 22 20 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a  "X" in X.Y.Z */.
7980: 20 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 30    char *zTab = 0
7990: 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ;      /* Name o
79a0: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  f the table.  Th
79b0: 65 20 22 59 22 20 69 6e 20 58 2e 59 2e 5a 20 6f  e "Y" in X.Y.Z o
79c0: 72 20 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20  r Y.Z */.  char 
79d0: 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20  *zCol = 0;      
79e0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
79f0: 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 22 5a 22 20  olumn.  The "Z" 
7a00: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
7a10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
7a20: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
7a30: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20 20  int cnt = 0;    
7a40: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7a50: 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  f matching colum
7a60: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74  n names */.  int
7a70: 20 63 6e 74 54 61 62 20 3d 20 30 3b 20 20 20 20   cntTab = 0;    
7a80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
7a90: 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 6e 61  atching table na
7aa0: 6d 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  mes */.  sqlite3
7ab0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7ac0: 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  b;  /* The datab
7ad0: 61 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ase */.  struct 
7ae0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
7af0: 74 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 55 73  tem;       /* Us
7b00: 65 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  e for looping ov
7b10: 65 72 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d  er pSrcList item
7b20: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
7b30: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4d 61 74  cList_item *pMat
7b40: 63 68 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20  ch = 0;  /* The 
7b50: 6d 61 74 63 68 69 6e 67 20 70 53 72 63 4c 69 73  matching pSrcLis
7b60: 74 20 69 74 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65  t item */.  Name
7b70: 43 6f 6e 74 65 78 74 20 2a 70 54 6f 70 4e 43 20  Context *pTopNC 
7b80: 3d 20 70 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a  = pNC;        /*
7b90: 20 46 69 72 73 74 20 6e 61 6d 65 63 6f 6e 74 65   First nameconte
7ba0: 78 74 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a  xt in the list *
7bb0: 2f 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68  /.  Schema *pSch
7bc0: 65 6d 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ema = 0;        
7bd0: 20 20 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20        /* Schema 
7be0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
7bf0: 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  n */..  assert( 
7c00: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26 20  pColumnToken && 
7c10: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20  pColumnToken->z 
7c20: 29 3b 20 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58  ); /* The Z in X
7c30: 2e 59 2e 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e  .Y.Z cannot be N
7c40: 55 4c 4c 20 2a 2f 0a 20 20 7a 44 62 20 3d 20 73  ULL */.  zDb = s
7c50: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
7c60: 6b 65 6e 28 64 62 2c 20 70 44 62 54 6f 6b 65 6e  ken(db, pDbToken
7c70: 29 3b 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c 69  );.  zTab = sqli
7c80: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
7c90: 28 64 62 2c 20 70 54 61 62 6c 65 54 6f 6b 65 6e  (db, pTableToken
7ca0: 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 73 71 6c 69  );.  zCol = sqli
7cb0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
7cc0: 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65  (db, pColumnToke
7cd0: 6e 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  n);.  if( db->ma
7ce0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
7cf0: 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d    goto lookupnam
7d00: 65 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 70 45  e_end;.  }..  pE
7d10: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31  xpr->iTable = -1
7d20: 3b 0a 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26  ;.  while( pNC &
7d30: 26 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  & cnt==0 ){.    
7d40: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
7d50: 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  ;.    SrcList *p
7d60: 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
7d70: 53 72 63 4c 69 73 74 3b 0a 0a 20 20 20 20 69 66  SrcList;..    if
7d80: 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20  ( pSrcList ){.  
7d90: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
7da0: 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61 3b 20  em=pSrcList->a; 
7db0: 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  i<pSrcList->nSrc
7dc0: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
7dd0: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
7de0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 6e  pTab;.        in
7df0: 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 43  t iDb;.        C
7e00: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 0a  olumn *pCol;.  .
7e10: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
7e20: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
7e30: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
7e40: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
7e50: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
7e60: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
7e70: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
7e80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
7e90: 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20  ab->nCol>0 );.  
7ea0: 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 20 29        if( zTab )
7eb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
7ec0: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
7ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
7ee0: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49  r *zTabName = pI
7ef0: 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  tem->zAlias;.   
7f00: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
7f10: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62  ite3StrICmp(zTab
7f20: 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29  Name, zTab)!=0 )
7f30: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
7f40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7f50: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
7f60: 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  abName = pTab->z
7f70: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
7f80: 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d    if( zTabName==
7f90: 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49  0 || sqlite3StrI
7fa0: 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54  Cmp(zTabName, zT
7fb0: 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ab)!=0 ) continu
7fc0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
7fd0: 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73 71 6c  f( zDb!=0 && sql
7fe0: 69 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d 3e  ite3StrICmp(db->
7ff0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
8000: 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  zDb)!=0 ){.     
8010: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
8020: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
8030: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
8040: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
8050: 66 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b 29  f( 0==(cntTab++)
8060: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45   ){.          pE
8070: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49  xpr->iTable = pI
8080: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
8090: 20 20 20 20 20 20 20 20 70 53 63 68 65 6d 61 20          pSchema 
80a0: 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b  = pTab->pSchema;
80b0: 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63  .          pMatc
80c0: 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20  h = pItem;.     
80d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
80e0: 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d  (j=0, pCol=pTab-
80f0: 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e  >aCol; j<pTab->n
8100: 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; j++, pCol++
8110: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
8120: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
8130: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
8140: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
8150: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
8160: 2a 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61  *zColl = pTab->a
8170: 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[j].zColl;.  
8180: 20 20 20 20 20 20 20 20 20 20 49 64 4c 69 73 74            IdList
8190: 20 2a 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20   *pUsing;.      
81a0: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
81b0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
81c0: 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e  iTable = pItem->
81d0: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  iCursor;.       
81e0: 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49       pMatch = pI
81f0: 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  tem;.           
8200: 20 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d   pSchema = pTab-
8210: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  >pSchema;.      
8220: 20 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74        /* Substit
8230: 75 74 65 20 74 68 65 20 72 6f 77 69 64 20 28 63  ute the rowid (c
8240: 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68  olumn -1) for th
8250: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
8260: 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20  Y KEY */.       
8270: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
8280: 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69  umn = j==pTab->i
8290: 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20  PKey ? -1 : j;. 
82a0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
82b0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61  ->affinity = pTa
82c0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e  b->aCol[j].affin
82d0: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ity;.           
82e0: 20 69 66 28 20 28 70 45 78 70 72 2d 3e 66 6c 61   if( (pExpr->fla
82f0: 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
8300: 74 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  te)==0 ){.      
8310: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
8320: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
8330: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
8340: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c  C(db), zColl,-1,
8350: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
8360: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
8370: 66 28 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e  f( i<pSrcList->n
8380: 53 72 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  Src-1 ){.       
8390: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
83a0: 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  [1].jointype & J
83b0: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
83d0: 49 66 20 74 68 69 73 20 6d 61 74 63 68 20 6f 63  If this match oc
83e0: 63 75 72 72 65 64 20 69 6e 20 74 68 65 20 6c 65  curred in the le
83f0: 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6e 61  ft table of a na
8400: 74 75 72 61 6c 20 6a 6f 69 6e 2c 0a 20 20 20 20  tural join,.    
8410: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
8420: 68 65 6e 20 73 6b 69 70 20 74 68 65 20 72 69 67  hen skip the rig
8430: 68 74 20 74 61 62 6c 65 20 74 6f 20 61 76 6f 69  ht table to avoi
8440: 64 20 61 20 64 75 70 6c 69 63 61 74 65 20 6d 61  d a duplicate ma
8450: 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
8460: 20 20 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a         pItem++;.
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8480: 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i++;.           
8490: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 55     }else if( (pU
84a0: 73 69 6e 67 20 3d 20 70 49 74 65 6d 5b 31 5d 2e  sing = pItem[1].
84b0: 70 55 73 69 6e 67 29 21 3d 30 20 29 7b 0a 20 20  pUsing)!=0 ){.  
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
84d0: 20 49 66 20 74 68 69 73 20 6d 61 74 63 68 20 6f   If this match o
84e0: 63 63 75 72 73 20 6f 6e 20 61 20 63 6f 6c 75 6d  ccurs on a colum
84f0: 6e 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  n that is in the
8500: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 20 20   USING clause.  
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
8520: 20 6f 66 20 61 20 6a 6f 69 6e 2c 20 73 6b 69 70   of a join, skip
8530: 20 74 68 65 20 73 65 61 72 63 68 20 6f 66 20 74   the search of t
8540: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
8550: 66 20 74 68 65 20 6a 6f 69 6e 0a 20 20 20 20 20  f the join.     
8560: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f             ** to
8570: 20 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61   avoid a duplica
8580: 74 65 20 6d 61 74 63 68 20 74 68 65 72 65 2e 20  te match there. 
8590: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
85a0: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
85b0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d            for(k=
85c0: 30 3b 20 6b 3c 70 55 73 69 6e 67 2d 3e 6e 49 64  0; k<pUsing->nId
85d0: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
85e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
85f0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 55 73  lite3StrICmp(pUs
8600: 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65 2c  ing->a[k].zName,
8610: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
8620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8630: 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20   pItem++;.      
8640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2b                i+
8650: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
8660: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8680: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
8690: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
86a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
86b0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  }.            br
86c0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
86d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
86e0: 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65   }.    }..#ifnde
86f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
8700: 49 47 47 45 52 0a 20 20 20 20 2f 2a 20 49 66 20  IGGER.    /* If 
8710: 77 65 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65  we have not alre
8720: 61 64 79 20 72 65 73 6f 6c 76 65 64 20 74 68 65  ady resolved the
8730: 20 6e 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62   name, then mayb
8740: 65 20 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20  e .    ** it is 
8750: 61 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a  a new.* or old.*
8760: 20 74 72 69 67 67 65 72 20 61 72 67 75 6d 65 6e   trigger argumen
8770: 74 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20  t reference.    
8780: 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d  */.    if( zDb==
8790: 30 20 26 26 20 7a 54 61 62 21 3d 30 20 26 26 20  0 && zTab!=0 && 
87a0: 63 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 73 65  cnt==0 && pParse
87b0: 2d 3e 74 72 69 67 53 74 61 63 6b 21 3d 30 20 29  ->trigStack!=0 )
87c0: 7b 0a 20 20 20 20 20 20 54 72 69 67 67 65 72 53  {.      TriggerS
87d0: 74 61 63 6b 20 2a 70 54 72 69 67 67 65 72 53 74  tack *pTriggerSt
87e0: 61 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72  ack = pParse->tr
87f0: 69 67 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 54  igStack;.      T
8800: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a  able *pTab = 0;.
8810: 20 20 20 20 20 20 75 33 32 20 2a 70 69 43 6f 6c        u32 *piCol
8820: 4d 61 73 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  Mask;.      if( 
8830: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e  pTriggerStack->n
8840: 65 77 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73  ewIdx != -1 && s
8850: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22 6e  qlite3StrICmp("n
8860: 65 77 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20  ew", zTab) == 0 
8870: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
8880: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67  ->iTable = pTrig
8890: 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78  gerStack->newIdx
88a0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
88b0: 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  ( pTriggerStack-
88c0: 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20  >pTab );.       
88d0: 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65 72   pTab = pTrigger
88e0: 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20  Stack->pTab;.   
88f0: 20 20 20 20 20 70 69 43 6f 6c 4d 61 73 6b 20 3d       piColMask =
8900: 20 26 28 70 54 72 69 67 67 65 72 53 74 61 63 6b   &(pTriggerStack
8910: 2d 3e 6e 65 77 43 6f 6c 4d 61 73 6b 29 3b 0a 20  ->newColMask);. 
8920: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
8930: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c  TriggerStack->ol
8940: 64 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71  dIdx != -1 && sq
8950: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c  lite3StrICmp("ol
8960: 64 22 2c 20 7a 54 61 62 29 3d 3d 30 20 29 7b 0a  d", zTab)==0 ){.
8970: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
8980: 54 61 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72  Table = pTrigger
8990: 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20  Stack->oldIdx;. 
89a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
89b0: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54  TriggerStack->pT
89c0: 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54  ab );.        pT
89d0: 61 62 20 3d 20 70 54 72 69 67 67 65 72 53 74 61  ab = pTriggerSta
89e0: 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  ck->pTab;.      
89f0: 20 20 70 69 43 6f 6c 4d 61 73 6b 20 3d 20 26 28    piColMask = &(
8a00: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f  pTriggerStack->o
8a10: 6c 64 43 6f 6c 4d 61 73 6b 29 3b 0a 20 20 20 20  ldColMask);.    
8a20: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
8a30: 54 61 62 20 29 7b 20 0a 20 20 20 20 20 20 20 20  Tab ){ .        
8a40: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  int iCol;.      
8a50: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
8a60: 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 0a 20 20   pTab->aCol;..  
8a70: 20 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20        pSchema = 
8a80: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20  pTab->pSchema;. 
8a90: 20 20 20 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b         cntTab++;
8aa0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f  .        for(iCo
8ab0: 6c 3d 30 3b 20 69 43 6f 6c 20 3c 20 70 54 61 62  l=0; iCol < pTab
8ac0: 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 2c 20  ->nCol; iCol++, 
8ad0: 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20 20  pCol++) {.      
8ae0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
8af0: 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61  trICmp(pCol->zNa
8b00: 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a  me, zCol)==0 ){.
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
8b20: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20  t char *zColl = 
8b30: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
8b40: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  .zColl;.        
8b50: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
8b60: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
8b70: 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3d 3d 70 54  olumn = iCol==pT
8b80: 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a  ab->iPKey ? -1 :
8b90: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20   iCol;.         
8ba0: 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
8bb0: 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ty = pTab->aCol[
8bc0: 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  iCol].affinity;.
8bd0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8be0: 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
8bf0: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3d 3d  EP_ExpCollate)==
8c00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
8c10: 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20     pExpr->pColl 
8c20: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
8c30: 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
8c40: 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a  , zColl,-1, 0);.
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8c60: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
8c70: 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20  >pTab = pTab;.  
8c80: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
8c90: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ol>=0 ){.       
8ca0: 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 4d 61 73         *piColMas
8cb0: 6b 20 7c 3d 20 28 28 75 33 32 29 31 3c 3c 69 43  k |= ((u32)1<<iC
8cc0: 6f 6c 29 20 7c 20 28 69 43 6f 6c 3e 3d 33 32 3f  ol) | (iCol>=32?
8cd0: 30 78 66 66 66 66 66 66 66 66 3a 30 29 3b 0a 20  0xffffffff:0);. 
8ce0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8cf0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
8d00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8d10: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8d20: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
8d30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8d40: 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 0a  IT_TRIGGER) */..
8d50: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 65      /*.    ** Pe
8d60: 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65 20 69  rhaps the name i
8d70: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
8d80: 20 74 68 65 20 52 4f 57 49 44 0a 20 20 20 20 2a   the ROWID.    *
8d90: 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30  /.    if( cnt==0
8da0: 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20 26 26   && cntTab==1 &&
8db0: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
8dc0: 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 63  zCol) ){.      c
8dd0: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 45  nt = 1;.      pE
8de0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d  xpr->iColumn = -
8df0: 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  1;.      pExpr->
8e00: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
8e10: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20  E_AFF_INTEGER;. 
8e20: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
8e30: 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74   ** If the input
8e40: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
8e50: 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e  Z (not Y.Z or X.
8e60: 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20 6e 61  Y.Z) then the na
8e70: 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69 67 68  me Z.    ** migh
8e80: 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72 65  t refer to an re
8e90: 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e 20  sult-set alias. 
8ea0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66   This happens, f
8eb0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
8ec0: 0a 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 72  .    ** we are r
8ed0: 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69  esolving names i
8ee0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
8ef0: 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  se of the follow
8f00: 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20  ing command:.   
8f10: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53   **.    **     S
8f20: 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78 20 46  ELECT a+b AS x F
8f30: 52 4f 4d 20 74 61 62 6c 65 20 57 48 45 52 45 20  ROM table WHERE 
8f40: 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  x<10;.    **.   
8f50: 20 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c 69 6b   ** In cases lik
8f60: 65 20 74 68 69 73 2c 20 72 65 70 6c 61 63 65 20  e this, replace 
8f70: 70 45 78 70 72 20 77 69 74 68 20 61 20 63 6f 70  pExpr with a cop
8f80: 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
8f90: 69 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ion that.    ** 
8fa0: 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75 6c 74  forms the result
8fb0: 20 73 65 74 20 65 6e 74 72 79 20 28 22 61 2b 62   set entry ("a+b
8fc0: 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  " in the example
8fd0: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d  ) and return imm
8fe0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
8ff0: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 65   Note that the e
9000: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
9010: 20 72 65 73 75 6c 74 20 73 65 74 20 73 68 6f 75   result set shou
9020: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
9030: 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65 73 6f  been.    ** reso
9040: 6c 76 65 64 20 62 79 20 74 68 65 20 74 69 6d 65  lved by the time
9050: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
9060: 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20  e is resolved.. 
9070: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e     */.    if( cn
9080: 74 3d 3d 30 20 26 26 20 28 70 45 4c 69 73 74 20  t==0 && (pEList 
9090: 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29 21 3d  = pNC->pEList)!=
90a0: 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b 0a  0 && zTab==0 ){.
90b0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
90c0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
90d0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
90e0: 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74  ar *zAs = pEList
90f0: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
9100: 20 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30        if( zAs!=0
9110: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
9120: 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30  mp(zAs, zCol)==0
9130: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
9140: 70 72 20 2a 70 44 75 70 2c 20 2a 70 4f 72 69 67  pr *pDup, *pOrig
9150: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
9160: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
9170: 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
9180: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
9190: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
91a0: 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a  pr->pList==0 );.
91b0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
91c0: 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  ( pExpr->pSelect
91d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
91e0: 20 70 4f 72 69 67 20 3d 20 70 45 4c 69 73 74 2d   pOrig = pEList-
91f0: 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[j].pExpr;.   
9200: 20 20 20 20 20 20 20 69 66 28 20 21 70 4e 43 2d         if( !pNC-
9210: 3e 61 6c 6c 6f 77 41 67 67 20 26 26 20 45 78 70  >allowAgg && Exp
9220: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f 72  rHasProperty(pOr
9230: 69 67 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a 20  ig, EP_Agg) ){. 
9240: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
9250: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9260: 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 6c  e, "misuse of al
9270: 69 61 73 65 64 20 61 67 67 72 65 67 61 74 65 20  iased aggregate 
9280: 25 73 22 2c 20 7a 41 73 29 3b 0a 20 20 20 20 20  %s", zAs);.     
9290: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
92a0: 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  ree(zCol);.     
92b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b         return 2;
92c0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
92d0: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71         pDup = sq
92e0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
92f0: 20 70 4f 72 69 67 29 3b 0a 20 20 20 20 20 20 20   pOrig);.       
9300: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c     if( pExpr->fl
9310: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
9320: 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ate ){.         
9330: 20 20 20 70 44 75 70 2d 3e 70 43 6f 6c 6c 20 3d     pDup->pColl =
9340: 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20   pExpr->pColl;. 
9350: 20 20 20 20 20 20 20 20 20 20 20 70 44 75 70 2d             pDup-
9360: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70  >flags |= EP_Exp
9370: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20  Collate;.       
9380: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
9390: 66 28 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64  f( pExpr->span.d
93a0: 79 6e 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  yn ) sqlite3_fre
93b0: 65 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  e((char*)pExpr->
93c0: 73 70 61 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 20  span.z);.       
93d0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f     if( pExpr->to
93e0: 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65  ken.dyn ) sqlite
93f0: 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70 45  3_free((char*)pE
9400: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20  xpr->token.z);. 
9410: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
9420: 70 45 78 70 72 2c 20 70 44 75 70 2c 20 73 69 7a  pExpr, pDup, siz
9430: 65 6f 66 28 2a 70 45 78 70 72 29 29 3b 0a 20 20  eof(*pExpr));.  
9440: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9450: 66 72 65 65 28 70 44 75 70 29 3b 0a 20 20 20 20  free(pDup);.    
9460: 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20        cnt = 1;. 
9470: 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20           pMatch 
9480: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
9490: 73 73 65 72 74 28 20 7a 54 61 62 3d 3d 30 20 26  ssert( zTab==0 &
94a0: 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  & zDb==0 );.    
94b0: 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75        goto looku
94c0: 70 6e 61 6d 65 5f 65 6e 64 5f 32 3b 0a 20 20 20  pname_end_2;.   
94d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a       }.      } .
94e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
94f0: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
9500: 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20  t name context. 
9510: 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 65   The loop will e
9520: 78 69 74 20 77 68 65 6e 20 65 69 74 68 65 72 0a  xit when either.
9530: 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 61      ** we have a
9540: 20 6d 61 74 63 68 20 28 63 6e 74 3e 30 29 20 6f   match (cnt>0) o
9550: 72 20 77 68 65 6e 20 77 65 20 72 75 6e 20 6f 75  r when we run ou
9560: 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e 74 65 78  t of name contex
9570: 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ts..    */.    i
9580: 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  f( cnt==0 ){.   
9590: 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e     pNC = pNC->pN
95a0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
95b0: 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 58 20 61    /*.  ** If X a
95c0: 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c 20 28 69  nd Y are NULL (i
95d0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66  n other words if
95e0: 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   only the column
95f0: 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20 2a 2a 20   name Z is.  ** 
9600: 73 75 70 70 6c 69 65 64 29 20 61 6e 64 20 74 68  supplied) and th
9610: 65 20 76 61 6c 75 65 20 6f 66 20 5a 20 69 73 20  e value of Z is 
9620: 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75 62  enclosed in doub
9630: 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68 65 6e 0a  le-quotes, then.
9640: 20 20 2a 2a 20 5a 20 69 73 20 61 20 73 74 72 69    ** Z is a stri
9650: 6e 67 20 6c 69 74 65 72 61 6c 20 69 66 20 69 74  ng literal if it
9660: 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 61   doesn't match a
9670: 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  ny column names.
9680: 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63    In that.  ** c
9690: 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ase, we need to 
96a0: 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
96b0: 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b 65 20 61  y and not make a
96c0: 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20  ny changes to.  
96d0: 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a 2a 0a 20  ** pExpr..  **. 
96e0: 20 2a 2a 20 42 65 63 61 75 73 65 20 6e 6f 20 72   ** Because no r
96f0: 65 66 65 72 65 6e 63 65 20 77 61 73 20 6d 61 64  eference was mad
9700: 65 20 74 6f 20 6f 75 74 65 72 20 63 6f 6e 74 65  e to outer conte
9710: 78 74 73 2c 20 74 68 65 20 70 4e 43 2d 3e 6e 52  xts, the pNC->nR
9720: 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64 73 20 61  ef.  ** fields a
9730: 72 65 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 69  re not changed i
9740: 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74 2e 0a 20  n any context.. 
9750: 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30   */.  if( cnt==0
9760: 20 26 26 20 7a 54 61 62 3d 3d 30 20 26 26 20 70   && zTab==0 && p
9770: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 5b 30  ColumnToken->z[0
9780: 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 73 71  ]=='"' ){.    sq
9790: 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 29  lite3_free(zCol)
97a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
97b0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63    }..  /*.  ** c
97c0: 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 72  nt==0 means ther
97d0: 65 20 77 61 73 20 6e 6f 74 20 6d 61 74 63 68 2e  e was not match.
97e0: 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74 68    cnt>1 means th
97f0: 65 72 65 20 77 65 72 65 20 74 77 6f 20 6f 72 0a  ere were two or.
9800: 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68 65    ** more matche
9810: 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  s.  Either way, 
9820: 77 65 20 68 61 76 65 20 61 6e 20 65 72 72 6f 72  we have an error
9830: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74  ..  */.  if( cnt
9840: 21 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  !=1 ){.    const
9850: 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20   char *zErr;.   
9860: 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f   zErr = cnt==0 ?
9870: 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e   "no such column
9880: 22 20 3a 20 22 61 6d 62 69 67 75 6f 75 73 20 63  " : "ambiguous c
9890: 6f 6c 75 6d 6e 20 6e 61 6d 65 22 3b 0a 20 20 20  olumn name";.   
98a0: 20 69 66 28 20 7a 44 62 20 29 7b 0a 20 20 20 20   if( zDb ){.    
98b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
98c0: 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25  g(pParse, "%s: %
98d0: 73 2e 25 73 2e 25 73 22 2c 20 7a 45 72 72 2c 20  s.%s.%s", zErr, 
98e0: 7a 44 62 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c 29  zDb, zTab, zCol)
98f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9900: 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71  zTab ){.      sq
9910: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9920: 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73  arse, "%s: %s.%s
9930: 22 2c 20 7a 45 72 72 2c 20 7a 54 61 62 2c 20 7a  ", zErr, zTab, z
9940: 43 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Col);.    }else{
9950: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
9960: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9970: 25 73 3a 20 25 73 22 2c 20 7a 45 72 72 2c 20 7a  %s: %s", zErr, z
9980: 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col);.    }.    
9990: 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a  pTopNC->nErr++;.
99a0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63    }..  /* If a c
99b0: 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62  olumn from a tab
99c0: 6c 65 20 69 6e 20 70 53 72 63 4c 69 73 74 20 69  le in pSrcList i
99d0: 73 20 72 65 66 65 72 65 6e 63 65 64 2c 20 74 68  s referenced, th
99e0: 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74  en record.  ** t
99f0: 68 69 73 20 66 61 63 74 20 69 6e 20 74 68 65 20  his fact in the 
9a00: 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c  pSrcList.a[].col
9a10: 55 73 65 64 20 62 69 74 6d 61 73 6b 2e 20 20 43  Used bitmask.  C
9a20: 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65 73 0a 20  olumn 0 causes. 
9a30: 20 2a 2a 20 62 69 74 20 30 20 74 6f 20 62 65 20   ** bit 0 to be 
9a40: 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73  set.  Column 1 s
9a50: 65 74 73 20 62 69 74 20 31 2e 20 20 41 6e 64 20  ets bit 1.  And 
9a60: 73 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 74 68  so forth.  If th
9a70: 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75  e.  ** column nu
9a80: 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20  mber is greater 
9a90: 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  than the number 
9aa0: 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 62  of bits in the b
9ab0: 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e  itmask.  ** then
9ac0: 20 73 65 74 20 74 68 65 20 68 69 67 68 2d 6f 72   set the high-or
9ad0: 64 65 72 20 62 69 74 20 6f 66 20 74 68 65 20 62  der bit of the b
9ae0: 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  itmask..  */.  i
9af0: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
9b00: 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63 68 21 3d  n>=0 && pMatch!=
9b10: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  0 ){.    int n =
9b20: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
9b30: 0a 20 20 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65  .    if( n>=size
9b40: 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 7b  of(Bitmask)*8 ){
9b50: 0a 20 20 20 20 20 20 6e 20 3d 20 73 69 7a 65 6f  .      n = sizeo
9b60: 66 28 42 69 74 6d 61 73 6b 29 2a 38 2d 31 3b 0a  f(Bitmask)*8-1;.
9b70: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
9b80: 28 20 70 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f  ( pMatch->iCurso
9b90: 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r==pExpr->iTable
9ba0: 20 29 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e   );.    pMatch->
9bb0: 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42 69 74  colUsed |= ((Bit
9bc0: 6d 61 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a  mask)1)<<n;.  }.
9bd0: 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a  .lookupname_end:
9be0: 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61  .  /* Clean up a
9bf0: 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20  nd return.  */. 
9c00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44   sqlite3_free(zD
9c10: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  b);.  sqlite3_fr
9c20: 65 65 28 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69  ee(zTab);.  sqli
9c30: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45  te3ExprDelete(pE
9c40: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70  xpr->pLeft);.  p
9c50: 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b  Expr->pLeft = 0;
9c60: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
9c70: 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67  lete(pExpr->pRig
9c80: 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52  ht);.  pExpr->pR
9c90: 69 67 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70  ight = 0;.  pExp
9ca0: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  r->op = TK_COLUM
9cb0: 4e 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e  N;.lookupname_en
9cc0: 64 5f 32 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  d_2:.  sqlite3_f
9cd0: 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 69 66 28  ree(zCol);.  if(
9ce0: 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 61   cnt==1 ){.    a
9cf0: 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b  ssert( pNC!=0 );
9d00: 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68  .    sqlite3Auth
9d10: 52 65 61 64 28 70 50 61 72 73 65 2c 20 70 45 78  Read(pParse, pEx
9d20: 70 72 2c 20 70 53 63 68 65 6d 61 2c 20 70 4e 43  pr, pSchema, pNC
9d30: 2d 3e 70 53 72 63 4c 69 73 74 29 3b 0a 20 20 20  ->pSrcList);.   
9d40: 20 69 66 28 20 70 4d 61 74 63 68 20 26 26 20 21   if( pMatch && !
9d50: 70 4d 61 74 63 68 2d 3e 70 53 65 6c 65 63 74 20  pMatch->pSelect 
9d60: 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
9d70: 70 54 61 62 20 3d 20 70 4d 61 74 63 68 2d 3e 70  pTab = pMatch->p
9d80: 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  Tab;.    }.    /
9d90: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
9da0: 6e 52 65 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c  nRef value on al
9db0: 6c 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20  l name contexts 
9dc0: 66 72 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f  from TopNC up to
9dd0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  .    ** the poin
9de0: 74 20 77 68 65 72 65 20 74 68 65 20 6e 61 6d 65  t where the name
9df0: 20 6d 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20   matched. */.   
9e00: 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
9e10: 61 73 73 65 72 74 28 20 70 54 6f 70 4e 43 21 3d  assert( pTopNC!=
9e20: 30 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e  0 );.      pTopN
9e30: 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  C->nRef++;.     
9e40: 20 69 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43   if( pTopNC==pNC
9e50: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
9e60: 70 54 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d  pTopNC = pTopNC-
9e70: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
9e80: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20    return 0;.  } 
9e90: 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
9ea0: 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
9eb0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9ec0: 73 20 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e  s designed as an
9ed0: 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45   xFunc for walkE
9ee0: 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a  xprTree()..**.**
9ef0: 20 52 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69   Resolve symboli
9f00: 63 20 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f  c names into TK_
9f10: 43 4f 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73  COLUMN operators
9f20: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
9f30: 0a 2a 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65 20  .** node in the 
9f40: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
9f50: 20 20 52 65 74 75 72 6e 20 30 20 74 6f 20 63 6f    Return 0 to co
9f60: 6e 74 69 6e 75 65 20 74 68 65 20 73 65 61 72 63  ntinue the searc
9f70: 68 20 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72  h down.** the tr
9f80: 65 65 20 6f 72 20 32 20 74 6f 20 61 62 6f 72 74  ee or 2 to abort
9f90: 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a   the tree walk..
9fa0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
9fb0: 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 65 72 72  ne also does err
9fc0: 6f 72 20 63 68 65 63 6b 69 6e 67 20 61 6e 64 20  or checking and 
9fd0: 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
9fe0: 66 6f 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  for.** function 
9ff0: 6e 61 6d 65 73 2e 20 20 54 68 65 20 6f 70 65 72  names.  The oper
a000: 61 74 6f 72 20 66 6f 72 20 61 67 67 72 65 67 61  ator for aggrega
a010: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20  te functions is 
a020: 63 68 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b  changed.** to TK
a030: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a  _AGG_FUNCTION..*
a040: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d  /.static int nam
a050: 65 52 65 73 6f 6c 76 65 72 53 74 65 70 28 76 6f  eResolverStep(vo
a060: 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a  id *pArg, Expr *
a070: 70 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f  pExpr){.  NameCo
a080: 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61  ntext *pNC = (Na
a090: 6d 65 43 6f 6e 74 65 78 74 2a 29 70 41 72 67 3b  meContext*)pArg;
a0a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a0b0: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
a0c0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
a0d0: 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29  assert( pNC!=0 )
a0e0: 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43  ;.  pParse = pNC
a0f0: 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28  ->pParse;..  if(
a100: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
a110: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65  rty(pExpr, EP_Re
a120: 73 6f 6c 76 65 64 29 20 29 20 72 65 74 75 72 6e  solved) ) return
a130: 20 31 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f   1;.  ExprSetPro
a140: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
a150: 52 65 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64  Resolved);.#ifnd
a160: 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20  ef NDEBUG.  if( 
a170: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 20 26 26  pNC->pSrcList &&
a180: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e   pNC->pSrcList->
a190: 6e 41 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20  nAlloc>0 ){.    
a1a0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
a1b0: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
a1c0: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
a1d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43    for(i=0; i<pNC
a1e0: 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  ->pSrcList->nSrc
a1f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
a200: 73 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e  sert( pSrcList->
a210: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20  a[i].iCursor>=0 
a220: 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69  && pSrcList->a[i
a230: 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65  ].iCursor<pParse
a240: 2d 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ->nTab);.    }. 
a250: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74   }.#endif.  swit
a260: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
a270: 0a 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71  .    /* Double-q
a280: 75 6f 74 65 64 20 73 74 72 69 6e 67 73 20 28 65  uoted strings (e
a290: 78 3a 20 22 61 62 63 22 29 20 61 72 65 20 75 73  x: "abc") are us
a2a0: 65 64 20 61 73 20 69 64 65 6e 74 69 66 69 65 72  ed as identifier
a2b0: 73 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73  s if.    ** poss
a2c0: 69 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  ible.  Otherwise
a2d0: 20 74 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20   they remain as 
a2e0: 73 74 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65  strings.  Single
a2f0: 2d 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73  -quoted.    ** s
a300: 74 72 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63  trings (ex: 'abc
a310: 27 29 20 61 72 65 20 61 6c 77 61 79 73 20 73 74  ') are always st
a320: 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20  ring literals.. 
a330: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
a340: 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
a350: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
a360: 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20  en.z[0]=='\'' ) 
a370: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20  break;.      /* 
a380: 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  Fall thru into t
a390: 68 65 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66  he TK_ID case if
a3a0: 20 74 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c   this is a doubl
a3b0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
a3c0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  */.    }.    /* 
a3d0: 41 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65  A lone identifie
a3e0: 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
a3f0: 20 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a   a column..    *
a400: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  /.    case TK_ID
a410: 3a 20 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70  : {.      lookup
a420: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20  Name(pParse, 0, 
a430: 30 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  0, &pExpr->token
a440: 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20  , pNC, pExpr);. 
a450: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
a460: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41     }.  .    /* A
a470: 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
a480: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20  column name:    
a490: 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72   ID.ID.    ** Or
a4a0: 20 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62   a database, tab
a4b0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20  le and column:  
a4c0: 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a  ID.ID.ID.    */.
a4d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a      case TK_DOT:
a4e0: 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a   {.      Token *
a4f0: 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54  pColumn;.      T
a500: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20  oken *pTable;.  
a510: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a      Token *pDb;.
a520: 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
a530: 68 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66  ht;..      /* if
a540: 28 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  ( pSrcList==0 ) 
a550: 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20  break; */.      
a560: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
a570: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66  pRight;.      if
a580: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
a590: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _ID ){.        p
a5a0: 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  Db = 0;.        
a5b0: 70 54 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d  pTable = &pExpr-
a5c0: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
a5d0: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d         pColumn =
a5e0: 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b   &pRight->token;
a5f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a600: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
a610: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ight->op==TK_DOT
a620: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20   );.        pDb 
a630: 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = &pExpr->pLeft-
a640: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
a650: 70 54 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74  pTable = &pRight
a660: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
a670: 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20          pColumn 
a680: 3d 20 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68  = &pRight->pRigh
a690: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
a6a0: 7d 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61  }.      lookupNa
a6b0: 6d 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20  me(pParse, pDb, 
a6c0: 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c  pTable, pColumn,
a6d0: 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20   pNC, pExpr);.  
a6e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
a6f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f    }..    /* Reso
a700: 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  lve function nam
a710: 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  es.    */.    ca
a720: 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  se TK_CONST_FUNC
a730: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
a740: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
a750: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
a760: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20  = pExpr->pList; 
a770: 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65     /* The argume
a780: 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20  nt list */.     
a790: 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f   int n = pList ?
a7a0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
a7b0: 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
a7c0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
a7d0: 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f      int no_such_
a7e0: 66 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  func = 0;       
a7f0: 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75  /* True if no su
a800: 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  ch function exis
a810: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
a820: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d  wrong_num_args =
a830: 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
a840: 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  if wrong number 
a850: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
a860: 20 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67        int is_agg
a870: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
a880: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20    /* True if is 
a890: 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  an aggregate fun
a8a0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ction */.      i
a8b0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
a8c0: 61 75 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  auth;           
a8d0: 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 68 6f          /* Autho
a8e0: 72 69 7a 61 74 69 6f 6e 20 74 6f 20 75 73 65 20  rization to use 
a8f0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
a900: 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20        int nId;  
a910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a920: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
a930: 68 61 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e  haracters in fun
a940: 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
a950: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
a960: 7a 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  zId;            
a970: 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
a980: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46  name. */.      F
a990: 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20  uncDef *pDef;   
a9a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
a9b0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
a9c0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
a9d0: 20 20 20 20 20 20 69 6e 74 20 65 6e 63 20 3d 20        int enc = 
a9e0: 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
a9f0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
aa00: 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20  e encoding */.. 
aa10: 20 20 20 20 20 7a 49 64 20 3d 20 28 63 68 61 72       zId = (char
aa20: 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
aa30: 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45  ;.      nId = pE
aa40: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20  xpr->token.n;.  
aa50: 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
aa60: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
aa70: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20  Parse->db, zId, 
aa80: 6e 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b  nId, n, enc, 0);
aa90: 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
aaa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  =0 ){.        pD
aab0: 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
aac0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
aad0: 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d  >db, zId, nId, -
aae0: 31 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  1, enc, 0);.    
aaf0: 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
ab00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f  ){.          no_
ab10: 73 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20  such_func = 1;. 
ab20: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ab30: 20 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75          wrong_nu
ab40: 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20  m_args = 1;.    
ab50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
ab60: 65 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67  e{.        is_ag
ab70: 67 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d  g = pDef->xFunc=
ab80: 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  =0;.      }.#ifn
ab90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
aba0: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
abb0: 20 20 20 20 69 66 28 20 70 44 65 66 20 29 7b 0a      if( pDef ){.
abc0: 20 20 20 20 20 20 20 20 61 75 74 68 20 3d 20 73          auth = s
abd0: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
abe0: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 46  pParse, SQLITE_F
abf0: 55 4e 43 54 49 4f 4e 2c 20 30 2c 20 70 44 65 66  UNCTION, 0, pDef
ac00: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
ac10: 20 20 20 20 20 69 66 28 20 61 75 74 68 21 3d 53       if( auth!=S
ac20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ac30: 20 20 20 20 20 20 69 66 28 20 61 75 74 68 3d 3d        if( auth==
ac40: 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20  SQLITE_DENY ){. 
ac50: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ac60: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
ac70: 65 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a  e, "not authoriz
ac80: 65 64 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69  ed to use functi
ac90: 6f 6e 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20  on: %s",.       
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
acc0: 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  f->zName);.     
acd0: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
ace0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
acf0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
ad00: 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
ad10: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
ad20: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
ad30: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
ad40: 20 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20    if( is_agg && 
ad50: 21 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 29  !pNC->allowAgg )
ad60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ad70: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
ad80: 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67  , "misuse of agg
ad90: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
ada0: 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64  %.*s()", nId,zId
adb0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e  );.        pNC->
adc0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
add0: 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20  is_agg = 0;.    
ade0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73    }else if( no_s
adf0: 75 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20  uch_func ){.    
ae00: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ae10: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
ae20: 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25  such function: %
ae30: 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b  .*s", nId, zId);
ae40: 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45  .        pNC->nE
ae50: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rr++;.      }els
ae60: 65 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f  e if( wrong_num_
ae70: 61 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20  args ){.        
ae80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ae90: 70 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75  pParse,"wrong nu
aea0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
aeb0: 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e  s to function %.
aec0: 2a 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20  *s()",.         
aed0: 20 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20      nId, zId);. 
aee0: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
aef0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
af00: 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a    if( is_agg ){.
af10: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
af20: 70 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  p = TK_AGG_FUNCT
af30: 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e 43  ION;.        pNC
af40: 2d 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20  ->hasAgg = 1;.  
af50: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
af60: 69 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c  is_agg ) pNC->al
af70: 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 20 20  lowAgg = 0;.    
af80: 20 20 66 6f 72 28 69 3d 30 3b 20 70 4e 43 2d 3e    for(i=0; pNC->
af90: 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20  nErr==0 && i<n; 
afa0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 77 61  i++){.        wa
afb0: 6c 6b 45 78 70 72 54 72 65 65 28 70 4c 69 73 74  lkExprTree(pList
afc0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 61  ->a[i].pExpr, na
afd0: 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20  meResolverStep, 
afe0: 70 4e 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pNC);.      }.  
aff0: 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29      if( is_agg )
b000: 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d   pNC->allowAgg =
b010: 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58   1;.      /* FIX
b020: 20 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45   ME:  Compute pE
b030: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61  xpr->affinity ba
b040: 73 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63  sed on the expec
b050: 74 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20  ted return.     
b060: 20 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20   ** type of the 
b070: 66 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20  function .      
b080: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
b090: 69 73 5f 61 67 67 3b 0a 20 20 20 20 7d 0a 23 69  is_agg;.    }.#i
b0a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b0b0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
b0c0: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20  ase TK_SELECT:. 
b0d0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
b0e0: 53 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61  S:.#endif.    ca
b0f0: 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
b100: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65    if( pExpr->pSe
b110: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
b120: 69 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e  int nRef = pNC->
b130: 6e 52 65 66 3b 0a 23 69 66 6e 64 65 66 20 53 51  nRef;.#ifndef SQ
b140: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
b150: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d          if( pNC-
b160: 3e 69 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20  >isCheck ){.    
b170: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
b180: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 73 75  orMsg(pParse,"su
b190: 62 71 75 65 72 69 65 73 20 70 72 6f 68 69 62 69  bqueries prohibi
b1a0: 74 65 64 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e  ted in CHECK con
b1b0: 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20  straints");.    
b1c0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b1d0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
b1e0: 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65  ctResolve(pParse
b1f0: 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  , pExpr->pSelect
b200: 2c 20 70 4e 43 29 3b 0a 20 20 20 20 20 20 20 20  , pNC);.        
b210: 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65  assert( pNC->nRe
b220: 66 3e 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20 20  f>=nRef );.     
b230: 20 20 20 69 66 28 20 6e 52 65 66 21 3d 70 4e 43     if( nRef!=pNC
b240: 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20 20 20  ->nRef ){.      
b250: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
b260: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
b270: 72 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  rSelect);.      
b280: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b290: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
b2a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b2b0: 49 54 5f 43 48 45 43 4b 0a 20 20 20 20 63 61 73  IT_CHECK.    cas
b2c0: 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
b2d0: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e  .      if( pNC->
b2e0: 69 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20  isCheck ){.     
b2f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
b300: 73 67 28 70 50 61 72 73 65 2c 22 70 61 72 61 6d  sg(pParse,"param
b310: 65 74 65 72 73 20 70 72 6f 68 69 62 69 74 65 64  eters prohibited
b320: 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72   in CHECK constr
b330: 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 7d  aints");.      }
b340: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b350: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
b360: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
b370: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b380: 20 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73   walks an expres
b390: 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65  sion tree and re
b3a0: 73 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65  solves reference
b3b0: 73 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f  s to.** table co
b3c0: 6c 75 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66  lumns.  Nodes of
b3d0: 20 74 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20   the form ID.ID 
b3e0: 6f 72 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e  or ID resolve in
b3f0: 74 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74  to an.** index t
b400: 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74  o the table in t
b410: 68 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e  he table list an
b420: 64 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65  d a column offse
b430: 74 2e 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72  t.  The .** Expr
b440: 2e 6f 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68  .opcode for such
b450: 20 6e 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65   nodes is change
b460: 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20  d to TK_COLUMN. 
b470: 20 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65   The Expr.iTable
b480: 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61  .** value is cha
b490: 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65  nged to the inde
b4a0: 78 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e  x of the referen
b4b0: 63 65 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61  ced table in pTa
b4c0: 62 4c 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68  bList.** plus th
b4d0: 65 20 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20  e "base" value. 
b4e0: 20 54 68 65 20 62 61 73 65 20 76 61 6c 75 65 20   The base value 
b4f0: 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20  will ultimately 
b500: 62 65 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44  become the.** VD
b510: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
b520: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68   for a cursor th
b530: 61 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69  at is pointing i
b540: 6e 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63  nto the referenc
b550: 65 64 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68  ed.** table.  Th
b560: 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76  e Expr.iColumn v
b570: 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20  alue is changed 
b580: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
b590: 74 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f  the column .** o
b5a0: 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  f the referenced
b5b0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70   table.  The Exp
b5c0: 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  r.iColumn value 
b5d0: 66 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a  for the special.
b5e0: 2a 2a 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  ** ROWID column 
b5f0: 69 73 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45  is -1.  Any INTE
b600: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
b610: 63 6f 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20  column is tried 
b620: 61 73 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66  as an.** alias f
b630: 6f 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20  or ROWID..**.** 
b640: 41 6c 73 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e  Also resolve fun
b650: 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20  ction names and 
b660: 63 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69  check the functi
b670: 6f 6e 73 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a  ons for proper.*
b680: 2a 20 75 73 61 67 65 2e 20 20 4d 61 6b 65 20 73  * usage.  Make s
b690: 75 72 65 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e  ure all function
b6a0: 20 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67   names are recog
b6b0: 6e 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75  nized and all fu
b6c0: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20  nctions.** have 
b6d0: 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62  the correct numb
b6e0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  er of arguments.
b6f0: 20 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72    Leave an error
b700: 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70   message.** in p
b710: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69  Parse->zErrMsg i
b720: 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d  f anything is am
b730: 69 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  iss.  Return the
b740: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
b750: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
b760: 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61  expression conta
b770: 69 6e 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ins aggregate fu
b780: 6e 63 74 69 6f 6e 73 20 74 68 65 6e 20 73 65 74  nctions then set
b790: 20 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70   the EP_Agg.** p
b7a0: 72 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65  roperty on the e
b7b0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e  xpression..*/.in
b7c0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  t sqlite3ExprRes
b7d0: 6f 6c 76 65 4e 61 6d 65 73 28 20 0a 20 20 4e 61  olveNames( .  Na
b7e0: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
b7f0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61        /* Namespa
b800: 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78  ce to resolve ex
b810: 70 72 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f  pressions in. */
b820: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
b830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b840: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  e expression to 
b850: 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a  be analyzed. */.
b860: 29 7b 0a 20 20 69 6e 74 20 73 61 76 65 64 48 61  ){.  int savedHa
b870: 73 41 67 67 3b 0a 20 20 69 66 28 20 70 45 78 70  sAgg;.  if( pExp
b880: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
b890: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
b8a0: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 53 51 4c  ITE_TEST) || SQL
b8b0: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
b8c0: 54 48 3e 30 0a 20 20 69 66 28 20 28 70 45 78 70  TH>0.  if( (pExp
b8d0: 72 2d 3e 6e 48 65 69 67 68 74 2b 70 4e 43 2d 3e  r->nHeight+pNC->
b8e0: 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 29  pParse->nHeight)
b8f0: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52  >SQLITE_MAX_EXPR
b900: 5f 44 45 50 54 48 20 29 7b 0a 20 20 20 20 73 71  _DEPTH ){.    sq
b910: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 4e  lite3ErrorMsg(pN
b920: 43 2d 3e 70 50 61 72 73 65 2c 20 0a 20 20 20 20  C->pParse, .    
b930: 20 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74     "Expression t
b940: 72 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ree is too large
b950: 20 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20   (maximum depth 
b960: 25 64 29 22 2c 0a 20 20 20 20 20 20 20 53 51 4c  %d)",.       SQL
b970: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
b980: 54 48 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65  TH.    );.    re
b990: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 4e  turn 1;.  }.  pN
b9a0: 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67  C->pParse->nHeig
b9b0: 68 74 20 2b 3d 20 70 45 78 70 72 2d 3e 6e 48 65  ht += pExpr->nHe
b9c0: 69 67 68 74 3b 0a 23 65 6e 64 69 66 0a 20 20 73  ight;.#endif.  s
b9d0: 61 76 65 64 48 61 73 41 67 67 20 3d 20 70 4e 43  avedHasAgg = pNC
b9e0: 2d 3e 68 61 73 41 67 67 3b 0a 20 20 70 4e 43 2d  ->hasAgg;.  pNC-
b9f0: 3e 68 61 73 41 67 67 20 3d 20 30 3b 0a 20 20 77  >hasAgg = 0;.  w
ba00: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70  alkExprTree(pExp
ba10: 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53  r, nameResolverS
ba20: 74 65 70 2c 20 70 4e 43 29 3b 0a 23 69 66 20 64  tep, pNC);.#if d
ba30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
ba40: 53 54 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  ST) || SQLITE_MA
ba50: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20  X_EXPR_DEPTH>0. 
ba60: 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 48   pNC->pParse->nH
ba70: 65 69 67 68 74 20 2d 3d 20 70 45 78 70 72 2d 3e  eight -= pExpr->
ba80: 6e 48 65 69 67 68 74 3b 0a 23 65 6e 64 69 66 0a  nHeight;.#endif.
ba90: 20 20 69 66 28 20 70 4e 43 2d 3e 6e 45 72 72 3e    if( pNC->nErr>
baa0: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  0 ){.    ExprSet
bab0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
bac0: 45 50 5f 45 72 72 6f 72 29 3b 0a 20 20 7d 0a 20  EP_Error);.  }. 
bad0: 20 69 66 28 20 70 4e 43 2d 3e 68 61 73 41 67 67   if( pNC->hasAgg
bae0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
baf0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
bb00: 50 5f 41 67 67 29 3b 0a 20 20 7d 65 6c 73 65 20  P_Agg);.  }else 
bb10: 69 66 28 20 73 61 76 65 64 48 61 73 41 67 67 20  if( savedHasAgg 
bb20: 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 68 61 73 41  ){.    pNC->hasA
bb30: 67 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  gg = 1;.  }.  re
bb40: 74 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70  turn ExprHasProp
bb50: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45  erty(pExpr, EP_E
bb60: 72 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rror);.}../*.** 
bb70: 41 20 70 6f 69 6e 74 65 72 20 69 6e 73 74 61 6e  A pointer instan
bb80: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
bb90: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
bba0: 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  pass information
bbb0: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 77 61 6c 6b  .** through walk
bbc0: 45 78 70 72 54 72 65 65 20 69 6e 74 6f 20 63 6f  ExprTree into co
bbd0: 64 65 53 75 62 71 75 65 72 79 53 74 65 70 28 29  deSubqueryStep()
bbe0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
bbf0: 75 63 74 20 51 75 65 72 79 43 6f 64 65 72 20 51  uct QueryCoder Q
bc00: 75 65 72 79 43 6f 64 65 72 3b 0a 73 74 72 75 63  ueryCoder;.struc
bc10: 74 20 51 75 65 72 79 43 6f 64 65 72 20 7b 0a 20  t QueryCoder {. 
bc20: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
bc30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
bc40: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
bc50: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
bc60: 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70  NC;    /* Namesp
bc70: 61 63 65 20 6f 66 20 66 69 72 73 74 20 65 6e 63  ace of first enc
bc80: 6c 6f 73 69 6e 67 20 71 75 65 72 79 20 2a 2f 0a  losing query */.
bc90: 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  };..#ifdef SQLIT
bca0: 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 73 71 6c  E_TEST.  int sql
bcb0: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f  ite3_enable_in_o
bcc0: 70 74 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20  pt = 1;.#else.  
bcd0: 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 5f  #define sqlite3_
bce0: 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 20 31 0a  enable_in_opt 1.
bcf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
bd00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
bd10: 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65  sed by the imple
bd20: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
bd30: 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74   IN (...) operat
bd40: 6f 72 2e 0a 2a 2a 20 49 74 27 73 20 6a 6f 62 20  or..** It's job 
bd50: 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72  is to find or cr
bd60: 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 73 74  eate a b-tree st
bd70: 72 75 63 74 75 72 65 20 74 68 61 74 20 6d 61 79  ructure that may
bd80: 20 62 65 20 75 73 65 64 0a 2a 2a 20 65 69 74 68   be used.** eith
bd90: 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d  er to test for m
bda0: 65 6d 62 65 72 73 68 69 70 20 6f 66 20 74 68 65  embership of the
bdb0: 20 28 2e 2e 2e 29 20 73 65 74 20 6f 72 20 74 6f   (...) set or to
bdc0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
bdd0: 0a 2a 2a 20 69 74 73 20 6d 65 6d 62 65 72 73 2c  .** its members,
bde0: 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63   skipping duplic
bdf0: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ates..**.** The 
be00: 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 6f 6e  cursor opened on
be10: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 28   the structure (
be20: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20  database table, 
be30: 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 0a  database index .
be40: 2a 2a 20 6f 72 20 65 70 68 65 72 6d 61 6c 20 74  ** or ephermal t
be50: 61 62 6c 65 29 20 69 73 20 73 74 6f 72 65 64 20  able) is stored 
be60: 69 6e 20 70 58 2d 3e 69 54 61 62 6c 65 20 62 65  in pX->iTable be
be70: 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
be80: 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 20 54  on returns..** T
be90: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
bea0: 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20  e indicates the 
beb0: 73 74 72 75 63 74 75 72 65 20 74 79 70 65 2c 20  structure type, 
bec0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
bed0: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  *   IN_INDEX_ROW
bee0: 49 44 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20  ID - The cursor 
bef0: 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
bf00: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a  database table..
bf10: 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  **   IN_INDEX_IN
bf20: 44 45 58 20 2d 20 54 68 65 20 63 75 72 73 6f 72  DEX - The cursor
bf30: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
bf40: 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 2e   database index.
bf50: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45  .**   IN_INDEX_E
bf60: 50 48 20 2d 20 20 20 54 68 65 20 63 75 72 73 6f  PH -   The curso
bf70: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
bf80: 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61  a specially crea
bf90: 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ted and.**      
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
bfb0: 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61  pulated epherema
bfc0: 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  l table..**.** A
bfd0: 6e 20 65 78 69 73 74 69 6e 67 20 73 74 72 75 63  n existing struc
bfe0: 74 75 72 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65  ture may only be
bff0: 20 75 73 65 64 20 69 66 20 74 68 65 20 53 45 4c   used if the SEL
c000: 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 73 69  ECT is of the si
c010: 6d 70 6c 65 0a 2a 2a 20 66 6f 72 6d 3a 0a 2a 2a  mple.** form:.**
c020: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c  .**     SELECT <
c030: 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61  column> FROM <ta
c040: 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble>.**.** If th
c050: 65 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 70  e mustBeUnique p
c060: 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73  arameter is fals
c070: 65 2c 20 74 68 65 20 73 74 72 75 63 74 75 72 65  e, the structure
c080: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a   will be used .*
c090: 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d  * for fast set m
c0a0: 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2e  embership tests.
c0b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   In this case an
c0c0: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
c0d0: 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65   must .** be use
c0e0: 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e  d unless <column
c0f0: 3e 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20  > is an INTEGER 
c100: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61  PRIMARY KEY or a
c110: 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20  n index can .** 
c120: 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63  be found with <c
c130: 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65  olumn> as its le
c140: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a  ft-most column..
c150: 2a 2a 0a 2a 2a 20 49 66 20 6d 75 73 74 42 65 55  **.** If mustBeU
c160: 6e 69 71 75 65 20 69 73 20 74 72 75 65 2c 20 74  nique is true, t
c170: 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  hen the structur
c180: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  e will be used t
c190: 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72  o iterate.** thr
c1a0: 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d  ough the set mem
c1b0: 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 61  bers, skipping a
c1c0: 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20 49  ny duplicates. I
c1d0: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a 2a  n this case an.*
c1e0: 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  * epheremal tabl
c1f0: 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75  e must be used u
c200: 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74  nless the select
c210: 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67  ed <column> is g
c220: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
c230: 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68  be unique - eith
c240: 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73  er because it is
c250: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
c260: 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a  ARY KEY or it.**
c270: 20 69 73 20 75 6e 69 71 75 65 20 62 79 20 76 69   is unique by vi
c280: 72 74 75 65 20 6f 66 20 61 20 63 6f 6e 73 74 72  rtue of a constr
c290: 61 69 6e 74 20 6f 72 20 69 6d 70 6c 69 63 69 74  aint or implicit
c2a0: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 23 69 66 6e 64   index..*/.#ifnd
c2b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
c2c0: 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69  UBQUERY.int sqli
c2d0: 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 50  te3FindInIndex(P
c2e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
c2f0: 70 72 20 2a 70 58 2c 20 69 6e 74 20 6d 75 73 74  pr *pX, int must
c300: 42 65 55 6e 69 71 75 65 29 7b 0a 20 20 53 65 6c  BeUnique){.  Sel
c310: 65 63 74 20 2a 70 3b 0a 20 20 69 6e 74 20 65 54  ect *p;.  int eT
c320: 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ype = 0;.  int i
c330: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
c340: 61 62 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ab++;..  /* The 
c350: 66 6f 6c 6c 77 69 6e 67 20 69 66 28 2e 2e 2e 29  follwing if(...)
c360: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
c370: 72 75 65 20 69 66 20 74 68 65 20 53 45 4c 45 43  rue if the SELEC
c380: 54 20 69 73 20 6f 66 20 74 68 65 20 0a 20 20 2a  T is of the .  *
c390: 2a 20 73 69 6d 70 6c 65 20 66 6f 72 6d 3a 0a 20  * simple form:. 
c3a0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
c3b0: 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f  ECT <column> FRO
c3c0: 4d 20 3c 74 61 62 6c 65 3e 0a 20 20 2a 2a 0a 20  M <table>.  **. 
c3d0: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
c3e0: 68 65 20 63 61 73 65 2c 20 69 74 20 6d 61 79 20  he case, it may 
c3f0: 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  be possible to u
c400: 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  se an existing t
c410: 61 62 6c 65 0a 20 20 2a 2a 20 6f 72 20 69 6e 64  able.  ** or ind
c420: 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 67 65  ex instead of ge
c430: 6e 65 72 61 74 69 6e 67 20 61 6e 20 65 70 68 65  nerating an ephe
c440: 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a  remal table..  *
c450: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
c460: 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 0a 20 20  enable_in_opt.  
c470: 20 26 26 20 28 70 3d 70 58 2d 3e 70 53 65 6c 65   && (p=pX->pSele
c480: 63 74 29 21 3d 30 20 26 26 20 21 70 2d 3e 70 50  ct)!=0 && !p->pP
c490: 72 69 6f 72 0a 20 20 20 26 26 20 21 70 2d 3e 69  rior.   && !p->i
c4a0: 73 44 69 73 74 69 6e 63 74 20 26 26 20 21 70 2d  sDistinct && !p-
c4b0: 3e 69 73 41 67 67 20 26 26 20 21 70 2d 3e 70 47  >isAgg && !p->pG
c4c0: 72 6f 75 70 42 79 0a 20 20 20 26 26 20 70 2d 3e  roupBy.   && p->
c4d0: 70 53 72 63 20 26 26 20 70 2d 3e 70 53 72 63 2d  pSrc && p->pSrc-
c4e0: 3e 6e 53 72 63 3d 3d 31 20 26 26 20 21 70 2d 3e  >nSrc==1 && !p->
c4f0: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
c500: 63 74 0a 20 20 20 26 26 20 21 70 2d 3e 70 53 72  ct.   && !p->pSr
c510: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 70 53  c->a[0].pTab->pS
c520: 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 20 20  elect           
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c540: 20 20 20 20 20 20 20 0a 20 20 20 26 26 20 70 2d         .   && p-
c550: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  >pEList->nExpr==
c560: 31 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  1 && p->pEList->
c570: 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d  a[0].pExpr->op==
c580: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20  TK_COLUMN.   && 
c590: 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 20 21 70  !p->pLimit && !p
c5a0: 2d 3e 70 4f 66 66 73 65 74 20 26 26 20 21 70 2d  ->pOffset && !p-
c5b0: 3e 70 57 68 65 72 65 0a 20 20 29 7b 0a 20 20 20  >pWhere.  ){.   
c5c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
c5d0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 49  Parse->db;.    I
c5e0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
c5f0: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 2d  Expr *pExpr = p-
c600: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
c610: 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  xpr;.    int iCo
c620: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
c630: 6d 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20  mn;.    Vdbe *v 
c640: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
c650: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 2f  (pParse);..    /
c660: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c670: 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
c680: 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20  rom two places. 
c690: 49 6e 20 62 6f 74 68 20 63 61 73 65 73 20 74 68  In both cases th
c6a0: 65 20 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61  e vdbe.    ** ha
c6b0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
c6c0: 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73  llocated. So ass
c6d0: 75 6d 65 20 73 71 6c 69 74 65 33 47 65 74 56 64  ume sqlite3GetVd
c6e0: 62 65 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20  be() is always. 
c6f0: 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c     ** successful
c700: 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
c710: 20 20 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20    assert(v);.   
c720: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
c730: 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20       int iMem = 
c740: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
c750: 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b        int iAddr;
c760: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
c770: 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ab = p->pSrc->a[
c780: 30 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  0].pTab;.      i
c790: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
c7a0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
c7b0: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
c7c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c7d0: 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
c7e0: 69 44 62 29 3b 0a 0a 20 20 20 20 20 20 69 41 64  iDb);..      iAd
c7f0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
c800: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
c810: 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71   iMem);.      sq
c820: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c830: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
c840: 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 20 20  , iMem);..      
c850: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
c860: 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69  (pParse, iTab, i
c870: 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
c880: 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54  nRead);.      eT
c890: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52  ype = IN_INDEX_R
c8a0: 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c  OWID;..      sql
c8b0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
c8c0: 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20  (v, iAddr);.    
c8d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
c8e0: 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  The collation se
c8f0: 71 75 65 6e 63 65 20 75 73 65 64 20 62 79 20 74  quence used by t
c900: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49  he comparison. I
c910: 66 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74 6f  f an index is to
c920: 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73   .      ** be us
c930: 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
c940: 20 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20   temp-table, it 
c950: 6d 75 73 74 20 62 65 20 6f 72 64 65 72 65 64 20  must be ordered 
c960: 61 63 63 6f 72 64 69 6e 67 0a 20 20 20 20 20 20  according.      
c970: 2a 2a 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61  ** to this colla
c980: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 20  tion sequence.. 
c990: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43 6f       */.      Co
c9a0: 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71  llSeq *pReq = sq
c9b0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
c9c0: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
c9d0: 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 45 78  , pX->pLeft, pEx
c9e0: 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  pr);..      /* C
c9f0: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 66  heck that the af
ca00: 66 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c  finity that will
ca10: 20 62 65 20 75 73 65 64 20 74 6f 20 70 65 72 66   be used to perf
ca20: 6f 72 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a  orm the .      *
ca30: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  * comparison is 
ca40: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
ca50: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
ca60: 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20  column. If.     
ca70: 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74 2c 20 69   ** it is not, i
ca80: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
ca90: 65 20 74 6f 20 75 73 65 20 61 6e 79 20 69 6e 64  e to use any ind
caa0: 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ex..      */.   
cab0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
cac0: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
cad0: 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20  Tab;.      char 
cae0: 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  aff = comparison
caf0: 41 66 66 69 6e 69 74 79 28 70 58 29 3b 0a 20 20  Affinity(pX);.  
cb00: 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79      int affinity
cb10: 5f 6f 6b 20 3d 20 28 70 54 61 62 2d 3e 61 43 6f  _ok = (pTab->aCo
cb20: 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79  l[iCol].affinity
cb30: 3d 3d 61 66 66 7c 7c 61 66 66 3d 3d 53 51 4c 49  ==aff||aff==SQLI
cb40: 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 0a 20  TE_AFF_NONE);.. 
cb50: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
cb60: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
cb70: 20 26 26 20 65 54 79 70 65 3d 3d 30 20 26 26 20   && eType==0 && 
cb80: 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64  affinity_ok; pId
cb90: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
cba0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 49 64          if( (pId
cbb0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
cbc0: 69 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 20 26  iCol).         &
cbd0: 26 20 28 70 52 65 71 3d 3d 73 71 6c 69 74 65 33  & (pReq==sqlite3
cbe0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
cbf0: 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d 3e 61  ENC(db), pIdx->a
cc00: 7a 43 6f 6c 6c 5b 30 5d 2c 20 2d 31 2c 20 30 29  zColl[0], -1, 0)
cc10: 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 21  ).         && (!
cc20: 6d 75 73 74 42 65 55 6e 69 71 75 65 20 7c 7c 20  mustBeUnique || 
cc30: 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d  (pIdx->nColumn==
cc40: 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72  1 && pIdx->onErr
cc50: 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 29 0a 20 20  or!=OE_None)).  
cc60: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
cc70: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
cc80: 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d        int iMem =
cc90: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
cca0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
ccb0: 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Addr;.          
ccc0: 63 68 61 72 20 2a 70 4b 65 79 3b 0a 20 20 0a 20  char *pKey;.  . 
ccd0: 20 20 20 20 20 20 20 20 20 70 4b 65 79 20 3d 20           pKey = 
cce0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 49  (char *)sqlite3I
ccf0: 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72  ndexKeyinfo(pPar
cd00: 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  se, pIdx);.     
cd10: 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74       iDb = sqlit
cd20: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
cd30: 64 62 2c 20 70 49 64 78 2d 3e 70 53 63 68 65 6d  db, pIdx->pSchem
cd40: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  a);.          sq
cd50: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
cd60: 65 65 28 76 2c 20 69 44 62 29 3b 0a 0a 20 20 20  ee(v, iDb);..   
cd70: 20 20 20 20 20 20 20 69 41 64 64 72 20 3d 20 73         iAddr = s
cd80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
cd90: 28 76 2c 20 4f 50 5f 49 66 2c 20 69 4d 65 6d 29  (v, OP_If, iMem)
cda0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
cdb0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
cdc0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
cdd0: 69 4d 65 6d 29 3b 0a 20 20 0a 20 20 20 20 20 20  iMem);.  .      
cde0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cdf0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
ce00: 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78  Read, iTab, pIdx
ce10: 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20  ->tnum, iDb,.   
ce20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 65 79              pKey
ce40: 2c 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44  ,P4_KEYINFO_HAND
ce50: 4f 46 46 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OFF);.          
ce60: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
ce70: 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  "%s", pIdx->zNam
ce80: 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65  e));.          e
ce90: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
cea0: 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20 20  INDEX;.         
ceb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cec0: 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  p2(v, OP_SetNumC
ced0: 6f 6c 75 6d 6e 73 2c 20 69 54 61 62 2c 20 70 49  olumns, iTab, pI
cee0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 0a 20  dx->nColumn);.. 
cef0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cf00: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
cf10: 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  iAddr);.        
cf20: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
cf30: 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65    }..  if( eType
cf40: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
cf50: 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
cf60: 70 50 61 72 73 65 2c 20 70 58 29 3b 0a 20 20 20  pParse, pX);.   
cf70: 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
cf80: 58 5f 45 50 48 3b 0a 20 20 7d 65 6c 73 65 7b 0a  X_EPH;.  }else{.
cf90: 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d      pX->iTable =
cfa0: 20 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74   iTab;.  }.  ret
cfb0: 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e  urn eType;.}.#en
cfc0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
cfd0: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61  ate code for sca
cfe0: 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75  lar subqueries u
cff0: 73 65 64 20 61 73 20 61 6e 20 65 78 70 72 65 73  sed as an expres
d000: 73 69 6f 6e 0a 2a 2a 20 61 6e 64 20 49 4e 20 6f  sion.** and IN o
d010: 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70  perators.  Examp
d020: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  les:.**.**     (
d030: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
d040: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62            -- sub
d050: 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49  query.**     EXI
d060: 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52  STS (SELECT a FR
d070: 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54  OM b)   -- EXIST
d080: 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20  S subquery.**   
d090: 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20    x IN (4,5,11) 
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
d0b0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
d0c0: 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68   list on right-h
d0d0: 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20  and side.**     
d0e0: 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46  x IN (SELECT a F
d0f0: 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e  ROM b)     -- IN
d100: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73   operator with s
d110: 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72  ubquery on the r
d120: 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ight.**.** The p
d130: 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64  Expr parameter d
d140: 65 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70  escribes the exp
d150: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e  ression that con
d160: 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20  tains the IN.** 
d170: 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71  operator or subq
d180: 75 65 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  uery..*/.#ifndef
d190: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
d1a0: 51 55 45 52 59 0a 76 6f 69 64 20 73 71 6c 69 74  QUERY.void sqlit
d1b0: 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
d1c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
d1d0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
d1e0: 6e 74 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b  nt testAddr = 0;
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d200: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69         /* One-ti
d210: 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20  me test address 
d220: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
d230: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
d240: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
d250: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 0a 20 20  0 ) return;...  
d260: 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73  /* This code mus
d270: 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20  t be run in its 
d280: 65 6e 74 69 72 65 74 79 20 65 76 65 72 79 20 74  entirety every t
d290: 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
d2a0: 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e  tered.  ** if an
d2b0: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
d2c0: 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a  ng is true:.  **
d2d0: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
d2e0: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
d2f0: 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
d300: 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20  subquery.  **   
d310: 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
d320: 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78  nd side is an ex
d330: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f  pression list co
d340: 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c  ntaining variabl
d350: 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65  es.  **    *  We
d360: 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72   are inside a tr
d370: 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  igger.  **.  ** 
d380: 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
d390: 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74  ove are false, t
d3a0: 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74  hen we can run t
d3b0: 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e  his code just on
d3c0: 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65  ce.  ** save the
d3d0: 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65   results, and re
d3e0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73  use the same res
d3f0: 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e  ult on subsequen
d400: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20  t invocations.. 
d410: 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48   */.  if( !ExprH
d420: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
d430: 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  xpr, EP_VarSelec
d440: 74 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e 74  t) && !pParse->t
d450: 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  rigStack ){.    
d460: 69 6e 74 20 6d 65 6d 20 3d 20 2b 2b 70 50 61 72  int mem = ++pPar
d470: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
d480: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
d490: 76 2c 20 4f 50 5f 49 66 2c 20 6d 65 6d 29 3b 0a  v, OP_If, mem);.
d4a0: 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 73      testAddr = s
d4b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d4c0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
d4d0: 31 2c 20 6d 65 6d 29 3b 0a 20 20 20 20 61 73 73  1, mem);.    ass
d4e0: 65 72 74 28 20 74 65 73 74 41 64 64 72 3e 30 20  ert( testAddr>0 
d4f0: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
d500: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
d510: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
d520: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
d530: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
d540: 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
d550: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
d560: 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  keyInfo;.      i
d570: 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
d580: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
d590: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
d5a0: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20  nstruction */.. 
d5b0: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
d5c0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
d5d0: 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ity(pExpr->pLeft
d5e0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  );..      /* Whe
d5f0: 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20  ther this is an 
d600: 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29  'x IN(SELECT...)
d610: 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65  ' or an 'x IN(<e
d620: 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20  xprlist>)'.     
d630: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
d640: 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65  t is handled the
d650: 20 73 61 6d 65 20 77 61 79 2e 20 41 20 76 69 72   same way. A vir
d660: 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20  tual table is . 
d670: 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77       ** filled w
d680: 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64  ith single-field
d690: 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72   index keys repr
d6a0: 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73  esenting the res
d6b0: 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  ults.      ** fr
d6c0: 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f 72  om the SELECT or
d6d0: 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e   the <exprlist>.
d6e0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
d6f0: 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78  ** If the 'x' ex
d700: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
d710: 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74  lumn value, or t
d720: 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20  he SELECT....   
d730: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
d740: 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e  returns a column
d750: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
d760: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61   affinity of tha
d770: 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
d780: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69  n is used to bui
d790: 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79  ld the index key
d7a0: 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61  s. If both 'x' a
d7b0: 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  nd the.      ** 
d7c0: 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
d7d0: 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
d7e0: 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
d7f0: 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20  finity is used. 
d800: 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65       ** if eithe
d810: 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d  r column has NUM
d820: 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20  ERIC or INTEGER 
d830: 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69  affinity. If nei
d840: 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78  ther.      ** 'x
d850: 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54  ' nor the SELECT
d860: 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
d870: 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
d880: 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
d890: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65  .      ** is use
d8a0: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
d8b0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
d8c0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
d8d0: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
d8e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
d8f0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
d900: 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61  eral, pExpr->iTa
d910: 62 6c 65 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  ble);.      mems
d920: 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20  et(&keyInfo, 0, 
d930: 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29  sizeof(keyInfo))
d940: 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e  ;.      keyInfo.
d950: 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nField = 1;.    
d960: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d970: 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  Op2(v, OP_SetNum
d980: 43 6f 6c 75 6d 6e 73 2c 20 70 45 78 70 72 2d 3e  Columns, pExpr->
d990: 69 54 61 62 6c 65 2c 20 31 29 3b 0a 0a 20 20 20  iTable, 1);..   
d9a0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53     if( pExpr->pS
d9b0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
d9c0: 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20   /* Case 1:     
d9d0: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
d9e0: 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ...).        **.
d9f0: 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72          ** Gener
da00: 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74  ate code to writ
da10: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
da20: 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f   the select into
da30: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
da40: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
da50: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70  allocated and op
da60: 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20  ened above..    
da70: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53      */.        S
da80: 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
da90: 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
daa0: 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20   *pEList;..     
dab0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
dac0: 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
dad0: 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e  SRT_Set, pExpr->
dae0: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  iTable);.       
daf0: 20 64 65 73 74 2e 61 66 66 69 6e 69 74 79 20 3d   dest.affinity =
db00: 20 28 69 6e 74 29 61 66 66 69 6e 69 74 79 3b 0a   (int)affinity;.
db10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
db20: 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30  (pExpr->iTable&0
db30: 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70  x0000FFFF)==pExp
db40: 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20  r->iTable );.   
db50: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
db60: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
db70: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 26  Expr->pSelect, &
db80: 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30  dest, 0, 0, 0, 0
db90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
dba0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
dbb0: 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 20  .        pEList 
dbc0: 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  = pExpr->pSelect
dbd0: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  ->pEList;.      
dbe0: 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
dbf0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20  pEList->nExpr>0 
dc00: 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65  ){ .          ke
dc10: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d  yInfo.aColl[0] =
dc20: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
dc30: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
dc40: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
dc50: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
dc60: 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
dc70: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
dc80: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
dc90: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a  pExpr->pList ){.
dca0: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
dcb0: 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  2:     expr IN (
dcc0: 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20  exprlist).      
dcd0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
dce0: 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  For each express
dcf0: 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e  ion, build an in
dd00: 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  dex key from the
dd10: 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a   evaluation and.
dd20: 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
dd30: 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f   it in the tempo
dd40: 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c  rary table. If <
dd50: 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d  expr> is a colum
dd60: 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20  n, then use.    
dd70: 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75      ** that colu
dd80: 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65  mns affinity whe
dd90: 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78  n building index
dda0: 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e   keys. If <expr>
ddb0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
ddc0: 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65  ** a column, use
ddd0: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
dde0: 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
ddf0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
de00: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
de10: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
de20: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72  ist;.        str
de30: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
de40: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
de50: 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
de60: 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69         if( !affi
de70: 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  nity ){.        
de80: 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c    affinity = SQL
de90: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
dea0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
deb0: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
dec0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d   = pExpr->pLeft-
ded0: 3e 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 20  >pColl;..       
dee0: 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
def0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
df00: 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20   in <exprlist>. 
df10: 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  */.        r1 = 
df20: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
df30: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
df40: 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47     r2 = sqlite3G
df50: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
df60: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
df70: 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  =pList->nExpr, p
df80: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
df90: 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
dfa0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
dfb0: 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e  r *pE2 = pItem->
dfc0: 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 20 20  pExpr;..        
dfd0: 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72    /* If the expr
dfe0: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  ession is not co
dff0: 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77  nstant then we w
e000: 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  ill need to.    
e010: 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
e020: 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77   the test that w
e030: 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f  as generated abo
e040: 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ve that makes su
e050: 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  re.          ** 
e060: 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65  this code only e
e070: 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42  xecutes once.  B
e080: 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e  ecause for a non
e090: 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20  -constant.      
e0a0: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
e0b0: 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72  n we need to rer
e0c0: 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63  un this code eac
e0d0: 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  h time..        
e0e0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
e0f0: 66 28 20 74 65 73 74 41 64 64 72 20 26 26 20 21  f( testAddr && !
e100: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
e110: 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20  stant(pE2) ){.  
e120: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e130: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
e140: 70 28 76 2c 20 74 65 73 74 41 64 64 72 2d 31 2c  p(v, testAddr-1,
e150: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   2);.           
e160: 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b 0a 20   testAddr = 0;. 
e170: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
e180: 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
e190: 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
e1a0: 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69   and insert it i
e1b0: 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62  nto the temp tab
e1c0: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
e1d0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
e1e0: 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29  pParse, pE2, r1)
e1f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
e200: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
e210: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
e220: 72 31 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69  r1, 1, r2, &affi
e230: 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
e240: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e250: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
e260: 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54  nsert, pExpr->iT
e270: 61 62 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  able, r2);.     
e280: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
e290: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
e2a0: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
e2b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
e2c0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
e2d0: 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
e2e0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
e2f0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
e300: 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 26 6b  addr, (void *)&k
e310: 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
e320: 46 4f 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  FO);.      break
e330: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
e340: 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
e350: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
e360: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73   {.      /* This
e370: 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63 61   has to be a sca
e380: 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e  lar SELECT.  Gen
e390: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75  erate code to pu
e3a0: 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76  t the.      ** v
e3b0: 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c  alue of this sel
e3c0: 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20  ect in a memory 
e3d0: 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20  cell and record 
e3e0: 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  the number.     
e3f0: 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72   ** of the memor
e400: 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d  y cell in iColum
e410: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
e420: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54    static const T
e430: 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b 20 28 75 38  oken one = { (u8
e440: 2a 29 22 31 22 2c 20 30 2c 20 31 20 7d 3b 0a 20  *)"1", 0, 1 };. 
e450: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
e460: 6c 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  l;.      SelectD
e470: 65 73 74 20 64 65 73 74 3b 0a 0a 20 20 20 20 20  est dest;..     
e480: 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 70   pSel = pExpr->p
e490: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 73 71  Select;.      sq
e4a0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
e4b0: 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b  nit(&dest, 0, ++
e4c0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20  pParse->nMem);. 
e4d0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
e4e0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
e4f0: 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44  .        dest.eD
e500: 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20  est = SRT_Mem;. 
e510: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e520: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
e530: 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 50 61  ull, 0, dest.iPa
e540: 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  rm);.        Vdb
e550: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e  eComment((v, "In
e560: 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75  it subquery resu
e570: 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lt"));.      }el
e580: 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74  se{.        dest
e590: 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69  .eDest = SRT_Exi
e5a0: 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  sts;.        sql
e5b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e5c0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
e5d0: 20 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20   dest.iParm);.  
e5e0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
e5f0: 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53  t((v, "Init EXIS
e600: 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  TS result"));.  
e610: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
e620: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 53  te3ExprDelete(pS
e630: 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20  el->pLimit);.   
e640: 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20     pSel->pLimit 
e650: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
e660: 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45  Parse, TK_INTEGE
e670: 52 2c 20 30 2c 20 30 2c 20 26 6f 6e 65 29 3b 0a  R, 0, 0, &one);.
e680: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
e690: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
e6a0: 70 53 65 6c 2c 20 26 64 65 73 74 2c 20 30 2c 20  pSel, &dest, 0, 
e6b0: 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  0, 0, 0) ){.    
e6c0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
e6d0: 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72 2d    }.      pExpr-
e6e0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 64 65 73 74 2e  >iColumn = dest.
e6f0: 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 62 72 65  iParm;.      bre
e700: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
e710: 20 69 66 28 20 74 65 73 74 41 64 64 72 20 29 7b   if( testAddr ){
e720: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e730: 4a 75 6d 70 48 65 72 65 28 76 2c 20 74 65 73 74  JumpHere(v, test
e740: 41 64 64 72 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20  Addr-1);.  }..  
e750: 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66  return;.}.#endif
e760: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
e770: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a  SUBQUERY */../*.
e780: 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 61 6e 20  ** Duplicate an 
e790: 38 2d 62 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a  8-byte value.*/.
e7a0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 75 70  static char *dup
e7b0: 38 62 79 74 65 73 28 56 64 62 65 20 2a 76 2c 20  8bytes(Vdbe *v, 
e7c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 29 7b  const char *in){
e7d0: 0a 20 20 63 68 61 72 20 2a 6f 75 74 20 3d 20 73  .  char *out = s
e7e0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
e7f0: 77 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  w(sqlite3VdbeDb(
e800: 76 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 6f 75  v), 8);.  if( ou
e810: 74 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  t ){.    memcpy(
e820: 6f 75 74 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d  out, in, 8);.  }
e830: 0a 20 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d  .  return out;.}
e840: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
e850: 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
e860: 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
e870: 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  e floating point
e880: 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69  .** value descri
e890: 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d  bed by z[0..n-1]
e8a0: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
e8b0: 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  Mem..**.** The z
e8c0: 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70  [] string will p
e8d0: 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a  robably not be z
e8e0: 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20  ero-terminated. 
e8f0: 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e   But the .** z[n
e900: 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67  ] character is g
e910: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
e920: 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64  something that d
e930: 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20  oes not look.** 
e940: 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75  like the continu
e950: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d  ation of the num
e960: 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ber..*/.static v
e970: 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62  oid codeReal(Vdb
e980: 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *v, const char
e990: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
e9a0: 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20  negateFlag, int 
e9b0: 69 4d 65 6d 29 7b 0a 20 20 61 73 73 65 72 74 28  iMem){.  assert(
e9c0: 20 7a 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71   z || v==0 || sq
e9d0: 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2d 3e  lite3VdbeDb(v)->
e9e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
e9f0: 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 64    if( z ){.    d
ea00: 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20  ouble value;.   
ea10: 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 61   char *zV;.    a
ea20: 73 73 65 72 74 28 20 21 69 73 64 69 67 69 74 28  ssert( !isdigit(
ea30: 7a 5b 6e 5d 29 20 29 3b 0a 20 20 20 20 73 71 6c  z[n]) );.    sql
ea40: 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c  ite3AtoF(z, &val
ea50: 75 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67  ue);.    if( neg
ea60: 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20  ateFlag ) value 
ea70: 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 7a 56  = -value;.    zV
ea80: 20 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c 20   = dup8bytes(v, 
ea90: 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a  (char*)&value);.
eaa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
eab0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 61 6c  ddOp4(v, OP_Real
eac0: 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56  , 0, iMem, 0, zV
ead0: 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a  , P4_REAL);.  }.
eae0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
eaf0: 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
eb00: 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
eb10: 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63  the integer desc
eb20: 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20  ribe by.** text 
eb30: 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
eb40: 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
eb50: 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69  .** The z[] stri
eb60: 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79  ng will probably
eb70: 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72   not be zero-ter
eb80: 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68  minated.  But th
eb90: 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61  e .** z[n] chara
eba0: 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65  cter is guarante
ebb0: 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  ed to be somethi
ebc0: 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ng that does not
ebd0: 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68   look.** like th
ebe0: 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f  e continuation o
ebf0: 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f  f the number..*/
ec00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
ec10: 65 49 6e 74 65 67 65 72 28 56 64 62 65 20 2a 76  eInteger(Vdbe *v
ec20: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
ec30: 20 69 6e 74 20 6e 2c 20 69 6e 74 20 6e 65 67 46   int n, int negF
ec40: 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
ec50: 20 20 61 73 73 65 72 74 28 20 7a 20 7c 7c 20 76    assert( z || v
ec60: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 56 64  ==0 || sqlite3Vd
ec70: 62 65 44 62 28 76 29 2d 3e 6d 61 6c 6c 6f 63 46  beDb(v)->mallocF
ec80: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 7a  ailed );.  if( z
ec90: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
eca0: 20 20 20 61 73 73 65 72 74 28 20 21 69 73 64 69     assert( !isdi
ecb0: 67 69 74 28 7a 5b 6e 5d 29 20 29 3b 0a 20 20 20  git(z[n]) );.   
ecc0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49   if( sqlite3GetI
ecd0: 6e 74 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20  nt32(z, &i) ){. 
ece0: 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67       if( negFlag
ecf0: 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 20   ) i = -i;.     
ed00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ed10: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
ed20: 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  , i, iMem);.    
ed30: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
ed40: 33 46 69 74 73 49 6e 36 34 42 69 74 73 28 7a 2c  3FitsIn64Bits(z,
ed50: 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20   negFlag) ){.   
ed60: 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20     i64 value;.  
ed70: 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20      char *zV;.  
ed80: 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 69 36      sqlite3Atoi6
ed90: 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20  4(z, &value);.  
eda0: 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
edb0: 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65  ) value = -value
edc0: 3b 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70  ;.      zV = dup
edd0: 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a  8bytes(v, (char*
ede0: 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  )&value);.      
edf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ee00: 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30  4(v, OP_Int64, 0
ee10: 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50  , iMem, 0, zV, P
ee20: 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65  4_INT64);.    }e
ee30: 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 64 65 52  lse{.      codeR
ee40: 65 61 6c 28 76 2c 20 7a 2c 20 6e 2c 20 6e 65 67  eal(v, z, n, neg
ee50: 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  Flag, iMem);.   
ee60: 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   }.  }.}.../*.**
ee70: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
ee80: 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
ee90: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
eea0: 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74  column from.** t
eeb0: 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74  able pTab and st
eec0: 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  ore the column v
eed0: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
eee0: 20 69 52 65 67 2e 0a 2a 2a 20 54 68 65 72 65 20   iReg..** There 
eef0: 69 73 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f  is an open curso
ef00: 72 20 74 6f 20 70 54 61 62 20 69 6e 20 0a 2a 2a  r to pTab in .**
ef10: 20 69 54 61 62 6c 65 2e 20 20 49 66 20 69 43 6f   iTable.  If iCo
ef20: 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65  lumn<0 then code
ef30: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68   is generated th
ef40: 61 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20  at extracts the 
ef50: 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rowid..*/.void s
ef60: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
ef70: 74 43 6f 6c 75 6d 6e 28 0a 20 20 56 64 62 65 20  tColumn(.  Vdbe 
ef80: 2a 76 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  *v,         /* T
ef90: 68 65 20 56 4d 20 62 65 69 6e 67 20 63 72 65 61  he VM being crea
efa0: 74 65 64 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ted */.  Table *
efb0: 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
efc0: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
efd0: 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
efe0: 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
eff0: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
f000: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
f010: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
f020: 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
f030: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
f040: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
f050: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
f060: 69 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20  iReg         /* 
f070: 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
f080: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69  re */.){.  if( i
f090: 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
f0a0: 69 6e 74 20 6f 70 20 3d 20 28 70 54 61 62 20 26  int op = (pTab &
f0b0: 26 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  & IsVirtual(pTab
f0c0: 29 29 20 3f 20 4f 50 5f 56 52 6f 77 69 64 20 3a  )) ? OP_VRowid :
f0d0: 20 4f 50 5f 52 6f 77 69 64 3b 0a 20 20 20 20 73   OP_Rowid;.    s
f0e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f0f0: 28 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20  (v, op, iTable, 
f100: 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69  iReg);.  }else i
f110: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
f120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f130: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
f140: 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
f150: 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73  n, iReg);.  }els
f160: 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  e{.    int op = 
f170: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
f180: 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f  ? OP_VColumn : O
f190: 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  P_Column;.    sq
f1a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
f1b0: 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69  v, op, iTable, i
f1c0: 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
f1d0: 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
f1e0: 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c  Default(v, pTab,
f1f0: 20 69 43 6f 6c 75 6d 6e 29 3b 0a 23 69 66 6e 64   iColumn);.#ifnd
f200: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
f210: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
f220: 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c    if( pTab->aCol
f230: 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  [iColumn].affini
f240: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ty==SQLITE_AFF_R
f250: 45 41 4c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  EAL ){.      sql
f260: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
f270: 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  , OP_RealAffinit
f280: 79 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 0a  y, iReg);.    }.
f290: 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
f2a0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
f2b0: 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65  e into the curre
f2c0: 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75  nt Vdbe to evalu
f2d0: 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ate the given.**
f2e0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74   expression.  At
f2f0: 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74  tempt to store t
f300: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  he results in re
f310: 67 69 73 74 65 72 20 22 74 61 72 67 65 74 22 2e  gister "target".
f320: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
f330: 65 67 69 73 74 65 72 20 77 68 65 72 65 20 72 65  egister where re
f340: 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
f350: 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69  ..**.** With thi
f360: 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65  s routine, there
f370: 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65   is no guarantee
f380: 64 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 77  d that results w
f390: 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64  ill.** be stored
f3a0: 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65   in target.  The
f3b0: 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65   result might be
f3c0: 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20   stored in some 
f3d0: 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65  other.** registe
f3e0: 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65  r if it is conve
f3f0: 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20  nient to do so. 
f400: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
f410: 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68  ction.** must ch
f420: 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63  eck the return c
f430: 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65  ode and move the
f440: 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20   results to the 
f450: 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73  desired.** regis
f460: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
f470: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
f480: 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20 2a  deTarget(Parse *
f490: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
f4a0: 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
f4b0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
f4c0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a  arse->pVdbe;  /*
f4d0: 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f   The VM under co
f4e0: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
f4f0: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
f500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
f510: 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f   opcode being co
f520: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52  ded */.  int inR
f530: 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20  eg = target;    
f540: 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74     /* Results st
f550: 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
f560: 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20   inReg */.  int 
f570: 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20  regFree1 = 0;   
f580: 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
f590: 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
f5a0: 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
f5b0: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  r */.  int regFr
f5c0: 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee2 = 0;        
f5d0: 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
f5e0: 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
f5f0: 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
f600: 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
f610: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  ;           /* V
f620: 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72 20  arious register 
f630: 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 61 73  numbers */..  as
f640: 73 65 72 74 28 20 76 21 3d 30 20 7c 7c 20 70 50  sert( v!=0 || pP
f650: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
f660: 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73 65  Failed );.  asse
f670: 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
f680: 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
f690: 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d  nMem );.  if( v=
f6a0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
f6b0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
f6c0: 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55  {.    op = TK_NU
f6d0: 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
f6e0: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
f6f0: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f  .  }.  switch( o
f700: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
f710: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  _AGG_COLUMN: {. 
f720: 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41       AggInfo *pA
f730: 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  ggInfo = pExpr->
f740: 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
f750: 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
f760: 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67  ol *pCol = &pAgg
f770: 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  Info->aCol[pExpr
f780: 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69  ->iAgg];.      i
f790: 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69  f( !pAggInfo->di
f7a0: 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20  rectMode ){.    
f7b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
f7c0: 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20  ->iMem>0 );.    
f7d0: 20 20 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c      inReg = pCol
f7e0: 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->iMem;.        
f7f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
f800: 73 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  se if( pAggInfo-
f810: 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29  >useSortingIdx )
f820: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f830: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
f840: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e  P_Column, pAggIn
f850: 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 2c 0a  fo->sortingIdx,.
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
f880: 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
f890: 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  n, target);.    
f8a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f8b0: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65   }.      /* Othe
f8c0: 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75  rwise, fall thru
f8d0: 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c   into the TK_COL
f8e0: 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  UMN case */.    
f8f0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
f900: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  LUMN: {.      if
f910: 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c  ( pExpr->iTable<
f920: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
f930: 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
f940: 73 20 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68  s when coding ch
f950: 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  eck constraints 
f960: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
f970: 74 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73  t( pParse->ckBas
f980: 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  e>0 );.        i
f990: 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43  nReg = pExpr->iC
f9a0: 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e  olumn + pParse->
f9b0: 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 7d 65  ckBase;.      }e
f9c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
f9d0: 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
f9e0: 6f 6c 75 6d 6e 28 76 2c 20 70 45 78 70 72 2d 3e  olumn(v, pExpr->
f9f0: 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20  pTab,.          
fa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa10: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
fa20: 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54  olumn, pExpr->iT
fa30: 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20  able, target);. 
fa40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
fa50: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
fa60: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
fa70: 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67  .      codeInteg
fa80: 65 72 28 76 2c 20 28 63 68 61 72 2a 29 70 45 78  er(v, (char*)pEx
fa90: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
faa0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 2c 20  pr->token.n, 0, 
fab0: 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
fac0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
fad0: 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b  case TK_FLOAT: {
fae0: 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28  .      codeReal(
faf0: 76 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d  v, (char*)pExpr-
fb00: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
fb10: 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 2c 20 74 61 72  >token.n, 0, tar
fb20: 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
fb30: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
fb40: 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
fb50: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
fb60: 6f 74 65 45 78 70 72 28 70 50 61 72 73 65 2d 3e  oteExpr(pParse->
fb70: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  db, pExpr);.    
fb80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fb90: 4f 70 34 28 76 2c 4f 50 5f 53 74 72 69 6e 67 38  Op4(v,OP_String8
fba0: 2c 20 30 2c 20 74 61 72 67 65 74 2c 20 30 2c 0a  , 0, target, 0,.
fbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbc0: 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
fbd0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
fbe0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
fbf0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fc00: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
fc10: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
fc20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fc30: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
fc40: 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
fc50: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
fc60: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
fc70: 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
fc80: 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
fc90: 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
fca0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
fcb0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c  .      char *zBl
fcc0: 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ob;.      assert
fcd0: 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  ( pExpr->token.n
fce0: 3e 3d 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73  >=3 );.      ass
fcf0: 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65  ert( pExpr->toke
fd00: 6e 2e 7a 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70  n.z[0]=='x' || p
fd10: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d  Expr->token.z[0]
fd20: 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61  =='X' );.      a
fd30: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f  ssert( pExpr->to
fd40: 6b 65 6e 2e 7a 5b 31 5d 3d 3d 27 5c 27 27 20 29  ken.z[1]=='\'' )
fd50: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
fd60: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 70  pExpr->token.z[p
fd70: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31 5d  Expr->token.n-1]
fd80: 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20  =='\'' );.      
fd90: 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  n = pExpr->token
fda0: 2e 6e 20 2d 20 33 3b 0a 20 20 20 20 20 20 7a 20  .n - 3;.      z 
fdb0: 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  = (char*)pExpr->
fdc0: 74 6f 6b 65 6e 2e 7a 20 2b 20 32 3b 0a 20 20 20  token.z + 2;.   
fdd0: 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74     zBlob = sqlit
fde0: 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69  e3HexToBlob(sqli
fdf0: 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c  te3VdbeDb(v), z,
fe00: 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   n);.      sqlit
fe10: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
fe20: 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61  OP_Blob, n/2, ta
fe30: 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20  rget, 0, zBlob, 
fe40: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
fe50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
fe60: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
fe70: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
fe80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fe90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72  AddOp2(v, OP_Var
fea0: 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 54  iable, pExpr->iT
feb0: 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20  able, target);. 
fec0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
fed0: 74 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20 20  token.n>1 ){.   
fee0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fef0: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
ff00: 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
ff10: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
ff20: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  ken.n);.      }.
ff30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ff40: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52   }.    case TK_R
ff50: 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
ff60: 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e   inReg = pExpr->
ff70: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 62 72  iTable;.      br
ff80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
ff90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
ffa0: 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AST.    case TK_
ffb0: 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CAST: {.      /*
ffc0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
ffd0: 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54  the form:   CAST
ffe0: 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29  (pLeft AS token)
fff0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66   */.      int af
10000 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20  f, to_op;.      
10010 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
10020 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
10030 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
10040 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
10050 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
10060 41 66 66 69 6e 69 74 79 54 79 70 65 28 26 70 45  AffinityType(&pE
10070 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  xpr->token);.   
10080 20 20 20 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d     to_op = aff -
10090 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
100a0 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20   + OP_ToText;.  
100b0 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
100c0 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 20 20 20  p==OP_ToText    
100d0 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
100e0 46 46 5f 54 45 58 54 20 20 20 20 29 3b 0a 20 20  FF_TEXT    );.  
100f0 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
10100 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20  p==OP_ToBlob    
10110 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
10120 46 46 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20  FF_NONE    );.  
10130 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
10140 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20  p==OP_ToNumeric 
10150 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
10160 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
10170 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
10180 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20  p==OP_ToInt     
10190 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
101a0 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20  FF_INTEGER );.  
101b0 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
101c0 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20  p==OP_ToReal    
101d0 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
101e0 46 46 5f 52 45 41 4c 20 20 20 20 29 3b 0a 20 20  FF_REAL    );.  
101f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10200 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f 70 2c 20  ddOp1(v, to_op, 
10210 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72  inReg);.      br
10220 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
10230 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
10240 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73  _CAST */.    cas
10250 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
10260 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
10270 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
10280 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
10290 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
102a0 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
102b0 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
102c0 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Lt );.      a
102d0 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50  ssert( TK_LE==OP
102e0 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Le );.      ass
102f0 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47  ert( TK_GT==OP_G
10300 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
10310 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20  t( TK_GE==OP_Ge 
10320 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10330 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b   TK_EQ==OP_Eq );
10340 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
10350 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  K_NE==OP_Ne );. 
10360 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
10370 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
10380 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
10390 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
103a0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
103b0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
103c0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
103d0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
103e0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
103f0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
10400 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
10410 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
10430 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51  1, r2, inReg, SQ
10440 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20  LITE_STOREP2);. 
10450 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10460 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  }.    case TK_AN
10470 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f  D:.    case TK_O
10480 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50  R:.    case TK_P
10490 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  LUS:.    case TK
104a0 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20  _STAR:.    case 
104b0 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61  TK_MINUS:.    ca
104c0 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63  se TK_REM:.    c
104d0 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20  ase TK_BITAND:. 
104e0 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52     case TK_BITOR
104f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c  :.    case TK_SL
10500 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ASH:.    case TK
10510 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73  _LSHIFT:.    cas
10520 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20  e TK_RSHIFT: .  
10530 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54    case TK_CONCAT
10540 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
10550 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64  ( TK_AND==OP_And
10560 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
10570 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29  ( TK_OR==OP_Or )
10580 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10590 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20  TK_PLUS==OP_Add 
105a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
105b0 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75   TK_MINUS==OP_Su
105c0 62 74 72 61 63 74 20 29 3b 0a 20 20 20 20 20 20  btract );.      
105d0 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d  assert( TK_REM==
105e0 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 0a  OP_Remainder );.
105f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
10600 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41  _BITAND==OP_BitA
10610 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  nd );.      asse
10620 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50  rt( TK_BITOR==OP
10630 5f 42 69 74 4f 72 20 29 3b 0a 20 20 20 20 20 20  _BitOr );.      
10640 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48  assert( TK_SLASH
10650 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a 20  ==OP_Divide );. 
10660 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
10670 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74  LSHIFT==OP_Shift
10680 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 61 73  Left );.      as
10690 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d  sert( TK_RSHIFT=
106a0 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29  =OP_ShiftRight )
106b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
106c0 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f  TK_CONCAT==OP_Co
106d0 6e 63 61 74 20 29 3b 0a 20 20 20 20 20 20 72 31  ncat );.      r1
106e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
106f0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
10700 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
10710 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
10720 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
10730 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
10740 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
10750 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
10760 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10770 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31  p3(v, op, r2, r1
10780 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
10790 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
107a0 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
107b0 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
107c0 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
107d0 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Left;.      asse
107e0 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20  rt( pLeft );.   
107f0 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70     if( pLeft->op
10800 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 4c  ==TK_FLOAT || pL
10810 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  eft->op==TK_INTE
10820 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 54  GER ){.        T
10830 6f 6b 65 6e 20 2a 70 20 3d 20 26 70 4c 65 66 74  oken *p = &pLeft
10840 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
10850 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
10860 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TK_FLOAT ){.    
10870 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
10880 2c 20 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 70  , (char*)p->z, p
10890 2d 3e 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ->n, 1, target);
108a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
108b0 20 20 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e            codeIn
108c0 74 65 67 65 72 28 76 2c 20 28 63 68 61 72 2a 29  teger(v, (char*)
108d0 70 2d 3e 7a 2c 20 70 2d 3e 6e 2c 20 31 2c 20 74  p->z, p->n, 1, t
108e0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
108f0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
10900 20 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20         regFree1 
10910 3d 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  = r1 = sqlite3Ge
10920 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
10930 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10940 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10950 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 31  P_Integer, 0, r1
10960 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
10970 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
10980 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
10990 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67  xpr->pLeft, targ
109a0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  et);.        sql
109b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
109c0 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72  , OP_Subtract, r
109d0 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
109e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e        }.      in
109f0 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
10a00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10a10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
10a20 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
10a30 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  _NOT: {.      as
10a40 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d  sert( TK_BITNOT=
10a50 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20  =OP_BitNot );.  
10a60 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
10a70 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20  OT==OP_Not );.  
10a80 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
10a90 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
10aa0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
10ab0 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
10ac0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10ad0 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20  beAddOp1(v, op, 
10ae0 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72  inReg);.      br
10af0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
10b00 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
10b10 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
10b20 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
10b30 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65  addr;.      asse
10b40 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
10b50 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  P_IsNull );.    
10b60 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
10b70 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
10b80 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
10b90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10ba0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61  P_Integer, 1, ta
10bb0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20  rget);.      r1 
10bc0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
10bd0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
10be0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
10bf0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 61 64  Free1);.      ad
10c00 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
10c10 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31  AddOp1(v, op, r1
10c20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10c30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10c40 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
10c50 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   -1);.      sqli
10c60 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
10c70 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
10c80 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10c90 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
10ca0 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41  CTION: {.      A
10cb0 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  ggInfo *pInfo = 
10cc0 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
10cd0 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f  .      if( pInfo
10ce0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
10cf0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
10d00 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
10d10 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 54 22  f aggregate: %T"
10d20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 70  ,.            &p
10d30 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  Expr->span);.   
10d40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10d50 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d    inReg = pInfo-
10d60 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41  >aFunc[pExpr->iA
10d70 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  gg].iMem;.      
10d80 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
10d90 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
10da0 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20  _CONST_FUNC:.   
10db0 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
10dc0 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
10dd0 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
10de0 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  pr->pList;.     
10df0 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c 69   int nExpr = pLi
10e00 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
10e10 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75 6e  r : 0;.      Fun
10e20 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20  cDef *pDef;.    
10e30 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20    int nId;.     
10e40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
10e50 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73  ;.      int cons
10e60 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20  tMask = 0;.     
10e70 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71   int i;.      sq
10e80 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
10e90 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 75 38  se->db;.      u8
10ea0 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
10eb0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
10ec0 43 6f 6c 6c 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Coll = 0;..     
10ed0 20 7a 49 64 20 3d 20 28 63 68 61 72 2a 29 70 45   zId = (char*)pE
10ee0 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20  xpr->token.z;.  
10ef0 20 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d      nId = pExpr-
10f00 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20  >token.n;.      
10f10 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
10f20 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
10f30 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c  e->db, zId, nId,
10f40 20 6e 45 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b   nExpr, enc, 0);
10f50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10f60 44 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Def!=0 );.      
10f70 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
10f80 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 4c 69       nExpr = pLi
10f90 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
10fa0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
10fb0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
10fc0 73 65 2c 20 6e 45 78 70 72 29 3b 0a 20 20 20 20  se, nExpr);.    
10fd0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
10fe0 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
10ff0 73 65 2c 20 70 4c 69 73 74 2c 20 72 31 29 3b 0a  se, pList, r1);.
11000 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11010 20 20 20 20 20 6e 45 78 70 72 20 3d 20 72 31 20       nExpr = r1 
11020 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
11030 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11040 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
11050 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
11060 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e  overload the fun
11070 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72  ction if the fir
11080 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20  st argument is. 
11090 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61       ** a virtua
110a0 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a  l table column..
110b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
110c0 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63  * For infix func
110d0 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f  tions (LIKE, GLO
110e0 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d  B, REGEXP, and M
110f0 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20  ATCH) use the.  
11100 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72      ** second ar
11110 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20  gument, not the 
11120 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72  first, as the ar
11130 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74  gument to test t
11140 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
11150 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  f it is a column
11160 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61   in a virtual ta
11170 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f  ble.  This is do
11180 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20  ne because.     
11190 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65   ** the left ope
111a0 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75  rand of infix fu
111b0 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65  nctions (the ope
111c0 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a  rand we want to.
111d0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c        ** control
111e0 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e   overloading) en
111f0 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63  ds up as the sec
11200 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
11210 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  the.      ** fun
11220 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72  ction.  The expr
11230 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42  ession "A glob B
11240 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  " is equivalent 
11250 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c  to .      ** "gl
11260 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e  ob(B,A).  We wan
11270 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69  t to use the A i
11280 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20  n "A glob B" to 
11290 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  test.      ** fo
112a0 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c  r function overl
112b0 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20  oading.  But we 
112c0 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69  use the B term i
112d0 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20  n "glob(B,A)".. 
112e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
112f0 28 20 6e 45 78 70 72 3e 3d 32 20 26 26 20 28 70  ( nExpr>=2 && (p
11300 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
11310 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20  _InfixFunc) ){. 
11320 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
11330 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
11340 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
11350 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73 74  ef, nExpr, pList
11360 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
11370 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
11380 45 78 70 72 3e 30 20 29 7b 0a 20 20 20 20 20 20  Expr>0 ){.      
11390 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
113a0 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
113b0 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
113c0 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 30  Expr, pList->a[0
113d0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
113e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66  }.#endif.      f
113f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20  or(i=0; i<nExpr 
11400 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20  && i<32; i++){. 
11410 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
11420 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
11430 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
11440 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
11450 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 28 31   constMask |= (1
11460 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  <<i);.        }.
11470 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66          if( pDef
11480 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 26 26  ->needCollSeq &&
11490 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
114a0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
114b0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
114c0 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
114d0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
114e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
114f0 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65      if( pDef->ne
11500 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20  edCollSeq ){.   
11510 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
11520 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65  ) pColl = pParse
11530 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
11540 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
11550 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
11560 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
11570 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
11580 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
11590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
115a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
115b0 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  v, OP_Function, 
115c0 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74  constMask, r1, t
115d0 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
115e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
115f0 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46  char*)pDef, P4_F
11600 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73  UNCDEF);.      s
11610 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
11620 50 35 28 76 2c 20 6e 45 78 70 72 29 3b 0a 20 20  P5(v, nExpr);.  
11630 20 20 20 20 69 66 28 20 6e 45 78 70 72 20 29 7b      if( nExpr ){
11640 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11650 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
11660 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 45 78  (pParse, r1, nEx
11670 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
11680 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11690 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
116a0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
116b0 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
116c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
116d0 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ECT: {.      if(
116e0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d   pExpr->iColumn=
116f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
11700 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
11710 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
11720 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11730 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e   inReg = pExpr->
11740 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 62  iColumn;.      b
11750 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11760 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
11770 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 2c 20      int j1, j2, 
11780 6a 33 2c 20 6a 34 2c 20 6a 35 3b 0a 20 20 20 20  j3, j4, j5;.    
11790 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b    char affinity;
117a0 0a 20 20 20 20 20 20 69 6e 74 20 65 54 79 70 65  .      int eType
117b0 3b 0a 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d  ;..      eType =
117c0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
117d0 64 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70  dex(pParse, pExp
117e0 72 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  r, 0);..      /*
117f0 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
11800 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20  affinity to use 
11810 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79 20  to create a key 
11820 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 73  from the results
11830 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
11840 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66   expression. aff
11850 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73 20  inityStr stores 
11860 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
11870 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 20  suitable for.   
11880 20 20 20 2a 2a 20 50 34 20 6f 66 20 4f 50 5f 4d     ** P4 of OP_M
11890 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 20 20 20  akeRecord..     
118a0 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 69 6e 69   */.      affini
118b0 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41  ty = comparisonA
118c0 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
118d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
118e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
118f0 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
11900 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f  t);..      /* Co
11910 64 65 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72  de the <expr> fr
11920 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e  om "<expr> IN (.
11930 2e 2e 29 22 2e 20 54 68 65 20 74 65 6d 70 6f 72  ..)". The tempor
11940 61 72 79 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ary table.      
11950 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ** pExpr->iTable
11960 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
11970 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75  lues that make u
11980 70 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 2e  p the (...) set.
11990 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
119a0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
119b0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
119c0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
119d0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
119e0 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
119f0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f  eAddOp1(v, OP_No
11a00 74 4e 75 6c 6c 2c 20 72 31 29 3b 0a 20 20 20 20  tNull, r1);.    
11a10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11a20 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
11a30 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
11a40 20 20 6a 32 20 20 3d 20 73 71 6c 69 74 65 33 56    j2  = sqlite3V
11a50 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11a60 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Goto);.      sql
11a70 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
11a80 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 69  (v, j1);.      i
11a90 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
11aa0 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
11ab0 20 20 20 20 6a 33 20 3d 20 73 71 6c 69 74 65 33      j3 = sqlite3
11ac0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
11ad0 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 2c 20  _MustBeInt, r1, 
11ae0 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 6a  0, 1);.        j
11af0 34 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  4 = sqlite3VdbeA
11b00 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45  ddOp3(v, OP_NotE
11b10 78 69 73 74 73 2c 20 70 45 78 70 72 2d 3e 69 54  xists, pExpr->iT
11b20 61 62 6c 65 2c 20 30 2c 20 72 31 29 3b 0a 20 20  able, 0, r1);.  
11b30 20 20 20 20 20 20 6a 35 20 3d 20 73 71 6c 69 74        j5 = sqlit
11b40 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
11b50 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20  OP_Goto);.      
11b60 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
11b70 70 48 65 72 65 28 76 2c 20 6a 33 29 3b 0a 20 20  pHere(v, j3);.  
11b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11b90 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 34 29  eJumpHere(v, j4)
11ba0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11bb0 20 20 20 20 20 20 20 72 32 20 3d 20 72 65 67 46         r2 = regF
11bc0 72 65 65 32 20 3d 20 73 71 6c 69 74 65 33 47 65  ree2 = sqlite3Ge
11bd0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
11be0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11bf0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
11c00 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 31  P_MakeRecord, r1
11c10 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
11c20 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
11c30 6a 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j5 = sqlite3Vdbe
11c40 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f 75  AddOp3(v, OP_Fou
11c50 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
11c60 65 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20 20  e, 0, r2);.     
11c70 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
11c80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11c90 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
11ca0 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   -1);.      sqli
11cb0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
11cc0 76 2c 20 6a 32 29 3b 0a 20 20 20 20 20 20 73 71  v, j2);.      sq
11cd0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
11ce0 65 28 76 2c 20 6a 35 29 3b 0a 20 20 20 20 20 20  e(v, j5);.      
11cf0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
11d00 64 69 66 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  dif.    /*.    *
11d10 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
11d20 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20   AND z.    **.  
11d30 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75    ** This is equ
11d40 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a  ivalent to.    *
11d50 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79  *.    **    x>=y
11d60 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a   AND x<=z.    **
11d70 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f  .    ** X is sto
11d80 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
11d90 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
11da0 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
11db0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
11dc0 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73  xpr..    ** Z is
11dd0 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
11de0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
11df0 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xpr..    */.    
11e00 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
11e10 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
11e20 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
11e30 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63  eft;.      struc
11e40 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
11e50 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d  *pLItem = pExpr-
11e60 3e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  >pList->a;.     
11e70 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
11e80 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a  pLItem->pExpr;..
11e90 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
11ea0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
11eb0 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72  Parse, pLeft, &r
11ec0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
11ed0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
11ee0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
11ef0 20 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65   pRight, &regFre
11f00 65 32 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20  e2);.      r3 = 
11f10 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
11f20 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
11f30 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
11f40 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
11f50 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20  ht, OP_Ge,.     
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
11f70 20 72 32 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f   r2, r3, SQLITE_
11f80 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20  STOREP2);.      
11f90 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  pLItem++;.      
11fa0 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
11fb0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >pExpr;.      sq
11fc0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
11fd0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
11fe0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20  ree2);.      r2 
11ff0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
12000 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52  eTemp(pParse, pR
12010 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
12020 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
12030 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
12040 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65  t, pRight, OP_Le
12050 2c 20 72 31 2c 20 72 32 2c 20 72 32 2c 20 53 51  , r1, r2, r2, SQ
12060 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20  LITE_STOREP2);. 
12070 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12080 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64  AddOp3(v, OP_And
12090 2c 20 72 33 2c 20 72 32 2c 20 74 61 72 67 65 74  , r3, r2, target
120a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
120b0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
120c0 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 20 20  Parse, r3);.    
120d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
120e0 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
120f0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20  : {.      inReg 
12100 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
12110 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
12120 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
12130 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
12140 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
12150 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a  *.    ** Form A:
12160 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78  .    **   CASE x
12170 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31   WHEN e1 THEN r1
12180 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32   WHEN e2 THEN r2
12190 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45   ... WHEN eN THE
121a0 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
121b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
121c0 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43  rm B:.    **   C
121d0 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e  ASE WHEN e1 THEN
121e0 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e   r1 WHEN e2 THEN
121f0 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20   r2 ... WHEN eN 
12200 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
12210 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
12220 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62   Form A is can b
12230 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  e transformed in
12240 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  to the equivalen
12250 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c  t form B as foll
12260 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  ows:.    **   CA
12270 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45  SE WHEN x=e1 THE
12280 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54  N r1 WHEN x=e2 T
12290 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a  HEN r2 ....    *
122a0 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d  *        WHEN x=
122b0 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
122c0 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
122d0 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69   ** X (if it exi
122e0 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72  sts) is in pExpr
122f0 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
12300 59 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  Y is in pExpr->p
12310 52 69 67 68 74 2e 20 20 54 68 65 20 59 20 69 73  Right.  The Y is
12320 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20   also optional. 
12330 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a   If there is no.
12340 20 20 20 20 2a 2a 20 45 4c 53 45 20 63 6c 61 75      ** ELSE clau
12350 73 65 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  se and no other 
12360 74 65 72 6d 20 6d 61 74 63 68 65 73 2c 20 74 68  term matches, th
12370 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  en the result of
12380 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 78 70 72   the.    ** expr
12390 73 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 2e 0a 20  ssion is NULL.. 
123a0 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70     ** Ei is in p
123b0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
123c0 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45  *2] and Ri is pE
123d0 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
123e0 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  2+1]..    **.   
123f0 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f   ** The result o
12400 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
12410 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74   is the Ri for t
12420 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
12430 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20  g Ei,.    ** or 
12440 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  if there is no m
12450 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20  atching Ei, the 
12460 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20  ELSE term Y, or 
12470 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  if there is.    
12480 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c  ** no ELSE term,
12490 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20   NULL..    */.  
124a0 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20    case TK_CASE: 
124b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64 4c  {.      int endL
124c0 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  abel;           
124d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54            /* GOT
124e0 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64 20  O label for end 
124f0 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a  of CASE stmt */.
12500 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43 61        int nextCa
12510 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
12520 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20          /* GOTO 
12530 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20 57  label for next W
12540 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  HEN clause */.  
12550 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20 20      int nExpr;  
12560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12570 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62        /* 2x numb
12580 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73  er of WHEN terms
12590 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
125a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
125c0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
125d0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
125e0 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  EList;          
125f0 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
12600 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
12610 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
12620 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73  rList_item *aLis
12630 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79  telem;  /* Array
12640 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a   of WHEN terms *
12650 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70 43  /.      Expr opC
12660 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20 20  ompare;         
12670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12680 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69 6f   X==Ei expressio
12690 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
126a0 63 61 63 68 65 58 3b 20 20 20 20 20 20 20 20 20  cacheX;         
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
126c0 43 61 63 68 65 64 20 65 78 70 72 65 73 73 69 6f  Cached expressio
126d0 6e 20 58 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  n X */.      Exp
126e0 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
126f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12700 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69  * The X expressi
12710 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
12720 20 2a 70 54 65 73 74 3b 20 20 20 20 20 20 20 20   *pTest;        
12730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12740 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20   X==Ei (form A) 
12750 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d  or just Ei (form
12760 20 42 29 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73   B) */..      as
12770 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73  sert(pExpr->pLis
12780 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
12790 28 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  ((pExpr->pList->
127a0 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29  nExpr % 2) == 0)
127b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
127c0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
127d0 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70  pr > 0);.      p
127e0 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  EList = pExpr->p
127f0 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73  List;.      aLis
12800 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e  telem = pEList->
12810 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  a;.      nExpr =
12820 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
12830 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d        endLabel =
12840 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
12850 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
12860 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d  if( (pX = pExpr-
12870 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20  >pLeft)!=0 ){.  
12880 20 20 20 20 20 20 63 61 63 68 65 58 20 3d 20 2a        cacheX = *
12890 70 58 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68  pX;.        cach
128a0 65 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69  eX.iTable = sqli
128b0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
128c0 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67  pParse, pX, &reg
128d0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
128e0 63 61 63 68 65 58 2e 6f 70 20 3d 20 54 4b 5f 52  cacheX.op = TK_R
128f0 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20 20  EGISTER;.       
12900 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20   opCompare.op = 
12910 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f  TK_EQ;.        o
12920 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d  pCompare.pLeft =
12930 20 26 63 61 63 68 65 58 3b 0a 20 20 20 20 20 20   &cacheX;.      
12940 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d    pTest = &opCom
12950 70 61 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pare;.      }.  
12960 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
12970 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20  Expr; i=i+2){.  
12980 20 20 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a        if( pX ){.
12990 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70            opComp
129a0 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69  are.pRight = aLi
129b0 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
129c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
129d0 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20            pTest 
129e0 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
129f0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
12a00 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65          nextCase
12a10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
12a20 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
12a30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
12a40 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
12a50 54 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20  Test, nextCase, 
12a60 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
12a70 4c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  L);.        sqli
12a80 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
12a90 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se, aListelem[i+
12aa0 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
12ab0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12ac0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12ad0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c  OP_Goto, 0, endL
12ae0 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  abel);.        s
12af0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
12b00 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74 43 61  eLabel(v, nextCa
12b10 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
12b20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52     if( pExpr->pR
12b30 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ight ){.        
12b40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
12b50 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
12b60 52 69 67 68 74 2c 20 74 61 72 67 65 74 29 3b 0a  Right, target);.
12b70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12b80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12b90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
12ba0 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
12bb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
12bc0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
12bd0 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c  abel(v, endLabel
12be0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
12bf0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
12c00 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
12c10 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41  R.    case TK_RA
12c20 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ISE: {.      if(
12c30 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74   !pParse->trigSt
12c40 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ack ){.        s
12c50 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
12c60 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
12c80 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20  AISE() may only 
12c90 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  be used within a
12ca0 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d   trigger-program
12cb0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
12cc0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
12cd0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
12ce0 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67 6e 6f 72  Column!=OE_Ignor
12cf0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 61 73  e ){.         as
12d00 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f  sert( pExpr->iCo
12d10 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63  lumn==OE_Rollbac
12d20 6b 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  k ||.           
12d30 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
12d40 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72 74  lumn == OE_Abort
12d50 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
12d60 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
12d70 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69 6c 20 29  umn == OE_Fail )
12d80 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;.         sqlit
12d90 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 70 50  e3DequoteExpr(pP
12da0 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29  arse->db, pExpr)
12db0 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;.         sqlit
12dc0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
12dd0 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
12de0 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78 70  CONSTRAINT, pExp
12df0 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 2c 0a 20  r->iColumn, 0,. 
12e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e10 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 45         (char*)pE
12e20 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
12e30 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  xpr->token.n);. 
12e40 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
12e50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12e60 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d  Expr->iColumn ==
12e70 20 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20   OE_Ignore );.  
12e80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12e90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
12ea0 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20 30 29  ontextPop, 0, 0)
12eb0 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;.         sqlit
12ec0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12ed0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72  OP_Goto, 0, pPar
12ee0 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69  se->trigStack->i
12ef0 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20 20 20 20  gnoreJump);.    
12f00 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
12f10 28 28 76 2c 20 22 72 61 69 73 65 28 49 47 4e 4f  ((v, "raise(IGNO
12f20 52 45 29 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  RE)"));.      }.
12f30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12f40 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
12f50 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
12f60 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
12f70 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
12f80 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
12f90 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
12fa0 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52  2);.  return inR
12fb0 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  eg;.}../*.** Gen
12fc0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
12fd0 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73  aluate an expres
12fe0 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  sion and store t
12ff0 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
13000 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20  to a register.  
13010 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
13020 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ter number where
13030 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
13040 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a  are stored..**.*
13050 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74 65  * If the registe
13060 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  r is a temporary
13070 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63   register that c
13080 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65  an be deallocate
13090 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65  d,.** then write
130a0 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f   its number into
130b0 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65 20   *pReg.  If the 
130c0 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  result register 
130d0 69 73 20 6e 6f 0a 2a 2a 20 61 20 74 65 6d 70 6f  is no.** a tempo
130e0 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a  rary, then set *
130f0 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f  pReg to zero..*/
13100 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
13110 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a  CodeTemp(Parse *
13120 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
13130 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b  xpr, int *pReg){
13140 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69  .  int r1 = sqli
13150 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
13160 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 32 20  arse);.  int r2 
13170 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
13180 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
13190 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 69 66  pExpr, r1);.  if
131a0 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20  ( r2==r1 ){.    
131b0 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 7d 65  *pReg = r1;.  }e
131c0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
131d0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
131e0 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
131f0 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20  *pReg = 0;.  }. 
13200 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f   return r2;.}../
13210 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
13220 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
13230 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
13240 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
13250 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
13260 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
13270 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  et.  The results
13280 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
13290 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  to appear.** in 
132a0 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
132b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
132c0 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70  xprCode(Parse *p
132d0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
132e0 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
132f0 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20  .  int inReg;.. 
13300 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
13310 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61  0 && target<=pPa
13320 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69  rse->nMem );.  i
13330 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
13340 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
13350 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
13360 65 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  et);.  assert( p
13370 50 61 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20  Parse->pVdbe || 
13380 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
13390 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
133a0 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20  ( inReg!=target 
133b0 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  && pParse->pVdbe
133c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
133d0 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
133e0 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70  ->pVdbe, OP_SCop
133f0 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
13400 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
13410 74 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  target;.}../*.**
13420 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
13430 68 61 74 20 65 76 61 6c 75 74 65 73 20 74 68 65  hat evalutes the
13440 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
13450 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65 20 72  n and puts the r
13460 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69  esult.** in regi
13470 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a  ster target..**.
13480 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63  ** Also make a c
13490 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  opy of the expre
134a0 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e  ssion results in
134b0 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68  to another "cach
134c0 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61  e" register.** a
134d0 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78  nd modify the ex
134e0 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74  pression so that
134f0 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69   the next time i
13500 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a  t is evaluated,.
13510 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  ** the result is
13520 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
13530 61 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a  ache register..*
13540 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13550 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 78  e is used for ex
13560 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
13570 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65  re used multiple
13580 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65   .** times.  The
13590 79 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  y are evaluated 
135a0 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65 73  once and the res
135b0 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70 72  ults of the expr
135c0 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65  ession.** are re
135d0 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  used..*/.int sql
135e0 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43  ite3ExprCodeAndC
135f0 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
13600 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
13610 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
13620 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
13630 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
13640 6e 52 65 67 3b 0a 20 20 69 6e 52 65 67 20 3d 20  nReg;.  inReg = 
13650 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
13660 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
13670 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72 74  arget);.  assert
13680 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
13690 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
136a0 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 20 20 0a  K_REGISTER ){  .
136b0 20 20 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20      int iMem;.  
136c0 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73    iMem = ++pPars
136d0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
136e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
136f0 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 6e 52 65 67  , OP_Copy, inReg
13700 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 70 45 78  , iMem);.    pEx
13710 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 4d 65  pr->iTable = iMe
13720 6d 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  m;.    pExpr->op
13730 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
13740 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 52    }.  return inR
13750 65 67 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  eg;.}.../*.** Ge
13760 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
13770 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75   pushes the valu
13780 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  e of every eleme
13790 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a  nt of the given.
137a0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
137b0 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e  st into a sequen
137c0 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ce of registers 
137d0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72  beginning at tar
137e0 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  get..**.** Retur
137f0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
13800 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74  elements evaluat
13810 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
13820 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
13830 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
13840 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
13850 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
13860 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
13870 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65  ,   /* The expre
13880 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65  ssion list to be
13890 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
138a0 74 61 72 67 65 74 20 20 20 20 20 20 20 20 20 2f  target         /
138b0 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
138c0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
138d0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
138e0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
138f0 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65  int i, n;.  asse
13900 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20  rt( pList!=0 || 
13910 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
13920 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
13930 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
13940 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
13950 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
13960 3e 30 20 29 3b 0a 20 20 6e 20 3d 20 70 4c 69 73  >0 );.  n = pLis
13970 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28  t->nExpr;.  for(
13980 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
13990 69 3d 6e 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  i=n; i>0; i--, p
139a0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
139b0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
139c0 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
139d0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
139e0 74 61 72 67 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20  target++;.  }.  
139f0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
13a00 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
13a10 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
13a20 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
13a30 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
13a40 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
13a50 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
13a60 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
13a70 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  rue but executio
13a80 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
13a90 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
13aa0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
13ab0 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  s false..**.** I
13ac0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
13ad0 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
13ae0 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
13af0 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65   nor false), the
13b00 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75  n.** take the ju
13b10 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66  mp if the jumpIf
13b20 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c  Null flag is SQL
13b30 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a  ITE_JUMPIFNULL..
13b40 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
13b50 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
13b60 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
13b70 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
13b80 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
13b90 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
13ba0 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
13bb0 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
13bc0 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
13bd0 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
13be0 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
13bf0 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
13c00 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
13c10 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
13c20 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
13c30 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
13c40 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
13c50 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
13c60 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
13c70 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
13c80 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
13c90 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
13ca0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
13cb0 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73  3ExprIfTrue(Pars
13cc0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
13cd0 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
13ce0 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
13cf0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
13d00 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
13d10 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
13d20 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
13d30 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
13d40 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
13d50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
13d60 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
13d70 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
13d80 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
13d90 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78   if( v==0 || pEx
13da0 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
13db0 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
13dc0 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
13dd0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
13de0 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  D: {.      int d
13df0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
13e00 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
13e10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
13e20 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
13e30 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a  xpr->pLeft, d2,j
13e40 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
13e50 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
13e60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
13e70 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
13e80 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
13e90 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
13ea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13eb0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
13ec0 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61   d2);.      brea
13ed0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
13ee0 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
13ef0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
13f00 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
13f10 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
13f20 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
13f30 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
13f40 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
13f50 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
13f60 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
13f70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13f80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
13f90 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
13fa0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
13fb0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
13fc0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
13fd0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
13fe0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
13ff0 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
14000 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
14010 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
14020 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
14030 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
14040 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
14050 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
14060 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Lt );.      a
14070 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50  ssert( TK_LE==OP
14080 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Le );.      ass
14090 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47  ert( TK_GT==OP_G
140a0 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
140b0 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20  t( TK_GE==OP_Ge 
140c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
140d0 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b   TK_EQ==OP_Eq );
140e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
140f0 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  K_NE==OP_Ne );. 
14100 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
14110 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
14120 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
14130 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
14140 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
14150 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
14160 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
14170 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
14180 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
14190 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
141a0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
141b0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
141c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
141d0 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
141e0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
141f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14200 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
14210 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
14220 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73  NULL: {.      as
14230 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
14240 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
14250 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
14260 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
14270 6c 6c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  ll );.      r1 =
14280 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14290 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
142a0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
142b0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
142c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
142d0 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
142e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
142f0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
14300 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
14310 20 2f 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e   /*    x BETWEEN
14320 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 20 20 2a   y AND z.      *
14330 2a 0a 20 20 20 20 20 20 2a 2a 20 49 73 20 65 71  *.      ** Is eq
14340 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20  uivalent to .   
14350 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
14360 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
14370 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
14380 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75 63  * Code it as suc
14390 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74  h, taking care t
143a0 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o do the common 
143b0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  subexpression.  
143c0 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 61 74      ** elementat
143d0 69 6f 6e 20 6f 66 20 78 2e 0a 20 20 20 20 20 20  ion of x..      
143e0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 65 78  */.      Expr ex
143f0 70 72 41 6e 64 3b 0a 20 20 20 20 20 20 45 78 70  prAnd;.      Exp
14400 72 20 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20  r compLeft;.    
14410 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74    Expr compRight
14420 3b 0a 20 20 20 20 20 20 45 78 70 72 20 65 78 70  ;.      Expr exp
14430 72 58 3b 0a 0a 20 20 20 20 20 20 65 78 70 72 58  rX;..      exprX
14440 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74   = *pExpr->pLeft
14450 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e  ;.      exprAnd.
14460 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20  op = TK_AND;.   
14470 20 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74     exprAnd.pLeft
14480 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20   = &compLeft;.  
14490 20 20 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67      exprAnd.pRig
144a0 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b  ht = &compRight;
144b0 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e  .      compLeft.
144c0 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 20 20  op = TK_GE;.    
144d0 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74    compLeft.pLeft
144e0 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20 20   = &exprX;.     
144f0 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74   compLeft.pRight
14500 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
14510 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
14520 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20     compRight.op 
14530 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20 20 20 20 63  = TK_LE;.      c
14540 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d  ompRight.pLeft =
14550 20 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20 63   &exprX;.      c
14560 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20  ompRight.pRight 
14570 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
14580 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
14590 20 20 65 78 70 72 58 2e 69 54 61 62 6c 65 20 3d    exprX.iTable =
145a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
145b0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78  Temp(pParse, &ex
145c0 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b  prX, &regFree1);
145d0 0a 20 20 20 20 20 20 65 78 70 72 58 2e 6f 70 20  .      exprX.op 
145e0 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
145f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14600 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 26  IfTrue(pParse, &
14610 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
14620 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
14630 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14640 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
14650 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
14660 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
14670 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
14680 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
14690 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
146a0 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65  v, OP_If, r1, de
146b0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d  st, jumpIfNull!=
146c0 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
146d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
146e0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
146f0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
14700 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ee1);.  sqlite3R
14710 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
14720 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
14730 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65    .}../*.** Gene
14740 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
14750 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
14760 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
14770 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
14780 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
14790 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
147a0 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75  sion is false bu
147b0 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
147c0 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
147d0 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
147e0 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
147f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
14800 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
14810 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
14820 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
14830 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d  lse) then.** jum
14840 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  p if jumpIfNull 
14850 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  is SQLITE_JUMPIF
14860 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72  NULL or fall thr
14870 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75  ough if jumpIfNu
14880 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76  ll.** is 0..*/.v
14890 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
148a0 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50  fFalse(Parse *pP
148b0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
148c0 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
148d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
148e0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
148f0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
14900 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  p = 0;.  int reg
14910 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74  Free1 = 0;.  int
14920 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20   regFree2 = 0;. 
14930 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20   int r1, r2;..  
14940 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75  assert( jumpIfNu
14950 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ll==SQLITE_JUMPI
14960 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e  FNULL || jumpIfN
14970 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ull==0 );.  if( 
14980 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30  v==0 || pExpr==0
14990 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
149a0 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45   The value of pE
149b0 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61  xpr->op and op a
149c0 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f  re related as fo
149d0 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
149e0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
149f0 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20              op. 
14a00 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d   **       ------
14a10 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d  ---          ---
14a20 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20  -------.  **    
14a30 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20     TK_ISNULL    
14a40 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c        OP_NotNull
14a50 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
14a60 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f  OTNULL         O
14a70 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  P_IsNull.  **   
14a80 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20      TK_NE       
14a90 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a         OP_Eq.  *
14aa0 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20  *       TK_EQ   
14ab0 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65             OP_Ne
14ac0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
14ad0 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  T              O
14ae0 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Le.  **       
14af0 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20  TK_LE           
14b00 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20     OP_Gt.  **   
14b10 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20      TK_GE       
14b20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a         OP_Lt.  *
14b30 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20  *       TK_LT   
14b40 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65             OP_Ge
14b50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f  .  **.  ** For o
14b60 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70  ther values of p
14b70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20  Expr->op, op is 
14b80 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e  undefined and un
14b90 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76  used..  ** The v
14ba0 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20  alue of TK_ and 
14bb0 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72  OP_ constants ar
14bc0 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68 20  e arranged such 
14bd0 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e  that we.  ** can
14be0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70   compute the map
14bf0 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67  ping above using
14c00 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
14c10 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20  xpression..  ** 
14c20 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66 79  Assert()s verify
14c30 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74   that the comput
14c40 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74  ation is correct
14c50 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28  ..  */.  op = ((
14c60 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53  pExpr->op+(TK_IS
14c70 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f  NULL&1))^1)-(TK_
14c80 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a  ISNULL&1);..  /*
14c90 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74 20   Verify correct 
14ca0 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f  alignment of TK_
14cb0 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
14cc0 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ts.  */.  assert
14cd0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
14ce0 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50  ISNULL || op==OP
14cf0 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73  _NotNull );.  as
14d00 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
14d10 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f  =TK_NOTNULL || o
14d20 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  p==OP_IsNull );.
14d30 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
14d40 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70  >op!=TK_NE || op
14d50 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73  ==OP_Eq );.  ass
14d60 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
14d70 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_EQ || op==OP_
14d80 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ne );.  assert( 
14d90 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54  pExpr->op!=TK_LT
14da0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b   || op==OP_Ge );
14db0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
14dc0 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f  ->op!=TK_LE || o
14dd0 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73  p==OP_Gt );.  as
14de0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
14df0 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GT || op==OP
14e00 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Le );.  assert(
14e10 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47   pExpr->op!=TK_G
14e20 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29  E || op==OP_Lt )
14e30 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
14e40 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
14e50 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
14e60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
14e70 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
14e80 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
14e90 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
14ea0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14eb0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
14ec0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
14ed0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
14ee0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14ef0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
14f00 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _OR: {.      int
14f10 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
14f20 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
14f30 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14f40 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
14f50 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
14f60 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49   jumpIfNull^SQLI
14f70 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
14f80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14f90 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
14fa0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
14fb0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
14fc0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14fd0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
14fe0 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62  (v, d2);.      b
14ff0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
15000 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
15010 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15020 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
15030 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
15040 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
15050 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15060 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
15070 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
15080 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
15090 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
150a0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
150b0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
150c0 51 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  Q: {.      r1 = 
150d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
150e0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
150f0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
15100 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
15110 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15120 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
15130 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
15140 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
15150 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
15160 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
15170 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
15180 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
15190 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
151a0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
151b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
151c0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
151d0 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
151e0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
151f0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
15200 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
15210 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
15220 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
15230 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15240 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
15250 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62  , dest);.      b
15260 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
15270 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
15280 20 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20 20 78   {.      /*    x
15290 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
152a0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
152b0 2a 2a 20 49 73 20 65 71 75 69 76 61 6c 65 6e 74  ** Is equivalent
152c0 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20   to .      **.  
152d0 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
152e0 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a  ND x<=z.      **
152f0 0a 20 20 20 20 20 20 2a 2a 20 43 6f 64 65 20 69  .      ** Code i
15300 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e  t as such, takin
15310 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65  g care to do the
15320 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65   common subexpre
15330 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 65  ssion.      ** e
15340 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78  lementation of x
15350 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
15360 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 0a 20   Expr exprAnd;. 
15370 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70 4c 65       Expr compLe
15380 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63  ft;.      Expr c
15390 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ompRight;.      
153a0 45 78 70 72 20 65 78 70 72 58 3b 0a 0a 20 20 20  Expr exprX;..   
153b0 20 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70     exprX = *pExp
153c0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
153d0 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f  exprAnd.op = TK_
153e0 41 4e 44 3b 0a 20 20 20 20 20 20 65 78 70 72 41  AND;.      exprA
153f0 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70  nd.pLeft = &comp
15400 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72  Left;.      expr
15410 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f  And.pRight = &co
15420 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 63  mpRight;.      c
15430 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f  ompLeft.op = TK_
15440 47 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65  GE;.      compLe
15450 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ft.pLeft = &expr
15460 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66  X;.      compLef
15470 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  t.pRight = pExpr
15480 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
15490 78 70 72 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52  xpr;.      compR
154a0 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b  ight.op = TK_LE;
154b0 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74  .      compRight
154c0 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
154d0 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74  .      compRight
154e0 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
154f0 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
15500 70 72 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e  pr;.      exprX.
15510 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  iTable = sqlite3
15520 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
15530 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65  rse, &exprX, &re
15540 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 65  gFree1);.      e
15550 78 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47  xprX.op = TK_REG
15560 49 53 54 45 52 3b 0a 20 20 20 20 20 20 73 71 6c  ISTER;.      sql
15570 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
15580 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
15590 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
155a0 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
155b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
155c0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20  ult: {.      r1 
155d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
155e0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
155f0 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b  xpr, &regFree1);
15600 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15610 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
15620 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20  fNot, r1, dest, 
15630 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
15640 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15650 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
15660 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
15670 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
15680 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
15690 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
156a0 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a  , regFree2);.}..
156b0 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20  /*.** Do a deep 
156c0 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77  comparison of tw
156d0 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  o expression tre
156e0 65 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  es.  Return TRUE
156f0 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69   (non-zero).** i
15700 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74  f they are ident
15710 69 63 61 6c 20 61 6e 64 20 72 65 74 75 72 6e 20  ical and return 
15720 46 41 4c 53 45 20 69 66 20 74 68 65 79 20 64 69  FALSE if they di
15730 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e  ffer in any way.
15740 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
15750 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
15760 6c 6c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20  ll return FALSE 
15770 65 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20  even if the two 
15780 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72  expressions.** r
15790 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61  eally are equiva
157a0 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e  lent.  If we can
157b0 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20 74  not prove that t
157c0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  he expressions a
157d0 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c  re.** identical,
157e0 20 77 65 20 72 65 74 75 72 6e 20 46 41 4c 53 45   we return FALSE
157f0 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65   just to be safe
15800 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  .  So if this ro
15810 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
15820 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 79 6f 75   false, then you
15830 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b   do not really k
15840 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20  now for certain 
15850 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
15860 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68  pressions are th
15870 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20  e same.  But if 
15880 79 6f 75 20 67 65 74 20 61 20 54 52 55 45 20 72  you get a TRUE r
15890 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a  eturn, then you.
158a0 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20 74  ** can be sure t
158b0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  he expressions a
158c0 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e  re the same.  In
158d0 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65 72   the places wher
158e0 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
158f0 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f  e is used, it do
15900 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67  es not hurt to g
15910 65 74 20 61 6e 20 65 78 74 72 61 20 46 41 4c 53  et an extra FALS
15920 45 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74  E - that.** just
15930 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
15940 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73   some slightly s
15950 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74  lower code.  But
15960 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e   returning.** an
15970 20 69 6e 63 6f 72 72 65 63 74 20 54 52 55 45 20   incorrect TRUE 
15980 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20  could lead to a 
15990 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  malfunction..*/.
159a0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
159b0 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c  ompare(Expr *pA,
159c0 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69 6e   Expr *pB){.  in
159d0 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  t i;.  if( pA==0
159e0 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ||pB==0 ){.    r
159f0 65 74 75 72 6e 20 70 42 3d 3d 70 41 3b 0a 20 20  eturn pB==pA;.  
15a00 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  }.  if( pA->op!=
15a10 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20  pB->op ) return 
15a20 30 3b 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c  0;.  if( (pA->fl
15a30 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
15a40 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26  t)!=(pB->flags &
15a50 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20   EP_Distinct) ) 
15a60 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
15a70 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70  !sqlite3ExprComp
15a80 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70  are(pA->pLeft, p
15a90 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75  B->pLeft) ) retu
15aa0 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
15ab0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
15ac0 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e  pA->pRight, pB->
15ad0 70 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e  pRight) ) return
15ae0 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c   0;.  if( pA->pL
15af0 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ist ){.    if( p
15b00 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  B->pList==0 ) re
15b10 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
15b20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pA->pList->nExpr
15b30 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  !=pB->pList->nEx
15b40 70 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  pr ) return 0;. 
15b50 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
15b60 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  ->pList->nExpr; 
15b70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
15b80 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70  !sqlite3ExprComp
15b90 61 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61  are(pA->pList->a
15ba0 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70  [i].pExpr, pB->p
15bb0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
15bc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
15bd0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
15be0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
15bf0 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20   pB->pList ){.  
15c00 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
15c10 20 20 69 66 28 20 70 41 2d 3e 70 53 65 6c 65 63    if( pA->pSelec
15c20 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74  t || pB->pSelect
15c30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
15c40 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70  f( pA->iTable!=p
15c50 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d  B->iTable || pA-
15c60 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43  >iColumn!=pB->iC
15c70 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 30  olumn ) return 0
15c80 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  ;.  if( pA->op!=
15c90 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d  TK_COLUMN && pA-
15ca0 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20 20  >token.z ){.    
15cb0 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d  if( pB->token.z=
15cc0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
15cd0 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e     if( pB->token
15ce0 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20  .n!=pA->token.n 
15cf0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
15d00 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
15d10 43 6d 70 28 28 63 68 61 72 2a 29 70 41 2d 3e 74  Cmp((char*)pA->t
15d20 6f 6b 65 6e 2e 7a 2c 28 63 68 61 72 2a 29 70 42  oken.z,(char*)pB
15d30 2d 3e 74 6f 6b 65 6e 2e 7a 2c 70 42 2d 3e 74 6f  ->token.z,pB->to
15d40 6b 65 6e 2e 6e 29 21 3d 30 20 29 7b 0a 20 20 20  ken.n)!=0 ){.   
15d50 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
15d60 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
15d70 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  1;.}.../*.** Add
15d80 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
15d90 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
15da0 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52  aCol[] array.  R
15db0 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
15dc0 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
15dd0 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
15de0 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
15df0 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
15e00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15e10 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e  addAggInfoColumn
15e20 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67  (sqlite3 *db, Ag
15e30 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20  gInfo *pInfo){. 
15e40 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d   int i;.  pInfo-
15e50 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41  >aCol = sqlite3A
15e60 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
15e70 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20       db,.       
15e80 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20  pInfo->aCol,.   
15e90 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
15ea0 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20  ->aCol[0]),.    
15eb0 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70 49     3,.       &pI
15ec0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20  nfo->nColumn,.  
15ed0 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f       &pInfo->nCo
15ee0 6c 75 6d 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20  lumnAlloc,.     
15ef0 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
15f00 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
15f10 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
15f20 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
15f30 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72  Info->aFunc[] ar
15f40 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
15f50 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
15f60 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
15f70 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
15f80 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
15f90 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
15fa0 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
15fb0 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64  oFunc(sqlite3 *d
15fc0 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  b, AggInfo *pInf
15fd0 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
15fe0 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71  Info->aFunc = sq
15ff0 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
16000 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a  te(.       db, .
16010 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46         pInfo->aF
16020 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  unc,.       size
16030 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  of(pInfo->aFunc[
16040 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20  0]),.       3,. 
16050 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46        &pInfo->nF
16060 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  unc,.       &pIn
16070 66 6f 2d 3e 6e 46 75 6e 63 41 6c 6c 6f 63 2c 0a  fo->nFuncAlloc,.
16080 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
16090 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
160a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
160b0 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c  an xFunc for wal
160c0 6b 45 78 70 72 54 72 65 65 28 29 20 75 73 65 64  kExprTree() used
160d0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a   to implement .*
160e0 2a 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  * sqlite3ExprAna
160f0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
16100 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
16110 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
16120 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74  tes.** for addit
16130 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
16140 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
16150 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74  utine analyzes t
16160 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  he aggregate fun
16170 63 74 69 6f 6e 20 61 74 20 70 45 78 70 72 2e 0a  ction at pExpr..
16180 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  */.static int an
16190 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 76  alyzeAggregate(v
161a0 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20  oid *pArg, Expr 
161b0 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69  *pExpr){.  int i
161c0 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
161d0 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74  *pNC = (NameCont
161e0 65 78 74 20 2a 29 70 41 72 67 3b 0a 20 20 50 61  ext *)pArg;.  Pa
161f0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e  rse *pParse = pN
16200 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63  C->pParse;.  Src
16210 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
16220 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
16230 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
16240 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49  nfo = pNC->pAggI
16250 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  nfo;..  switch( 
16260 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
16270 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
16280 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
16290 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
162a0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
162b0 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   if the column i
162c0 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
162d0 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
162e0 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75  OM.      ** clau
162f0 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
16300 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  ate query */.   
16310 20 20 20 69 66 28 20 70 53 72 63 4c 69 73 74 20     if( pSrcList 
16320 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
16330 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
16340 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74  pItem = pSrcList
16350 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ->a;.        for
16360 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74  (i=0; i<pSrcList
16370 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
16380 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
16390 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
163a0 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20  col *pCol;.     
163b0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
163c0 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69  iTable==pItem->i
163d0 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
163e0 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72        /* If we r
163f0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
16400 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70   it means that p
16410 45 78 70 72 20 72 65 66 65 72 73 20 74 6f 20 61  Expr refers to a
16420 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20   table.         
16430 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e     ** that is in
16440 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
16450 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
16460 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20  e query.  .     
16470 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
16480 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e        ** Make an
16490 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63   entry for the c
164a0 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66  olumn in pAggInf
164b0 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65  o->aCol[] if the
164c0 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  re.            *
164d0 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72  * is not an entr
164e0 79 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  y there already.
164f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
16500 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
16510 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  k;.            p
16520 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  Col = pAggInfo->
16530 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  aCol;.          
16540 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67    for(k=0; k<pAg
16550 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  gInfo->nColumn; 
16560 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  k++, pCol++){.  
16570 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
16580 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45  pCol->iTable==pE
16590 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20  xpr->iTable &&. 
165a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165b0 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   pCol->iColumn==
165c0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29  pExpr->iColumn )
165d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
165e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
165f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16610 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49     if( (k>=pAggI
16620 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20  nfo->nColumn).  
16630 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6b             && (k
16640 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c   = addAggInfoCol
16650 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  umn(pParse->db, 
16660 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20  pAggInfo))>=0 . 
16670 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
16680 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
16690 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43   = &pAggInfo->aC
166a0 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20  ol[k];.         
166b0 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20       pCol->pTab 
166c0 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  = pExpr->pTab;. 
166d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
166e0 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70  l->iTable = pExp
166f0 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
16700 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
16710 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
16720 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
16730 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65         pCol->iMe
16740 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
16750 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
16760 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
16770 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
16780 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
16790 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
167a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
167b0 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75   pAggInfo->pGrou
167c0 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBy ){.         
167d0 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b         int j, n;
167e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
167f0 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d   ExprList *pGB =
16800 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75   pAggInfo->pGrou
16810 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBy;.           
16820 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
16830 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d  List_item *pTerm
16840 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20   = pGB->a;.     
16850 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70             n = p
16860 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  GB->nExpr;.     
16870 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a             for(j
16880 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54  =0; j<n; j++, pT
16890 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
168a0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
168b0 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
168c0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
168d0 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d       if( pE->op=
168e0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
168f0 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
16900 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
16910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16920 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45   pE->iColumn==pE
16930 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
16940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16950 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
16960 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20  rColumn = j;.   
16970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16980 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
16990 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
169a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
169b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
169c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
169d0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
169e0 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  umn<0 ){.       
169f0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
16a00 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70  SorterColumn = p
16a10 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e  AggInfo->nSortin
16a20 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20  gColumn++;.     
16a30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16a40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16a50 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73       /* There is
16a60 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f   now an entry fo
16a70 72 20 70 45 78 70 72 20 69 6e 20 70 41 67 67 49  r pExpr in pAggI
16a80 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74  nfo->aCol[] (eit
16a90 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  her.            
16aa0 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61  ** because it wa
16ab0 73 20 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f  s there before o
16ac0 72 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  r because we jus
16ad0 74 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20  t created it).. 
16ae0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f             ** Co
16af0 6e 76 65 72 74 20 74 68 65 20 70 45 78 70 72 20  nvert the pExpr 
16b00 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43  to be a TK_AGG_C
16b10 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20  OLUMN referring 
16b20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  to that.        
16b30 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d      ** pAggInfo-
16b40 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20  >aCol[] entry.. 
16b50 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
16b60 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
16b70 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
16b80 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
16b90 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
16ba0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  _AGG_COLUMN;.   
16bb0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
16bc0 69 41 67 67 20 3d 20 6b 3b 0a 20 20 20 20 20 20  iAgg = k;.      
16bd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16be0 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69         } /* endi
16bf0 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  f pExpr->iTable=
16c00 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
16c10 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  */.        } /* 
16c20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53  end loop over pS
16c30 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  rcList */.      
16c40 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  }.      return 1
16c50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
16c60 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
16c70 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
16c80 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20   pNC->nDepth==0 
16c90 74 65 73 74 20 63 61 75 73 65 73 20 61 67 67 72  test causes aggr
16ca0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
16cb0 69 6e 20 73 75 62 71 75 65 72 69 65 73 0a 20 20  in subqueries.  
16cc0 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 67 6e      ** to be ign
16cd0 6f 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66  ored */.      if
16ce0 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30  ( pNC->nDepth==0
16cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
16d00 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
16d10 45 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63  Expr is a duplic
16d20 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61  ate of another a
16d30 67 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20  ggregate .      
16d40 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68    ** function th
16d50 61 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  at is already in
16d60 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74   the pAggInfo st
16d70 72 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20  ructure.        
16d80 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  */.        struc
16d90 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
16da0 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f  pItem = pAggInfo
16db0 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  ->aFunc;.       
16dc0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
16dd0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
16de0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
16df0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
16e00 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74  3ExprCompare(pIt
16e10 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72  em->pExpr, pExpr
16e20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
16e30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
16e40 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
16e50 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67        if( i>=pAg
16e60 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a  gInfo->nFunc ){.
16e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78            /* pEx
16e80 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20  pr is original. 
16e90 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72   Make a new entr
16ea0 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  y in pAggInfo->a
16eb0 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20  Func[].         
16ec0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38   */.          u8
16ed0 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73   enc = ENC(pPars
16ee0 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20  e->db);.        
16ef0 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f    i = addAggInfo
16f00 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  Func(pParse->db,
16f10 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20   pAggInfo);.    
16f20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29        if( i>=0 )
16f30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
16f40 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  tem = &pAggInfo-
16f50 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20  >aFunc[i];.     
16f60 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45         pItem->pE
16f70 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
16f80 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
16f90 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
16fa0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
16fb0 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20     pItem->pFunc 
16fc0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
16fd0 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
16fe0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16ff0 20 20 20 20 20 28 63 68 61 72 2a 29 70 45 78 70       (char*)pExp
17000 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
17010 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20  r->token.n,.    
17020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17030 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45  Expr->pList ? pE
17040 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
17050 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a  r : 0, enc, 0);.
17060 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
17070 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
17080 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  P_Distinct ){.  
17090 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
170a0 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70  m->iDistinct = p
170b0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
170c0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
170d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
170e0 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
170f0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
17100 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
17110 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17120 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72     /* Make pExpr
17130 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70   point to the ap
17140 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e  propriate pAggIn
17150 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72  fo->aFunc[] entr
17160 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  y.        */.   
17170 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
17180 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 45   = i;.        pE
17190 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
171a0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
171b0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
171c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
171d0 20 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20   /* Recursively 
171e0 77 61 6c 6b 20 73 75 62 71 75 65 72 69 65 73 20  walk subqueries 
171f0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 54 4b 5f 43  looking for TK_C
17200 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 74 68 61 74  OLUMN nodes that
17210 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 62 65   need.  ** to be
17220 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 41   changed to TK_A
17230 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 42 75 74 20  GG_COLUMN.  But 
17240 69 6e 63 72 65 6d 65 6e 74 20 6e 44 65 70 74 68  increment nDepth
17250 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20 54 4b   so that.  ** TK
17260 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f  _AGG_FUNCTION no
17270 64 65 73 20 69 6e 20 73 75 62 71 75 65 72 69 65  des in subquerie
17280 73 20 77 69 6c 6c 20 62 65 20 75 6e 63 68 61 6e  s will be unchan
17290 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
172a0 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
172b0 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74  {.    pNC->nDept
172c0 68 2b 2b 3b 0a 20 20 20 20 77 61 6c 6b 53 65 6c  h++;.    walkSel
172d0 65 63 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70  ectExpr(pExpr->p
172e0 53 65 6c 65 63 74 2c 20 61 6e 61 6c 79 7a 65 41  Select, analyzeA
172f0 67 67 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a  ggregate, pNC);.
17300 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d      pNC->nDepth-
17310 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  -;.  }.  return 
17320 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  0;.}../*.** Anal
17330 79 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65 78  yze the given ex
17340 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67  pression looking
17350 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
17360 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  unctions and.** 
17370 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  for variables th
17380 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64  at need to be ad
17390 64 65 64 20 74 6f 20 74 68 65 20 70 50 61 72 73  ded to the pPars
173a0 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e  e->aAgg[] array.
173b0 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f  .** Make additio
173c0 6e 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74  nal entries to t
173d0 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
173e0 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65 73  ] array as neces
173f0 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  sary..**.** This
17400 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
17410 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61  only be called a
17420 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73  fter the express
17430 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ion has been.** 
17440 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69  analyzed by sqli
17450 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
17460 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  mes()..*/.void s
17470 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
17480 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65  eAggregates(Name
17490 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
174a0 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 77 61  pr *pExpr){.  wa
174b0 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
174c0 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  , analyzeAggrega
174d0 74 65 2c 20 70 4e 43 29 3b 0a 7d 0a 0a 2f 2a 0a  te, pNC);.}../*.
174e0 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45  ** Call sqlite3E
174f0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
17500 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79  ates() for every
17510 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
17520 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
17530 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68  list.  Return th
17540 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
17550 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rs..**.** If an 
17560 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  error is found, 
17570 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20  the analysis is 
17580 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f  cut short..*/.vo
17590 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  id sqlite3ExprAn
175a0 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d  alyzeAggList(Nam
175b0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
175c0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
175d0 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
175e0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
175f0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
17600 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
17610 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
17620 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
17630 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
17640 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
17650 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
17660 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65  egates(pNC, pIte
17670 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  m->pExpr);.    }
17680 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
17690 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f  locate or deallo
176a0 63 61 74 65 20 74 65 6d 70 6f 72 61 72 79 20 75  cate temporary u
176b0 73 65 20 72 65 67 69 73 74 65 72 73 20 64 75 72  se registers dur
176c0 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ing code generat
176d0 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
176e0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61  te3GetTempReg(Pa
176f0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
17700 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  if( pParse->nTem
17710 70 52 65 67 20 29 7b 0a 20 20 20 20 72 65 74 75  pReg ){.    retu
17720 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  rn pParse->aTemp
17730 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54  Reg[--pParse->nT
17740 65 6d 70 52 65 67 5d 3b 0a 20 20 7d 65 6c 73 65  empReg];.  }else
17750 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70  {.    return ++p
17760 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d  Parse->nMem;.  }
17770 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  .}.void sqlite3R
17780 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50 61  eleaseTempReg(Pa
17790 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
177a0 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52   iReg){.  if( iR
177b0 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54  eg && pParse->nT
177c0 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65  empReg<ArraySize
177d0 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65  (pParse->aTempRe
177e0 67 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  g) ){.    assert
177f0 28 20 69 52 65 67 3e 30 20 29 3b 0a 20 20 20 20  ( iReg>0 );.    
17800 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
17810 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  [pParse->nTempRe
17820 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d  g++] = iReg;.  }
17830 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
17840 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  te or deallocate
17850 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67   a block of nReg
17860 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67   consecutive reg
17870 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71  isters.*/.int sq
17880 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
17890 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
178a0 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
178b0 74 20 69 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c  t i;.  if( nReg<
178c0 3d 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52  =pParse->nRangeR
178d0 65 67 20 29 7b 0a 20 20 20 20 69 20 20 3d 20 70  eg ){.    i  = p
178e0 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
178f0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  ;.    pParse->iR
17900 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b  angeReg += nReg;
17910 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  .    pParse->nRa
17920 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a  ngeReg -= nReg;.
17930 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d    }else{.    i =
17940 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
17950 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
17960 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20  m += nReg;.  }. 
17970 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69   return i;.}.voi
17980 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
17990 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20  TempRange(Parse 
179a0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
179b0 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
179c0 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d  if( nReg>pParse-
179d0 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20  >nRangeReg ){.  
179e0 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
179f0 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20  Reg = nReg;.    
17a00 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
17a10 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a  g = iReg;.  }.}.