/ Hex Artifact Content
Login

Artifact 522ba17fa6253a98dc6451e600341277ea43d5c6:


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 34 31 20 32 30 30 38 2f 30 31 2f 31 30 20  .341 2008/01/10 
0220: 30 33 3a 34 36 3a 33 36 20 64 72 68 20 45 78 70  03:46:36 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 30 20 23 31 20 23 32 20 2e 2e 2e 20     #0 #1 #2 ... 
2270: 20 54 68 65 73 65 20 74 65 72 6d 73 20 72 65 66   These terms ref
2280: 65 72 20 74 6f 20 65 6c 65 6d 65 6e 74 73 0a 2a  er to elements.*
2290: 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  * on the stack. 
22a0: 20 22 23 30 22 20 6d 65 61 6e 73 20 74 68 65 20   "#0" means the 
22b0: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
22c0: 2e 0a 2a 2a 20 22 23 31 22 20 6d 65 61 6e 73 20  ..** "#1" means 
22d0: 74 68 65 20 6e 65 78 74 20 64 6f 77 6e 20 6f 6e  the next down on
22e0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 41 6e 64   the stack.  And
22f0: 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a   so forth..**.**
2300: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2310: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
2320: 61 72 73 65 72 20 74 6f 20 64 65 61 6c 20 77 69  arser to deal wi
2330: 74 68 20 6f 6e 20 6f 66 20 74 68 6f 73 65 20 74  th on of those t
2340: 65 72 6d 73 2e 0a 2a 2a 20 49 74 20 69 6d 6d 65  erms..** It imme
2350: 64 69 61 74 65 6c 79 20 67 65 6e 65 72 61 74 65  diately generate
2360: 73 20 63 6f 64 65 20 74 6f 20 73 74 6f 72 65 20  s code to store 
2370: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 61 20 6d  the value in a m
2380: 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a  emory location..
2390: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 73 20 61  ** The returns a
23a0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
23b0: 74 20 77 69 6c 6c 20 63 6f 64 65 20 74 6f 20 65  t will code to e
23c0: 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
23d0: 20 66 72 6f 6d 0a 2a 2a 20 74 68 61 74 20 6d 65   from.** that me
23e0: 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 61 73  mory location as
23f0: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 45 78 70 72   needed..*/.Expr
2400: 20 2a 73 71 6c 69 74 65 33 52 65 67 69 73 74 65   *sqlite3Registe
2410: 72 45 78 70 72 28 50 61 72 73 65 20 2a 70 50 61  rExpr(Parse *pPa
2420: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  rse, Token *pTok
2430: 65 6e 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  en){.  Vdbe *v =
2440: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
2450: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 6e 74    Expr *p;.  int
2460: 20 64 65 70 74 68 3b 0a 20 20 69 66 28 20 70 50   depth;.  if( pP
2470: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
2480: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
2490: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
24a0: 6e 65 61 72 20 5c 22 25 54 5c 22 3a 20 73 79 6e  near \"%T\": syn
24b0: 74 61 78 20 65 72 72 6f 72 22 2c 20 70 54 6f 6b  tax error", pTok
24c0: 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  en);.    return 
24d0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
24e0: 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c  rse, TK_NULL, 0,
24f0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   0, 0);.  }.  if
2500: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( v==0 ) return 
2510: 30 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  0;.  p = sqlite3
2520: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2530: 5f 52 45 47 49 53 54 45 52 2c 20 30 2c 20 30 2c  _REGISTER, 0, 0,
2540: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20   pToken);.  if( 
2550: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  p==0 ){.    retu
2560: 72 6e 20 30 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  rn 0;  /* Malloc
2570: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20   failed */.  }. 
2580: 20 64 65 70 74 68 20 3d 20 61 74 6f 69 28 28 63   depth = atoi((c
2590: 68 61 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b  har*)&pToken->z[
25a0: 31 5d 29 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65  1]);.  p->iTable
25b0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
25c0: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  m;.  sqlite3Vdbe
25d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
25e0: 79 2c 20 2d 64 65 70 74 68 2c 20 70 2d 3e 69 54  y, -depth, p->iT
25f0: 61 62 6c 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  able);.  return 
2600: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e  p;.}../*.** Join
2610: 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73   two expressions
2620: 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70   using an AND op
2630: 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68  erator.  If eith
2640: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  er expression is
2650: 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a  .** NULL, then j
2660: 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f  ust return the o
2670: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e  ther expression.
2680: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
2690: 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33  3ExprAnd(sqlite3
26a0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66   *db, Expr *pLef
26b0: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29  t, Expr *pRight)
26c0: 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30  {.  if( pLeft==0
26d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
26e0: 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69  Right;.  }else i
26f0: 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( pRight==0 ){.
2700: 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74      return pLeft
2710: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2720: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
2730: 72 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 70 4c  r(db, TK_AND, pL
2740: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b  eft, pRight, 0);
2750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
2760: 74 20 74 68 65 20 45 78 70 72 2e 73 70 61 6e 20  t the Expr.span 
2770: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 67 69 76  field of the giv
2780: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  en expression to
2790: 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78   span all.** tex
27a0: 74 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  t between the tw
27b0: 6f 20 67 69 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a  o given tokens..
27c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
27d0: 78 70 72 53 70 61 6e 28 45 78 70 72 20 2a 70 45  xprSpan(Expr *pE
27e0: 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66  xpr, Token *pLef
27f0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74  t, Token *pRight
2800: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 52 69  ){.  assert( pRi
2810: 67 68 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ght!=0 );.  asse
2820: 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a  rt( pLeft!=0 );.
2830: 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70    if( pExpr && p
2840: 52 69 67 68 74 2d 3e 7a 20 26 26 20 70 4c 65 66  Right->z && pLef
2850: 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 61 73 73 65  t->z ){.    asse
2860: 72 74 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d  rt( pLeft->dyn==
2870: 30 20 7c 7c 20 70 4c 65 66 74 2d 3e 7a 5b 70 4c  0 || pLeft->z[pL
2880: 65 66 74 2d 3e 6e 5d 3d 3d 30 20 29 3b 0a 20 20  eft->n]==0 );.  
2890: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 64 79 6e    if( pLeft->dyn
28a0: 3d 3d 30 20 26 26 20 70 52 69 67 68 74 2d 3e 64  ==0 && pRight->d
28b0: 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  yn==0 ){.      p
28c0: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70  Expr->span.z = p
28d0: 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20 20 20 20 70  Left->z;.      p
28e0: 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70  Expr->span.n = p
28f0: 52 69 67 68 74 2d 3e 6e 20 2b 20 28 70 52 69 67  Right->n + (pRig
2900: 68 74 2d 3e 7a 20 2d 20 70 4c 65 66 74 2d 3e 7a  ht->z - pLeft->z
2910: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2920: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
2930: 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  z = 0;.    }.  }
2940: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
2950: 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73  uct a new expres
2960: 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20  sion node for a 
2970: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75  function with mu
2980: 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65  ltiple.** argume
2990: 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  nts..*/.Expr *sq
29a0: 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f  lite3ExprFunctio
29b0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
29c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
29d0: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
29e0: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
29f0: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
2a00: 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   );.  pNew = sql
2a10: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
2a20: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
2a30: 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20 69  eof(Expr) );.  i
2a40: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
2a50: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
2a60: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 20  tDelete(pList); 
2a70: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
2a80: 20 6d 65 6d 6f 72 79 20 77 68 65 6e 20 6d 61 6c   memory when mal
2a90: 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  loc fails */.   
2aa0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2ab0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46   pNew->op = TK_F
2ac0: 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d  UNCTION;.  pNew-
2ad0: 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  >pList = pList;.
2ae0: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
2af0: 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 70 4e  ->dyn==0 );.  pN
2b00: 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f  ew->token = *pTo
2b10: 6b 65 6e 3b 0a 20 20 70 4e 65 77 2d 3e 73 70 61  ken;.  pNew->spa
2b20: 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b  n = pNew->token;
2b30: 0a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53  ..  sqlite3ExprS
2b40: 65 74 48 65 69 67 68 74 28 70 4e 65 77 29 3b 0a  etHeight(pNew);.
2b50: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
2b60: 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 61  ../*.** Assign a
2b70: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
2b80: 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f   to an expressio
2b90: 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73 20 61  n that encodes a
2ba0: 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 6e 20   wildcard.** in 
2bb0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
2bc0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a   statement.  .**
2bd0: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 63 6f  .** Wildcards co
2be0: 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69  nsisting of a si
2bf0: 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61 73 73  ngle "?" are ass
2c00: 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74 20 73  igned the next s
2c10: 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76 61 72  equential.** var
2c20: 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a  iable number..**
2c30: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
2c40: 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22   the form "?nnn"
2c50: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
2c60: 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22 2e 20  e number "nnn". 
2c70: 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65   We make.** sure
2c80: 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20 74 6f   "nnn" is not to
2c90: 6f 20 62 65 20 74 6f 20 61 76 6f 69 64 20 61 20  o be to avoid a 
2ca0: 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76 69 63  denial of servic
2cb0: 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a  e attack when.**
2cc0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
2cd0: 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e  nt comes from an
2ce0: 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72 63 65   external source
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
2d00: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3a  s of the form ":
2d10: 61 61 61 22 20 6f 72 20 22 24 61 61 61 22 20 61  aaa" or "$aaa" a
2d20: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
2d30: 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61  same number.** a
2d40: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69  s the previous i
2d50: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73  nstance of the s
2d60: 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f  ame wildcard.  O
2d70: 72 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  r if this is the
2d80: 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e   first.** instan
2d90: 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61  ce of the wildca
2da0: 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71  rd, the next seq
2db0: 75 65 6e 69 61 6c 20 76 61 72 69 61 62 6c 65 20  uenial variable 
2dc0: 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73  number is.** ass
2dd0: 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  igned..*/.void s
2de0: 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e  qlite3ExprAssign
2df0: 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20  VarNumber(Parse 
2e00: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
2e10: 45 78 70 72 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a  Expr){.  Token *
2e20: 70 54 6f 6b 65 6e 3b 0a 20 20 73 71 6c 69 74 65  pToken;.  sqlite
2e30: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
2e40: 64 62 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  db;..  if( pExpr
2e50: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
2e60: 70 54 6f 6b 65 6e 20 3d 20 26 70 45 78 70 72 2d  pToken = &pExpr-
2e70: 3e 74 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74  >token;.  assert
2e80: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29  ( pToken->n>=1 )
2e90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
2ea0: 65 6e 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 61 73  en->z!=0 );.  as
2eb0: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b  sert( pToken->z[
2ec0: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  0]!=0 );.  if( p
2ed0: 54 6f 6b 65 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20  Token->n==1 ){. 
2ee0: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
2ef0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20  f the form "?". 
2f00: 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74   Assign the next
2f10: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
2f20: 20 2a 2f 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   */.    pExpr->i
2f30: 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65  Table = ++pParse
2f40: 2d 3e 6e 56 61 72 3b 0a 20 20 7d 65 6c 73 65 20  ->nVar;.  }else 
2f50: 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d  if( pToken->z[0]
2f60: 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 2f 2a 20  =='?' ){.    /* 
2f70: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
2f80: 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f  form "?nnn".  Co
2f90: 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61  nvert "nnn" to a
2fa0: 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20  n integer and.  
2fb0: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
2fc0: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
2fd0: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  er */.    int i;
2fe0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
2ff0: 6c 65 20 3d 20 69 20 3d 20 61 74 6f 69 28 28 63  le = i = atoi((c
3000: 68 61 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b  har*)&pToken->z[
3010: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 31  1]);.    if( i<1
3020: 20 7c 7c 20 69 3e 53 51 4c 49 54 45 5f 4d 41 58   || i>SQLITE_MAX
3030: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
3040: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3050: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3060: 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  , "variable numb
3070: 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  er must be betwe
3080: 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a  en ?1 and ?%d",.
3090: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
30a0: 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
30b0: 4d 42 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20  MBER);.    }.   
30c0: 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e   if( i>pParse->n
30d0: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Var ){.      pPa
30e0: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a 20  rse->nVar = i;. 
30f0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
3100: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6f    /* Wildcards o
3110: 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61  f the form ":aaa
3120: 22 20 6f 72 20 22 24 61 61 61 22 2e 20 20 52 65  " or "$aaa".  Re
3130: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
3140: 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  iable.    ** num
3150: 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72  ber as the prior
3160: 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74   appearance of t
3170: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72  he same name, or
3180: 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20   if the name.   
3190: 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70   ** has never ap
31a0: 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72  peared before, r
31b0: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
31c0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20  riable number.  
31d0: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20    */.    int i, 
31e0: 6e 3b 0a 20 20 20 20 6e 20 3d 20 70 54 6f 6b 65  n;.    n = pToke
31f0: 6e 2d 3e 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  n->n;.    for(i=
3200: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 61  0; i<pParse->nVa
3210: 72 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  rExpr; i++){.   
3220: 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
3230: 20 20 20 69 66 28 20 28 70 45 20 3d 20 70 50 61     if( (pE = pPa
3240: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 69  rse->apVarExpr[i
3250: 5d 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ])!=0.          
3260: 26 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d  && pE->token.n==
3270: 6e 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 6d  n.          && m
3280: 65 6d 63 6d 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e  emcmp(pE->token.
3290: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29  z, pToken->z, n)
32a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
32b0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
32c0: 45 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  E->iTable;.     
32d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
32e0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
32f0: 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  i>=pParse->nVarE
3300: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 45 78  xpr ){.      pEx
3310: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70  pr->iTable = ++p
3320: 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 20  Parse->nVar;.   
3330: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
3340: 56 61 72 45 78 70 72 3e 3d 70 50 61 72 73 65 2d  VarExpr>=pParse-
3350: 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2d 31  >nVarExprAlloc-1
3360: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
3370: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
3380: 63 20 2b 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61  c += pParse->nVa
3390: 72 45 78 70 72 41 6c 6c 6f 63 20 2b 20 31 30 3b  rExprAlloc + 10;
33a0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
33b0: 3e 61 70 56 61 72 45 78 70 72 20 3d 0a 20 20 20  >apVarExpr =.   
33c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
33d0: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
33e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
33f0: 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
3400: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
3410: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
3420: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78    pParse->nVarEx
3430: 70 72 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70  prAlloc*sizeof(p
3440: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
3450: 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  [0]).           
3460: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
3470: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
3480: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
3490: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
34a0: 65 2d 3e 61 70 56 61 72 45 78 70 72 21 3d 30 20  e->apVarExpr!=0 
34b0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
34c0: 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 70 50 61  e->apVarExpr[pPa
34d0: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 2b 2b 5d  rse->nVarExpr++]
34e0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
34f0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69  }.    }.  } .  i
3500: 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72  f( !pParse->nErr
3510: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72   && pParse->nVar
3520: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49  >SQLITE_MAX_VARI
3530: 41 42 4c 45 5f 4e 55 4d 42 45 52 20 29 7b 0a 20  ABLE_NUMBER ){. 
3540: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3550: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
3560: 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c  many SQL variabl
3570: 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  es");.  }.}../*.
3580: 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64  ** Recursively d
3590: 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73  elete an express
35a0: 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69  ion tree..*/.voi
35b0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  d sqlite3ExprDel
35c0: 65 74 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ete(Expr *p){.  
35d0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
35e0: 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 70 61 6e  n;.  if( p->span
35f0: 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 33 5f 66  .dyn ) sqlite3_f
3600: 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e 73 70  ree((char*)p->sp
3610: 61 6e 2e 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e  an.z);.  if( p->
3620: 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69  token.dyn ) sqli
3630: 74 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29  te3_free((char*)
3640: 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73  p->token.z);.  s
3650: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3660: 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 73 71  (p->pLeft);.  sq
3670: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3680: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 73 71  p->pRight);.  sq
3690: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
36a0: 65 74 65 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20  ete(p->pList);. 
36b0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
36c0: 6c 65 74 65 28 70 2d 3e 70 53 65 6c 65 63 74 29  lete(p->pSelect)
36d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
36e0: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  (p);.}../*.** Th
36f0: 65 20 45 78 70 72 2e 74 6f 6b 65 6e 20 66 69 65  e Expr.token fie
3700: 6c 64 20 6d 69 67 68 74 20 62 65 20 61 20 73 74  ld might be a st
3710: 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 74 68 61  ring literal tha
3720: 74 20 69 73 20 71 75 6f 74 65 64 2e 0a 2a 2a 20  t is quoted..** 
3730: 49 66 20 73 6f 2c 20 72 65 6d 6f 76 65 20 74 68  If so, remove th
3740: 65 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b  e quotation mark
3750: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
3760: 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 73 71  e3DequoteExpr(sq
3770: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
3780: 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48  *p){.  if( ExprH
3790: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c  asAnyProperty(p,
37a0: 20 45 50 5f 44 65 71 75 6f 74 65 64 29 20 29 7b   EP_Dequoted) ){
37b0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
37c0: 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72  .  ExprSetProper
37d0: 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f 74 65  ty(p, EP_Dequote
37e0: 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b  d);.  if( p->tok
37f0: 65 6e 2e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20  en.dyn==0 ){.   
3800: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
3810: 79 28 64 62 2c 20 26 70 2d 3e 74 6f 6b 65 6e 2c  y(db, &p->token,
3820: 20 26 70 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 7d   &p->token);.  }
3830: 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74  .  sqlite3Dequot
3840: 65 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65  e((char*)p->toke
3850: 6e 2e 7a 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n.z);.}.../*.** 
3860: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72  The following gr
3870: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
3880: 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73  make deep copies
3890: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c   of expressions,
38a0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
38b0: 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20  ists, ID lists, 
38c0: 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65  and select state
38d0: 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69  ments.  The copi
38e0: 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c  es can.** be del
38f0: 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20 70  eted (by being p
3900: 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20 72  assed to their r
3910: 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c  espective ...Del
3920: 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a  ete() routines).
3930: 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ** without effec
3940: 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  ting the origina
3950: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  ls..**.** The ex
3960: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49  pression list, I
3970: 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69  D, and source li
3980: 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73 71  sts return by sq
3990: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
39a0: 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64  (),.** sqlite3Id
39b0: 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73  ListDup(), and s
39c0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
39d0: 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75  () can not be fu
39e0: 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a  rther expanded .
39f0: 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ** by subsequent
3a00: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
3a10: 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f  *ListAppend() ro
3a20: 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  utines..**.** An
3a30: 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74 68  y tables that th
3a40: 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  e SrcList might 
3a50: 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74  point to are not
3a60: 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a   duplicated..*/.
3a70: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3a80: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
3a90: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 45 78  , Expr *p){.  Ex
3aa0: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20  pr *pNew;.  if( 
3ab0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
3ac0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
3ad0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
3ae0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
3af0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
3b00: 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70  eturn 0;.  memcp
3b10: 79 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f  y(pNew, p, sizeo
3b20: 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28  f(*pNew));.  if(
3b30: 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29   p->token.z!=0 )
3b40: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  {.    pNew->toke
3b50: 6e 2e 7a 20 3d 20 28 75 38 2a 29 73 71 6c 69 74  n.z = (u8*)sqlit
3b60: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
3b70: 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e  (char*)p->token.
3b80: 7a 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  z, p->token.n);.
3b90: 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e      pNew->token.
3ba0: 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  dyn = 1;.  }else
3bb0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
3bc0: 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29  ew->token.z==0 )
3bd0: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70  ;.  }.  pNew->sp
3be0: 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 70 4e 65 77  an.z = 0;.  pNew
3bf0: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
3c00: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
3c10: 70 4c 65 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  pLeft);.  pNew->
3c20: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
3c30: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
3c40: 52 69 67 68 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  Right);.  pNew->
3c50: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
3c60: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
3c70: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77  ->pList);.  pNew
3c80: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
3c90: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
3ca0: 20 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20   p->pSelect);.  
3cb0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76  return pNew;.}.v
3cc0: 6f 69 64 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e  oid sqlite3Token
3cd0: 43 6f 70 79 28 73 71 6c 69 74 65 33 20 2a 64 62  Copy(sqlite3 *db
3ce0: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f  , Token *pTo, To
3cf0: 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  ken *pFrom){.  i
3d00: 66 28 20 70 54 6f 2d 3e 64 79 6e 20 29 20 73 71  f( pTo->dyn ) sq
3d10: 6c 69 74 65 33 5f 66 72 65 65 28 28 63 68 61 72  lite3_free((char
3d20: 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28  *)pTo->z);.  if(
3d30: 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20   pFrom->z ){.   
3d40: 20 70 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d   pTo->n = pFrom-
3d50: 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d  >n;.    pTo->z =
3d60: 20 28 75 38 2a 29 73 71 6c 69 74 65 33 44 62 53   (u8*)sqlite3DbS
3d70: 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72  trNDup(db, (char
3d80: 2a 29 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f  *)pFrom->z, pFro
3d90: 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 6f 2d 3e  m->n);.    pTo->
3da0: 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  dyn = 1;.  }else
3db0: 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 30  {.    pTo->z = 0
3dc0: 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c 69 73 74  ;.  }.}.ExprList
3dd0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
3de0: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
3df0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a  , ExprList *p){.
3e00: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
3e10: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
3e20: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
3e30: 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e   *pOldItem;.  in
3e40: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
3e50: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
3e60: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
3e70: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
3e80: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
3e90: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
3ea0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69  urn 0;.  pNew->i
3eb0: 45 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70  ECursor = 0;.  p
3ec0: 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65  New->nExpr = pNe
3ed0: 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  w->nAlloc = p->n
3ee0: 45 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  Expr;.  pNew->a 
3ef0: 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65  = pItem = sqlite
3f00: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
3f10: 20 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f    p->nExpr*sizeo
3f20: 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  f(p->a[0]) );.  
3f30: 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a  if( pItem==0 ){.
3f40: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3f50: 28 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75  (pNew);.    retu
3f60: 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c  rn 0;.  } .  pOl
3f70: 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20  dItem = p->a;.  
3f80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45  for(i=0; i<p->nE
3f90: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
3fa0: 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a  +, pOldItem++){.
3fb0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
3fc0: 70 72 2c 20 2a 70 4f 6c 64 45 78 70 72 3b 0a 20  pr, *pOldExpr;. 
3fd0: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
3fe0: 3d 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c  = pNewExpr = sql
3ff0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
4000: 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49  pOldExpr = pOldI
4010: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
4020: 20 69 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e 73   if( pOldExpr->s
4030: 70 61 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65 77  pan.z!=0 && pNew
4040: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Expr ){.      /*
4050: 20 41 6c 77 61 79 73 20 6d 61 6b 65 20 61 20 63   Always make a c
4060: 6f 70 79 20 6f 66 20 74 68 65 20 73 70 61 6e 20  opy of the span 
4070: 66 6f 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78  for top-level ex
4080: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
4090: 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
40a0: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65 20  sion list.  The 
40b0: 6c 6f 67 69 63 20 69 6e 20 53 45 4c 45 43 54 20  logic in SELECT 
40c0: 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20  processing that 
40d0: 64 65 74 65 72 6d 69 6e 65 73 0a 20 20 20 20 20  determines.     
40e0: 20 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66   ** the names of
40f0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
4100: 72 65 73 75 6c 74 20 73 65 74 20 6e 65 65 64 73  result set needs
4110: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
4120: 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  n */.      sqlit
4130: 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20  e3TokenCopy(db, 
4140: 26 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c  &pNewExpr->span,
4150: 20 26 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e   &pOldExpr->span
4160: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
4170: 65 72 74 28 20 70 4e 65 77 45 78 70 72 3d 3d 30  ert( pNewExpr==0
4180: 20 7c 7c 20 70 4e 65 77 45 78 70 72 2d 3e 73 70   || pNewExpr->sp
4190: 61 6e 2e 7a 21 3d 30 20 0a 20 20 20 20 20 20 20  an.z!=0 .       
41a0: 20 20 20 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72       || pOldExpr
41b0: 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 0a 20 20 20 20  ->span.z==0.    
41c0: 20 20 20 20 20 20 20 20 7c 7c 20 64 62 2d 3e 6d          || db->m
41d0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
41e0: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
41f0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
4200: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
4210: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65  zName);.    pIte
4220: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70  m->sortOrder = p
4230: 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  OldItem->sortOrd
4240: 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69  er;.    pItem->i
4250: 73 41 67 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  sAgg = pOldItem-
4260: 3e 69 73 41 67 67 3b 0a 20 20 20 20 70 49 74 65  >isAgg;.    pIte
4270: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  m->done = 0;.  }
4280: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
4290: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73  }../*.** If curs
42a0: 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76  ors, triggers, v
42b0: 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
42c0: 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74  ies are all omit
42d0: 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
42e0: 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65  build, then none
42f0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
4300: 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65  g routines, exce
4310: 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74  pt for .** sqlit
4320: 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63  e3SelectDup(), c
4330: 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71  an be called. sq
4340: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
4350: 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a   is sometimes.**
4360: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e   called with a N
4370: 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ULL argument..*/
4380: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
4390: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
43a0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
43b0: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
43c0: 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28   \. || !defined(
43d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
43e0: 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73  UERY).SrcList *s
43f0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
4400: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
4410: 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 53 72 63  cList *p){.  Src
4420: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
4430: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  t i;.  int nByte
4440: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
4450: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65  eturn 0;.  nByte
4460: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20   = sizeof(*p) + 
4470: 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a  (p->nSrc>0 ? siz
4480: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
4490: 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b  p->nSrc-1) : 0);
44a0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
44b0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
44c0: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
44d0: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
44e0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63   0;.  pNew->nSrc
44f0: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
4500: 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72  = p->nSrc;.  for
4510: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b  (i=0; i<p->nSrc;
4520: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
4530: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
4540: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
4550: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
4560: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
4570: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
4580: 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  a[i];.    Table 
4590: 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49  *pTab;.    pNewI
45a0: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
45b0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
45c0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
45d0: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70  Database);.    p
45e0: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
45f0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
4600: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
4610: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
4620: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
4630: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
4640: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69  , pOldItem->zAli
4650: 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  as);.    pNewIte
4660: 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f  m->jointype = pO
4670: 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ldItem->jointype
4680: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
4690: 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74  iCursor = pOldIt
46a0: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
46b0: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 50 6f 70   pNewItem->isPop
46c0: 75 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49 74 65  ulated = pOldIte
46d0: 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 3b 0a  m->isPopulated;.
46e0: 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49      pTab = pNewI
46f0: 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64  tem->pTab = pOld
4700: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
4710: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
4720: 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
4730: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74      }.    pNewIt
4740: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  em->pSelect = sq
4750: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
4760: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65  b, pOldItem->pSe
4770: 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e 65 77 49  lect);.    pNewI
4780: 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74  tem->pOn = sqlit
4790: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
47a0: 6c 64 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20  ldItem->pOn);.  
47b0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69    pNewItem->pUsi
47c0: 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69  ng = sqlite3IdLi
47d0: 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  stDup(db, pOldIt
47e0: 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20  em->pUsing);.   
47f0: 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73   pNewItem->colUs
4800: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63  ed = pOldItem->c
4810: 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65  olUsed;.  }.  re
4820: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c  turn pNew;.}.IdL
4830: 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
4840: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
4850: 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20  b, IdList *p){. 
4860: 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20   IdList *pNew;. 
4870: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
4880: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4890: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
48a0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
48b0: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
48c0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
48d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
48e0: 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d 3e 6e 41  ->nId = pNew->nA
48f0: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20  lloc = p->nId;. 
4900: 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74   pNew->a = sqlit
4910: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
4920: 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28  , p->nId*sizeof(
4930: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
4940: 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a  ( pNew->a==0 ){.
4950: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4960: 28 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75  (pNew);.    retu
4970: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
4980: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69  i=0; i<p->nId; i
4990: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
49a0: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  IdList_item *pNe
49b0: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
49c0: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
49d0: 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  IdList_item *pOl
49e0: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
49f0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
4a00: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
4a10: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
4a20: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
4a30: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20    pNewItem->idx 
4a40: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b  = pOldItem->idx;
4a50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
4a60: 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71  ew;.}.Select *sq
4a70: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
4a80: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
4a90: 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74  ct *p){.  Select
4aa0: 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d   *pNew;.  if( p=
4ab0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4ac0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
4ad0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
4ae0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
4af0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
4b00: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69  urn 0;.  pNew->i
4b10: 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
4b20: 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65  sDistinct;.  pNe
4b30: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  w->pEList = sqli
4b40: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
4b50: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  b, p->pEList);. 
4b60: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71   pNew->pSrc = sq
4b70: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
4b80: 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20  db, p->pSrc);.  
4b90: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73  pNew->pWhere = s
4ba0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
4bb0: 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  , p->pWhere);.  
4bc0: 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
4bd0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4be0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75  Dup(db, p->pGrou
4bf0: 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  pBy);.  pNew->pH
4c00: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
4c10: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48  xprDup(db, p->pH
4c20: 61 76 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e  aving);.  pNew->
4c30: 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
4c40: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
4c50: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
4c60: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e    pNew->op = p->
4c70: 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69  op;.  pNew->pPri
4c80: 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  or = sqlite3Sele
4c90: 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72  ctDup(db, p->pPr
4ca0: 69 6f 72 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  ior);.  pNew->pL
4cb0: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
4cc0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69  prDup(db, p->pLi
4cd0: 6d 69 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  mit);.  pNew->pO
4ce0: 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45  ffset = sqlite3E
4cf0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  xprDup(db, p->pO
4d00: 66 66 73 65 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  ffset);.  pNew->
4d10: 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70  iLimit = -1;.  p
4d20: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d  New->iOffset = -
4d30: 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 52 65 73  1;.  pNew->isRes
4d40: 6f 6c 76 65 64 20 3d 20 70 2d 3e 69 73 52 65 73  olved = p->isRes
4d50: 6f 6c 76 65 64 3b 0a 20 20 70 4e 65 77 2d 3e 69  olved;.  pNew->i
4d60: 73 41 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b  sAgg = p->isAgg;
4d70: 0a 20 20 70 4e 65 77 2d 3e 75 73 65 73 45 70 68  .  pNew->usesEph
4d80: 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 64  m = 0;.  pNew->d
4d90: 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20 3d  isallowOrderBy =
4da0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67   0;.  pNew->pRig
4db0: 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e  htmost = 0;.  pN
4dc0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
4dd0: 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [0] = -1;.  pNew
4de0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
4df0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
4e00: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
4e10: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  = -1;.  return p
4e20: 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c  New;.}.#else.Sel
4e30: 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65  ect *sqlite3Sele
4e40: 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  ctDup(sqlite3 *d
4e50: 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  b, Select *p){. 
4e60: 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b   assert( p==0 );
4e70: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
4e80: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  endif.../*.** Ad
4e90: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
4ea0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e  to the end of an
4eb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
4ec0: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a  .  If pList is.*
4ed0: 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c  * initially NULL
4ee0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
4ef0: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  new expression l
4f00: 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74  ist..*/.ExprList
4f10: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
4f20: 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65  tAppend(.  Parse
4f30: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
4f40: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
4f50: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
4f60: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
4f70: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
4f80: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
4f90: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
4fa0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
4fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
4fc0: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70  ression to be ap
4fd0: 70 65 6e 64 65 64 20 2a 2f 0a 20 20 54 6f 6b 65  pended */.  Toke
4fe0: 6e 20 2a 70 4e 61 6d 65 20 20 20 20 20 20 20 20  n *pName        
4ff0: 20 20 20 20 2f 2a 20 41 53 20 6b 65 79 77 6f 72      /* AS keywor
5000: 64 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  d for the expres
5010: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  sion */.){.  sql
5020: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
5030: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69  e->db;.  if( pLi
5040: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
5050: 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
5060: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
5070: 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b  eof(ExprList) );
5080: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
5090: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
50a0: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
50b0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
50c0: 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  >nAlloc==0 );.  
50d0: 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e  }.  if( pList->n
50e0: 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45  Alloc<=pList->nE
50f0: 78 70 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63  xpr ){.    struc
5100: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
5110: 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  *a;.    int n = 
5120: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20  pList->nAlloc*2 
5130: 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c  + 4;.    a = sql
5140: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
5150: 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69  , pList->a, n*si
5160: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
5170: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30  ));.    if( a==0
5180: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e   ){.      goto n
5190: 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  o_mem;.    }.   
51a0: 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20   pList->a = a;. 
51b0: 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
51c0: 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = n;.  }.  asse
51d0: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
51e0: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 7c  );.  if( pExpr |
51f0: 7c 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73  | pName ){.    s
5200: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
5210: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c  tem *pItem = &pL
5220: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
5230: 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73  xpr++];.    mems
5240: 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a  et(pItem, 0, siz
5250: 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20  eof(*pItem));.  
5260: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
5270: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
5280: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
5290: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
52a0: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a  pr = pExpr;.  }.
52b0: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
52c0: 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20  .no_mem:     .  
52d0: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
52e0: 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f   memory if mallo
52f0: 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f  c has failed. */
5300: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
5310: 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 20 20 73  lete(pExpr);.  s
5320: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
5330: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72  lete(pList);.  r
5340: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
5350: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
5360: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
5370: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
5380: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
5390: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
53a0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
53b0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
53c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
53d0: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
53e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
53f0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
5400: 2c 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 2c 0a  ,.  int iLimit,.
5410: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
5420: 62 6a 65 63 74 0a 29 7b 0a 20 20 69 66 28 20 70  bject.){.  if( p
5430: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
5440: 3e 6e 45 78 70 72 3e 69 4c 69 6d 69 74 20 29 7b  >nExpr>iLimit ){
5450: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
5460: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
5470: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
5480: 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b  n %s", zObject);
5490: 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65 66  .  }.}...#if def
54a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
54b0: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
54c0: 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 20  EXPR_DEPTH>0./* 
54d0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  The following th
54e0: 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68  ree functions, h
54f0: 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68  eightOfExpr(), h
5500: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
5510: 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f  ).** and heightO
5520: 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75  fSelect(), are u
5530: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
5540: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
5550: 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78  ght.** of any ex
5560: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
5570: 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20  ferenced by the 
5580: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
5590: 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   as the.** first
55a0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
55b0: 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d   If this maximum
55c0: 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74   height is great
55d0: 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
55e0: 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65  ent value pointe
55f0: 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69  d.** to by pnHei
5600: 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  ght, the second 
5610: 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20  parameter, then 
5620: 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f  set *pnHeight to
5630: 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a   that.** value..
5640: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
5650: 65 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72  eightOfExpr(Expr
5660: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
5670: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
5680: 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67      if( p->nHeig
5690: 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a  ht>*pnHeight ){.
56a0: 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20        *pnHeight 
56b0: 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20  = p->nHeight;.  
56c0: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
56d0: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
56e0: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
56f0: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
5700: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
5710: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
5720: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
5730: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68  r; i++){.      h
5740: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61  eightOfExpr(p->a
5750: 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69  [i].pExpr, pnHei
5760: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ght);.    }.  }.
5770: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
5780: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c  ightOfSelect(Sel
5790: 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  ect *p, int *pnH
57a0: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
57b0: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  ){.    heightOfE
57c0: 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70  xpr(p->pWhere, p
57d0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
57e0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48  ightOfExpr(p->pH
57f0: 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29  aving, pnHeight)
5800: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5810: 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e  pr(p->pLimit, pn
5820: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5830: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66  ghtOfExpr(p->pOf
5840: 66 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  fset, pnHeight);
5850: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5860: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
5870: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5880: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5890: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e  (p->pGroupBy, pn
58a0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
58b0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
58c0: 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69  >pOrderBy, pnHei
58d0: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
58e0: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69  OfSelect(p->pPri
58f0: 6f 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  or, pnHeight);. 
5900: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
5910: 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74  the Expr.nHeight
5920: 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65   variable in the
5930: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
5940: 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75  d as an .** argu
5950: 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73  ment. An express
5960: 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c  ion with no chil
5970: 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74  dren, Expr.pList
5980: 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65   or .** Expr.pSe
5990: 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20  lect member has 
59a0: 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41  a height of 1. A
59b0: 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  ny other express
59c0: 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69  ion.** has a hei
59d0: 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65  ght equal to the
59e0: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
59f0: 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a  of any other .**
5a00: 20 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72   referenced Expr
5a10: 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 76 6f   plus one..*/.vo
5a20: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65  id sqlite3ExprSe
5a30: 74 48 65 69 67 68 74 28 45 78 70 72 20 2a 70 29  tHeight(Expr *p)
5a40: 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20  {.  int nHeight 
5a50: 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45  = 0;.  heightOfE
5a60: 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e  xpr(p->pLeft, &n
5a70: 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68  Height);.  heigh
5a80: 74 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68  tOfExpr(p->pRigh
5a90: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
5aa0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5ab0: 28 70 2d 3e 70 4c 69 73 74 2c 20 26 6e 48 65 69  (p->pList, &nHei
5ac0: 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66  ght);.  heightOf
5ad0: 53 65 6c 65 63 74 28 70 2d 3e 70 53 65 6c 65 63  Select(p->pSelec
5ae0: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
5af0: 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65  p->nHeight = nHe
5b00: 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ight + 1;.}../*.
5b10: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61  ** Return the ma
5b20: 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20  ximum height of 
5b30: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  any expression t
5b40: 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a  ree referenced.*
5b50: 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63 74 20  * by the select 
5b60: 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
5b70: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
5b80: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
5b90: 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
5ba0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
5bb0: 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20  t nHeight = 0;. 
5bc0: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5bd0: 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  p, &nHeight);.  
5be0: 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a  return nHeight;.
5bf0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5c00: 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
5c10: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
5c20: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5c30: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
5c40: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
5c50: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
5c60: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
5c70: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
5c80: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
5c90: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  n;.  assert( pLi
5ca0: 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c 69  st->a!=0 || (pLi
5cb0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26 20  st->nExpr==0 && 
5cc0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30  pList->nAlloc==0
5cd0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
5ce0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69  List->nExpr<=pLi
5cf0: 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20  st->nAlloc );.  
5d00: 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
5d10: 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
5d20: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
5d30: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
5d40: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 49  te3ExprDelete(pI
5d50: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
5d60: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
5d70: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  tem->zName);.  }
5d80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
5d90: 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
5da0: 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74 29  ite3_free(pList)
5db0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
5dc0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
5dd0: 65 65 2e 20 20 43 61 6c 6c 20 78 46 75 6e 63 20  ee.  Call xFunc 
5de0: 66 6f 72 20 65 61 63 68 20 6e 6f 64 65 20 76 69  for each node vi
5df0: 73 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  sited..**.** The
5e00: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   return value fr
5e10: 6f 6d 20 78 46 75 6e 63 20 64 65 74 65 72 6d 69  om xFunc determi
5e20: 6e 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20  nes whether the 
5e30: 74 72 65 65 20 77 61 6c 6b 20 63 6f 6e 74 69 6e  tree walk contin
5e40: 75 65 73 2e 0a 2a 2a 20 30 20 6d 65 61 6e 73 20  ues..** 0 means 
5e50: 63 6f 6e 74 69 6e 75 65 20 77 61 6c 6b 69 6e 67  continue walking
5e60: 20 74 68 65 20 74 72 65 65 2e 20 20 31 20 6d 65   the tree.  1 me
5e70: 61 6e 73 20 64 6f 20 6e 6f 74 20 77 61 6c 6b 20  ans do not walk 
5e80: 63 68 69 6c 64 72 65 6e 0a 2a 2a 20 6f 66 20 74  children.** of t
5e90: 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 20  he current node 
5ea0: 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 77 69 74  but continue wit
5eb0: 68 20 73 69 62 6c 69 6e 67 73 2e 20 20 32 20 6d  h siblings.  2 m
5ec0: 65 61 6e 73 20 61 62 61 6e 64 6f 6e 0a 2a 2a 20  eans abandon.** 
5ed0: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 20 63 6f  the tree walk co
5ee0: 6d 70 6c 65 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  mpletely..**.** 
5ef0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
5f00: 20 66 72 6f 6d 20 74 68 69 73 20 72 6f 75 74 69   from this routi
5f10: 6e 65 20 69 73 20 31 20 74 6f 20 61 62 61 6e 64  ne is 1 to aband
5f20: 6f 6e 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  on the tree walk
5f30: 0a 2a 2a 20 61 6e 64 20 30 20 74 6f 20 63 6f 6e  .** and 0 to con
5f40: 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 54  tinue..**.** NOT
5f50: 49 43 45 3a 20 20 54 68 69 73 20 72 6f 75 74 69  ICE:  This routi
5f60: 6e 65 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 64 65  ne does *not* de
5f70: 73 63 65 6e 64 20 69 6e 74 6f 20 73 75 62 71 75  scend into subqu
5f80: 65 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  eries..*/.static
5f90: 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c 69 73   int walkExprLis
5fa0: 74 28 45 78 70 72 4c 69 73 74 20 2a 2c 20 69 6e  t(ExprList *, in
5fb0: 74 20 28 2a 29 28 76 6f 69 64 20 2a 2c 20 45 78  t (*)(void *, Ex
5fc0: 70 72 2a 29 2c 20 76 6f 69 64 20 2a 29 3b 0a 73  pr*), void *);.s
5fd0: 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78  tatic int walkEx
5fe0: 70 72 54 72 65 65 28 45 78 70 72 20 2a 70 45 78  prTree(Expr *pEx
5ff0: 70 72 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63 29  pr, int (*xFunc)
6000: 28 76 6f 69 64 2a 2c 45 78 70 72 2a 29 2c 20 76  (void*,Expr*), v
6010: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e  oid *pArg){.  in
6020: 74 20 72 63 3b 0a 20 20 69 66 28 20 70 45 78 70  t rc;.  if( pExp
6030: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
6040: 0a 20 20 72 63 20 3d 20 28 2a 78 46 75 6e 63 29  .  rc = (*xFunc)
6050: 28 70 41 72 67 2c 20 70 45 78 70 72 29 3b 0a 20  (pArg, pExpr);. 
6060: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
6070: 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72    if( walkExprTr
6080: 65 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  ee(pExpr->pLeft,
6090: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20   xFunc, pArg) ) 
60a0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
60b0: 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70  ( walkExprTree(p
60c0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 78 46  Expr->pRight, xF
60d0: 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74  unc, pArg) ) ret
60e0: 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 77  urn 1;.    if( w
60f0: 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 45 78 70  alkExprList(pExp
6100: 72 2d 3e 70 4c 69 73 74 2c 20 78 46 75 6e 63 2c  r->pList, xFunc,
6110: 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   pArg) ) return 
6120: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
6130: 72 63 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rc>1;.}../*.** C
6140: 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54 72 65 65  all walkExprTree
6150: 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70  () for every exp
6160: 72 65 73 73 69 6f 6e 20 69 6e 20 6c 69 73 74 20  ression in list 
6170: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
6180: 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 45 78   walkExprList(Ex
6190: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 28  prList *p, int (
61a0: 2a 78 46 75 6e 63 29 28 76 6f 69 64 20 2a 2c 20  *xFunc)(void *, 
61b0: 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41  Expr*), void *pA
61c0: 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rg){.  int i;.  
61d0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
61e0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
61f0: 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30  f( !p ) return 0
6200: 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 45 78  ;.  for(i=p->nEx
6210: 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 61 3b 20  pr, pItem=p->a; 
6220: 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
6230: 2b 29 7b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b  +){.    if( walk
6240: 45 78 70 72 54 72 65 65 28 70 49 74 65 6d 2d 3e  ExprTree(pItem->
6250: 70 45 78 70 72 2c 20 78 46 75 6e 63 2c 20 70 41  pExpr, xFunc, pA
6260: 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  rg) ) return 1;.
6270: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
6280: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61  }../*.** Call wa
6290: 6c 6b 45 78 70 72 54 72 65 65 28 29 20 66 6f 72  lkExprTree() for
62a0: 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
62b0: 6e 20 69 6e 20 53 65 6c 65 63 74 20 70 2c 20 6e  n in Select p, n
62c0: 6f 74 20 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20  ot including.** 
62d0: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
62e0: 20 61 72 65 20 70 61 72 74 20 6f 66 20 73 75 62   are part of sub
62f0: 2d 73 65 6c 65 63 74 73 20 69 6e 20 61 6e 79 20  -selects in any 
6300: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 72 20 74  FROM clause or t
6310: 68 65 20 4c 49 4d 49 54 0a 2a 2a 20 6f 72 20 4f  he LIMIT.** or O
6320: 46 46 53 45 54 20 65 78 70 72 65 73 73 69 6f 6e  FFSET expression
6330: 73 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  s...*/.static in
6340: 74 20 77 61 6c 6b 53 65 6c 65 63 74 45 78 70 72  t walkSelectExpr
6350: 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
6360: 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 20 2a 2c  (*xFunc)(void *,
6370: 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70   Expr*), void *p
6380: 41 72 67 29 7b 0a 20 20 77 61 6c 6b 45 78 70 72  Arg){.  walkExpr
6390: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
63a0: 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20  xFunc, pArg);.  
63b0: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2d 3e  walkExprTree(p->
63c0: 70 57 68 65 72 65 2c 20 78 46 75 6e 63 2c 20 70  pWhere, xFunc, p
63d0: 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72  Arg);.  walkExpr
63e0: 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79  List(p->pGroupBy
63f0: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a  , xFunc, pArg);.
6400: 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70    walkExprTree(p
6410: 2d 3e 70 48 61 76 69 6e 67 2c 20 78 46 75 6e 63  ->pHaving, xFunc
6420: 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45  , pArg);.  walkE
6430: 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65  xprList(p->pOrde
6440: 72 42 79 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  rBy, xFunc, pArg
6450: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  );.  if( p->pPri
6460: 6f 72 20 29 7b 0a 20 20 20 20 77 61 6c 6b 53 65  or ){.    walkSe
6470: 6c 65 63 74 45 78 70 72 28 70 2d 3e 70 50 72 69  lectExpr(p->pPri
6480: 6f 72 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  or, xFunc, pArg)
6490: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
64a0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
64b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69   routine is desi
64c0: 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e 63  gned as an xFunc
64d0: 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65   for walkExprTre
64e0: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 70 41 72 67 20  e()..**.** pArg 
64f0: 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e  is really a poin
6500: 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ter to an intege
6510: 72 2e 20 20 49 66 20 77 65 20 63 61 6e 20 74 65  r.  If we can te
6520: 6c 6c 20 62 79 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  ll by looking.**
6530: 20 61 74 20 70 45 78 70 72 20 74 68 61 74 20 74   at pExpr that t
6540: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
6550: 61 74 20 63 6f 6e 74 61 69 6e 73 20 70 45 78 70  at contains pExp
6560: 72 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74  r is not a const
6570: 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ant.** expressio
6580: 6e 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 41 72  n, then set *pAr
6590: 67 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72  g to 0 and retur
65a0: 6e 20 32 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74  n 2 to abandon t
65b0: 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a  he tree walk..**
65c0: 20 49 66 20 70 45 78 70 72 20 64 6f 65 73 20 64   If pExpr does d
65d0: 6f 65 73 20 6e 6f 74 20 64 69 73 71 75 61 6c 69  oes not disquali
65e0: 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  fy the expressio
65f0: 6e 20 66 72 6f 6d 20 62 65 69 6e 67 20 61 20 63  n from being a c
6600: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 65 6e 20  onstant.** then 
6610: 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  do nothing..**.*
6620: 2a 20 41 66 74 65 72 20 77 61 6c 6b 69 6e 67 20  * After walking 
6630: 74 68 65 20 77 68 6f 6c 65 20 74 72 65 65 2c 20  the whole tree, 
6640: 69 66 20 6e 6f 20 6e 6f 64 65 73 20 61 72 65 20  if no nodes are 
6650: 66 6f 75 6e 64 20 74 68 61 74 20 64 69 73 71 75  found that disqu
6660: 61 6c 69 66 79 0a 2a 2a 20 74 68 65 20 65 78 70  alify.** the exp
6670: 72 65 73 73 69 6f 6e 20 61 73 20 63 6f 6e 73 74  ression as const
6680: 61 6e 74 2c 20 74 68 65 6e 20 77 65 20 61 73 73  ant, then we ass
6690: 75 6d 65 20 74 68 65 20 77 68 6f 6c 65 20 65 78  ume the whole ex
66a0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63  pression.** is c
66b0: 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65 20 73 71  onstant.  See sq
66c0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
66d0: 61 6e 74 28 29 20 66 6f 72 20 61 64 64 69 74 69  ant() for additi
66e0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
66f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6700: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
6710: 6e 74 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45  nt(void *pArg, E
6720: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
6730: 6e 74 20 2a 70 4e 20 3d 20 28 69 6e 74 2a 29 70  nt *pN = (int*)p
6740: 41 72 67 3b 0a 0a 20 20 2f 2a 20 49 66 20 2a 70  Arg;..  /* If *p
6750: 41 72 67 20 69 73 20 33 20 74 68 65 6e 20 61 6e  Arg is 3 then an
6760: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 65 78  y term of the ex
6770: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f  pression that co
6780: 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  mes from.  ** th
6790: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
67a0: 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 20  auses of a join 
67b0: 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65  disqualifies the
67c0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
67d0: 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73   from being cons
67e0: 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e  idered constant.
67f0: 20 2a 2f 0a 20 20 69 66 28 20 28 2a 70 4e 29 3d   */.  if( (*pN)=
6800: 3d 33 20 26 26 20 45 78 70 72 48 61 73 41 6e 79  =3 && ExprHasAny
6810: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
6820: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
6830: 20 20 20 20 2a 70 4e 20 3d 20 30 3b 0a 20 20 20      *pN = 0;.   
6840: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 0a   return 2;.  }..
6850: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
6860: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  >op ){.    /* Co
6870: 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  nsider functions
6880: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
6890: 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67  if all their arg
68a0: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74  uments are const
68b0: 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 2a  ant.    ** and *
68c0: 70 41 72 67 3d 3d 32 20 2a 2f 0a 20 20 20 20 63  pArg==2 */.    c
68d0: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
68e0: 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 4e 29  .      if( (*pN)
68f0: 3d 3d 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==2 ) return 0;.
6900: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
6910: 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73  rough */.    cas
6920: 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73  e TK_ID:.    cas
6930: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  e TK_COLUMN:.   
6940: 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20 20   case TK_DOT:.  
6950: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
6960: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65  NCTION:.    case
6970: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
6980: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6990: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
69a0: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
69b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
69c0: 53 54 53 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20  STS:.#endif.    
69d0: 20 20 2a 70 4e 20 3d 20 30 3b 0a 20 20 20 20 20    *pN = 0;.     
69e0: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 63   return 2;.    c
69f0: 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 20  ase TK_IN:.     
6a00: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
6a10: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ect ){.        *
6a20: 70 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pN = 0;.        
6a30: 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20  return 2;.      
6a40: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  }.    default:. 
6a50: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
6a60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b   }.}../*.** Walk
6a70: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
6a80: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
6a90: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
6aa0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
6ab0: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
6ac0: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
6ad0: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
6ae0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
6af0: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
6b00: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
6b10: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
6b20: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
6b30: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
6b40: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
6b50: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
6b60: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
6b70: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
6b80: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
6b90: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
6ba0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
6bb0: 69 73 43 6f 6e 73 74 20 3d 20 31 3b 0a 20 20 77  isConst = 1;.  w
6bc0: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2c 20 65  alkExprTree(p, e
6bd0: 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
6be0: 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20 20  t, &isConst);.  
6bf0: 72 65 74 75 72 6e 20 69 73 43 6f 6e 73 74 3b 0a  return isConst;.
6c00: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
6c10: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
6c20: 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
6c30: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
6c40: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61   constant.** tha
6c50: 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e  t does no origin
6c60: 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ate from the ON 
6c70: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
6c80: 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52   of a join..** R
6c90: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e  eturn 0 if it in
6ca0: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
6cb0: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
6cc0: 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d  ls or terms from
6cd0: 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49  .** an ON or USI
6ce0: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e  NG clause..*/.in
6cf0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
6d00: 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45  onstantNotJoin(E
6d10: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  xpr *p){.  int i
6d20: 73 43 6f 6e 73 74 20 3d 20 33 3b 0a 20 20 77 61  sConst = 3;.  wa
6d30: 6c 6b 45 78 70 72 54 72 65 65 28 70 2c 20 65 78  lkExprTree(p, ex
6d40: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
6d50: 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20 20 72  , &isConst);.  r
6d60: 65 74 75 72 6e 20 69 73 43 6f 6e 73 74 21 3d 30  eturn isConst!=0
6d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
6d80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
6d90: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
6da0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6db0: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f  is constant.** o
6dc0: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  r a function cal
6dd0: 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20  l with constant 
6de0: 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75  arguments.  Retu
6df0: 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65 72  rn and 0 if ther
6e00: 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72  e.** are any var
6e10: 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  iables..**.** Fo
6e20: 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
6e30: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  f this function,
6e40: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
6e50: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62   string (ex: "ab
6e60: 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  c").** is consid
6e70: 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20  ered a variable 
6e80: 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f  but a single-quo
6e90: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
6ea0: 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63  'abc') is.** a c
6eb0: 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  onstant..*/.int 
6ec0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
6ed0: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
6ee0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
6ef0: 69 73 43 6f 6e 73 74 20 3d 20 32 3b 0a 20 20 77  isConst = 2;.  w
6f00: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2c 20 65  alkExprTree(p, e
6f10: 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
6f20: 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20 20  t, &isConst);.  
6f30: 72 65 74 75 72 6e 20 69 73 43 6f 6e 73 74 21 3d  return isConst!=
6f40: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  0;.}../*.** If t
6f50: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  he expression p 
6f60: 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74  codes a constant
6f70: 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73   integer that is
6f80: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a   small enough.**
6f90: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d   to fit in a 32-
6fa0: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
6fb0: 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68  urn 1 and put th
6fc0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
6fd0: 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56  nteger.** in *pV
6fe0: 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78  alue.  If the ex
6ff0: 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
7000: 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66  an integer or if
7010: 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a   it is too big.*
7020: 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69  * to fit in a si
7030: 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65  gned 32-bit inte
7040: 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e  ger, return 0 an
7050: 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20  d leave *pValue 
7060: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  unchanged..*/.in
7070: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  t sqlite3ExprIsI
7080: 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20  nteger(Expr *p, 
7090: 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20  int *pValue){.  
70a0: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
70b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
70c0: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 66  EGER: {.      if
70d0: 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  ( sqlite3GetInt3
70e0: 32 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65  2((char*)p->toke
70f0: 6e 2e 7a 2c 20 70 56 61 6c 75 65 29 20 29 7b 0a  n.z, pValue) ){.
7100: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
7110: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7120: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7130: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
7140: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  {.      return s
7150: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
7160: 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56  ger(p->pLeft, pV
7170: 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  alue);.    }.   
7180: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
7190: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a   {.      int v;.
71a0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
71b0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
71c0: 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a  ->pLeft, &v) ){.
71d0: 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20          *pValue 
71e0: 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 65  = -v;.        re
71f0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
7200: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7210: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
7220: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
7230: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
7240: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
7250: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
7260: 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75  is a row-id colu
7270: 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20  mn name..*/.int 
7280: 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63  sqlite3IsRowid(c
7290: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
72a0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
72b0: 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22  Cmp(z, "_ROWID_"
72c0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
72d0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
72e0: 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22  rICmp(z, "ROWID"
72f0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
7300: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
7310: 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d  rICmp(z, "OID")=
7320: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
7330: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
7340: 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61  .** Given the na
7350: 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f  me of a column o
7360: 66 20 74 68 65 20 66 6f 72 6d 20 58 2e 59 2e 5a  f the form X.Y.Z
7370: 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20   or Y.Z or just 
7380: 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68  Z, look up.** th
7390: 61 74 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  at name in the s
73a0: 65 74 20 6f 66 20 73 6f 75 72 63 65 20 74 61 62  et of source tab
73b0: 6c 65 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20  les in pSrcList 
73c0: 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 45 78  and make the pEx
73d0: 70 72 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  pr .** expressio
73e0: 6e 20 6e 6f 64 65 20 72 65 66 65 72 20 62 61 63  n node refer bac
73f0: 6b 20 74 6f 20 74 68 61 74 20 73 6f 75 72 63 65  k to that source
7400: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 66 6f   column.  The fo
7410: 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 0a  llowing changes.
7420: 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20 70  ** are made to p
7430: 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70  Expr:.**.**    p
7440: 45 78 70 72 2d 3e 69 44 62 20 20 20 20 20 20 20  Expr->iDb       
7450: 20 20 20 20 53 65 74 20 74 68 65 20 69 6e 64 65      Set the inde
7460: 78 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 6f  x in db->aDb[] o
7470: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
7480: 6f 6c 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  olding.**       
7490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74a0: 20 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20    the table..** 
74b0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
74c0: 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 74          Set to t
74d0: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
74e0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6f   for the table o
74f0: 62 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20  btained.**      
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7510: 20 20 20 66 72 6f 6d 20 70 53 72 63 4c 69 73 74     from pSrcList
7520: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69  ..**    pExpr->i
7530: 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53 65 74  Column       Set
7540: 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e   to the column n
7550: 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 68 65  umber within the
7560: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45   table..**    pE
7570: 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
7580: 20 20 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f 4c     Set to TK_COL
7590: 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72  UMN..**    pExpr
75a0: 2d 3e 70 4c 65 66 74 20 20 20 20 20 20 20 20 20  ->pLeft         
75b0: 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  Any expression t
75c0: 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73  his points to is
75d0: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20 70   deleted.**    p
75e0: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 20 20 20  Expr->pRight    
75f0: 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73 69      Any expressi
7600: 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74  on this points t
7610: 6f 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  o is deleted..**
7620: 0a 2a 2a 20 54 68 65 20 70 44 62 54 6f 6b 65 6e  .** The pDbToken
7630: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
7640: 74 68 65 20 64 61 74 61 62 61 73 65 20 28 74 68  the database (th
7650: 65 20 22 58 22 29 2e 20 20 54 68 69 73 20 76 61  e "X").  This va
7660: 6c 75 65 20 6d 61 79 20 62 65 0a 2a 2a 20 4e 55  lue may be.** NU
7670: 4c 4c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  LL meaning that 
7680: 6e 61 6d 65 20 69 73 20 6f 66 20 74 68 65 20 66  name is of the f
7690: 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20 20 41  orm Y.Z or Z.  A
76a0: 6e 79 20 61 76 61 69 6c 61 62 6c 65 20 64 61 74  ny available dat
76b0: 61 62 61 73 65 0a 2a 2a 20 63 61 6e 20 62 65 20  abase.** can be 
76c0: 75 73 65 64 2e 20 20 54 68 65 20 70 54 61 62 6c  used.  The pTabl
76d0: 65 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e 61  eToken is the na
76e0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
76f0: 28 74 68 65 20 22 59 22 29 2e 20 20 54 68 69 73  (the "Y").  This
7700: 0a 2a 2a 20 76 61 6c 75 65 20 63 61 6e 20 62 65  .** value can be
7710: 20 4e 55 4c 4c 20 69 66 20 70 44 62 54 6f 6b 65   NULL if pDbToke
7720: 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20  n is also NULL. 
7730: 20 49 66 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20   If pTableToken 
7740: 69 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65  is NULL it.** me
7750: 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 6f 72  ans that the for
7760: 6d 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73  m of the name is
7770: 20 5a 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75   Z and that colu
7780: 6d 6e 73 20 66 72 6f 6d 20 61 6e 79 20 74 61 62  mns from any tab
7790: 6c 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  le.** can be use
77a0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
77b0: 6e 61 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20 72  name cannot be r
77c0: 65 73 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67 75  esolved unambigu
77d0: 6f 75 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e 20  ously, leave an 
77e0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
77f0: 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
7800: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  eturn non-zero. 
7810: 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 6f 6e 20   Return zero on 
7820: 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  success..*/.stat
7830: 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d  ic int lookupNam
7840: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
7850: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  se,       /* The
7860: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
7870: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 62   */.  Token *pDb
7880: 54 6f 6b 65 6e 2c 20 20 20 20 20 2f 2a 20 4e 61  Token,     /* Na
7890: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
78a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
78b0: 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ble, or NULL */.
78c0: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 54    Token *pTableT
78d0: 6f 6b 65 6e 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  oken,  /* Name o
78e0: 66 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  f table containi
78f0: 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55  ng column, or NU
7900: 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
7910: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20  ColumnToken, /* 
7920: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
7930: 6d 6e 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  mn. */.  NameCon
7940: 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a  text *pNC,    /*
7950: 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78   The name contex
7960: 74 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76  t used to resolv
7970: 65 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  e the name */.  
7980: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
7990: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69       /* Make thi
79a0: 73 20 45 58 50 52 20 6e 6f 64 65 20 70 6f 69 6e  s EXPR node poin
79b0: 74 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74 65  t to the selecte
79c0: 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20  d column */.){. 
79d0: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 20   char *zDb = 0; 
79e0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
79f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
7a00: 54 68 65 20 22 58 22 20 69 6e 20 58 2e 59 2e 5a  The "X" in X.Y.Z
7a10: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61 62   */.  char *zTab
7a20: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61   = 0;      /* Na
7a30: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  me of the table.
7a40: 20 20 54 68 65 20 22 59 22 20 69 6e 20 58 2e 59    The "Y" in X.Y
7a50: 2e 5a 20 6f 72 20 59 2e 5a 20 2a 2f 0a 20 20 63  .Z or Y.Z */.  c
7a60: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20  har *zCol = 0;  
7a70: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
7a80: 68 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  he column.  The 
7a90: 22 5a 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  "Z" */.  int i, 
7aa0: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
7ab0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
7ac0: 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  /.  int cnt = 0;
7ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7ae0: 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63  er of matching c
7af0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
7b00: 20 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b   int cntTab = 0;
7b10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7b20: 6f 66 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c  of matching tabl
7b30: 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 73 71 6c  e names */.  sql
7b40: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
7b50: 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64  e->db;  /* The d
7b60: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 74 72  atabase */.  str
7b70: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
7b80: 20 2a 70 49 74 65 6d 3b 20 20 20 20 20 20 20 2f   *pItem;       /
7b90: 2a 20 55 73 65 20 66 6f 72 20 6c 6f 6f 70 69 6e  * Use for loopin
7ba0: 67 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20  g over pSrcList 
7bb0: 69 74 65 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63  items */.  struc
7bc0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
7bd0: 70 4d 61 74 63 68 20 3d 20 30 3b 20 20 2f 2a 20  pMatch = 0;  /* 
7be0: 54 68 65 20 6d 61 74 63 68 69 6e 67 20 70 53 72  The matching pSr
7bf0: 63 4c 69 73 74 20 69 74 65 6d 20 2a 2f 0a 20 20  cList item */.  
7c00: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 54 6f  NameContext *pTo
7c10: 70 4e 43 20 3d 20 70 4e 43 3b 20 20 20 20 20 20  pNC = pNC;      
7c20: 20 20 2f 2a 20 46 69 72 73 74 20 6e 61 6d 65 63    /* First namec
7c30: 6f 6e 74 65 78 74 20 69 6e 20 74 68 65 20 6c 69  ontext in the li
7c40: 73 74 20 2a 2f 0a 20 20 53 63 68 65 6d 61 20 2a  st */.  Schema *
7c50: 70 53 63 68 65 6d 61 20 3d 20 30 3b 20 20 20 20  pSchema = 0;    
7c60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 68            /* Sch
7c70: 65 6d 61 20 6f 66 20 74 68 65 20 65 78 70 72 65  ema of the expre
7c80: 73 73 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65  ssion */..  asse
7c90: 72 74 28 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e  rt( pColumnToken
7ca0: 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e   && pColumnToken
7cb0: 2d 3e 7a 20 29 3b 20 2f 2a 20 54 68 65 20 5a 20  ->z ); /* The Z 
7cc0: 69 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e 6f 74 20  in X.Y.Z cannot 
7cd0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 7a 44 62  be NULL */.  zDb
7ce0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
7cf0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44 62 54  omToken(db, pDbT
7d00: 6f 6b 65 6e 29 3b 0a 20 20 7a 54 61 62 20 3d 20  oken);.  zTab = 
7d10: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
7d20: 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 54  oken(db, pTableT
7d30: 6f 6b 65 6e 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20  oken);.  zCol = 
7d40: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
7d50: 6f 6b 65 6e 28 64 62 2c 20 70 43 6f 6c 75 6d 6e  oken(db, pColumn
7d60: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 64 62  Token);.  if( db
7d70: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7d80: 7b 0a 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75  {.    goto looku
7d90: 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  pname_end;.  }..
7da0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
7db0: 3d 20 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 70  = -1;.  while( p
7dc0: 4e 43 20 26 26 20 63 6e 74 3d 3d 30 20 29 7b 0a  NC && cnt==0 ){.
7dd0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
7de0: 4c 69 73 74 3b 0a 20 20 20 20 53 72 63 4c 69 73  List;.    SrcLis
7df0: 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
7e00: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 0a 20 20  C->pSrcList;..  
7e10: 20 20 69 66 28 20 70 53 72 63 4c 69 73 74 20 29    if( pSrcList )
7e20: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c  {.      for(i=0,
7e30: 20 70 49 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d   pItem=pSrcList-
7e40: 3e 61 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  >a; i<pSrcList->
7e50: 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
7e60: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62  ++){.        Tab
7e70: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
7e80: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
7e90: 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b     Column *pCol;
7ea0: 0a 20 20 0a 20 20 20 20 20 20 20 20 70 54 61 62  .  .        pTab
7eb0: 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
7ec0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7ed0: 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  pTab!=0 );.     
7ee0: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
7ef0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
7f00: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
7f10: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
7f20: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29  ( pTab->nCol>0 )
7f30: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 54  ;.        if( zT
7f40: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ab ){.          
7f50: 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  if( pItem->zAlia
7f60: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
7f70: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
7f80: 3d 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b  = pItem->zAlias;
7f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7fa0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
7fb0: 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21  zTabName, zTab)!
7fc0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
7fd0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
7ff0: 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61   *zTabName = pTa
8000: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
8010: 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
8020: 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  me==0 || sqlite3
8030: 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65  StrICmp(zTabName
8040: 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e  , zTab)!=0 ) con
8050: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
8060: 20 20 20 69 66 28 20 7a 44 62 21 3d 30 20 26 26     if( zDb!=0 &&
8070: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
8080: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
8090: 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20  me, zDb)!=0 ){. 
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
80b0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
80c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
80d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
80e0: 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54 61     if( 0==(cntTa
80f0: 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  b++) ){.        
8100: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
8110: 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
8120: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 63 68  ;.          pSch
8130: 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68  ema = pTab->pSch
8140: 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ema;.          p
8150: 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20  Match = pItem;. 
8160: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8170: 20 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70   for(j=0, pCol=p
8180: 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61  Tab->aCol; j<pTa
8190: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43  b->nCol; j++, pC
81a0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
81b0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
81c0: 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c  Cmp(pCol->zName,
81d0: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
81e0: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
81f0: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 54 61  har *zColl = pTa
8200: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c  b->aCol[j].zColl
8210: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 64  ;.            Id
8220: 4c 69 73 74 20 2a 70 55 73 69 6e 67 3b 0a 20 20  List *pUsing;.  
8230: 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b            cnt++;
8240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
8250: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74  pr->iTable = pIt
8260: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
8270: 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20           pMatch 
8280: 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20  = pItem;.       
8290: 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20 70       pSchema = p
82a0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  Tab->pSchema;.  
82b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
82c0: 73 74 69 74 75 74 65 20 74 68 65 20 72 6f 77 69  stitute the rowi
82d0: 64 20 28 63 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f  d (column -1) fo
82e0: 72 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  r the INTEGER PR
82f0: 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20  IMARY KEY */.   
8300: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
8310: 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61  iColumn = j==pTa
8320: 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20  b->iPKey ? -1 : 
8330: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  j;.            p
8340: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Expr->affinity =
8350: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61   pTab->aCol[j].a
8360: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
8370: 20 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d       if( (pExpr-
8380: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
8390: 6f 6c 6c 61 74 65 29 3d 3d 30 20 29 7b 0a 20 20  ollate)==0 ){.  
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
83b0: 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  r->pColl = sqlit
83c0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
83d0: 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
83e0: 2c 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ,-1, 0);.       
83f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8400: 20 20 20 69 66 28 20 69 3c 70 53 72 63 4c 69 73     if( i<pSrcLis
8410: 74 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20  t->nSrc-1 ){.   
8420: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
8430: 49 74 65 6d 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65  Item[1].jointype
8440: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b   & JT_NATURAL ){
8450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8460: 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61 74 63   /* If this matc
8470: 68 20 6f 63 63 75 72 72 65 64 20 69 6e 20 74 68  h occurred in th
8480: 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20  e left table of 
8490: 61 20 6e 61 74 75 72 61 6c 20 6a 6f 69 6e 2c 0a  a natural join,.
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84b0: 2a 2a 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  ** then skip the
84c0: 20 72 69 67 68 74 20 74 61 62 6c 65 20 74 6f 20   right table to 
84d0: 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61 74  avoid a duplicat
84e0: 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  e match */.     
84f0: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
8500: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
8510: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
8520: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
8530: 20 28 70 55 73 69 6e 67 20 3d 20 70 49 74 65 6d   (pUsing = pItem
8540: 5b 31 5d 2e 70 55 73 69 6e 67 29 21 3d 30 20 29  [1].pUsing)!=0 )
8550: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8560: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61 74    /* If this mat
8570: 63 68 20 6f 63 63 75 72 73 20 6f 6e 20 61 20 63  ch occurs on a c
8580: 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 69 6e  olumn that is in
8590: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
85a0: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
85b0: 20 20 2a 2a 20 6f 66 20 61 20 6a 6f 69 6e 2c 20    ** of a join, 
85c0: 73 6b 69 70 20 74 68 65 20 73 65 61 72 63 68 20  skip the search 
85d0: 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
85e0: 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 0a 20  le of the join. 
85f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
8600: 2a 20 74 6f 20 61 76 6f 69 64 20 61 20 64 75 70  * to avoid a dup
8610: 6c 69 63 61 74 65 20 6d 61 74 63 68 20 74 68 65  licate match the
8620: 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  re. */.         
8630: 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
8640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
8650: 72 28 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e 67 2d  r(k=0; k<pUsing-
8660: 3e 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  >nId; k++){.    
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
8680: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
8690: 28 70 55 73 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e  (pUsing->a[k].zN
86a0: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b  ame, zCol)==0 ){
86b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
86c0: 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20       pItem++;.  
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86e0: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
86f0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
8700: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8710: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8720: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8730: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8740: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8750: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
8760: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
8770: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
8780: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8790: 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 2f 2a  T_TRIGGER.    /*
87a0: 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20   If we have not 
87b0: 61 6c 72 65 61 64 79 20 72 65 73 6f 6c 76 65 64  already resolved
87c0: 20 74 68 65 20 6e 61 6d 65 2c 20 74 68 65 6e 20   the name, then 
87d0: 6d 61 79 62 65 20 0a 20 20 20 20 2a 2a 20 69 74  maybe .    ** it
87e0: 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72 20 6f   is a new.* or o
87f0: 6c 64 2e 2a 20 74 72 69 67 67 65 72 20 61 72 67  ld.* trigger arg
8800: 75 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 0a  ument reference.
8810: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a      */.    if( z
8820: 44 62 3d 3d 30 20 26 26 20 7a 54 61 62 21 3d 30  Db==0 && zTab!=0
8830: 20 26 26 20 63 6e 74 3d 3d 30 20 26 26 20 70 50   && cnt==0 && pP
8840: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 21  arse->trigStack!
8850: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 72 69 67  =0 ){.      Trig
8860: 67 65 72 53 74 61 63 6b 20 2a 70 54 72 69 67 67  gerStack *pTrigg
8870: 65 72 53 74 61 63 6b 20 3d 20 70 50 61 72 73 65  erStack = pParse
8880: 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20 20 20  ->trigStack;.   
8890: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
88a0: 20 30 3b 0a 20 20 20 20 20 20 75 33 32 20 2a 70   0;.      u32 *p
88b0: 69 43 6f 6c 4d 61 73 6b 3b 0a 20 20 20 20 20 20  iColMask;.      
88c0: 69 66 28 20 70 54 72 69 67 67 65 72 53 74 61 63  if( pTriggerStac
88d0: 6b 2d 3e 6e 65 77 49 64 78 20 21 3d 20 2d 31 20  k->newIdx != -1 
88e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
88f0: 70 28 22 6e 65 77 22 2c 20 7a 54 61 62 29 20 3d  p("new", zTab) =
8900: 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  = 0 ){.        p
8910: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
8920: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65  TriggerStack->ne
8930: 77 49 64 78 3b 0a 20 20 20 20 20 20 20 20 61 73  wIdx;.        as
8940: 73 65 72 74 28 20 70 54 72 69 67 67 65 72 53 74  sert( pTriggerSt
8950: 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20  ack->pTab );.   
8960: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 72 69       pTab = pTri
8970: 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b  ggerStack->pTab;
8980: 0a 20 20 20 20 20 20 20 20 70 69 43 6f 6c 4d 61  .        piColMa
8990: 73 6b 20 3d 20 26 28 70 54 72 69 67 67 65 72 53  sk = &(pTriggerS
89a0: 74 61 63 6b 2d 3e 6e 65 77 43 6f 6c 4d 61 73 6b  tack->newColMask
89b0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
89c0: 66 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b  f( pTriggerStack
89d0: 2d 3e 6f 6c 64 49 64 78 20 21 3d 20 2d 31 20 26  ->oldIdx != -1 &
89e0: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
89f0: 28 22 6f 6c 64 22 2c 20 7a 54 61 62 29 3d 3d 30  ("old", zTab)==0
8a00: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
8a10: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69  r->iTable = pTri
8a20: 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64  ggerStack->oldId
8a30: 78 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  x;.        asser
8a40: 74 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b  t( pTriggerStack
8a50: 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ->pTab );.      
8a60: 20 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65    pTab = pTrigge
8a70: 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20  rStack->pTab;.  
8a80: 20 20 20 20 20 20 70 69 43 6f 6c 4d 61 73 6b 20        piColMask 
8a90: 3d 20 26 28 70 54 72 69 67 67 65 72 53 74 61 63  = &(pTriggerStac
8aa0: 6b 2d 3e 6f 6c 64 43 6f 6c 4d 61 73 6b 29 3b 0a  k->oldColMask);.
8ab0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
8ac0: 66 28 20 70 54 61 62 20 29 7b 20 0a 20 20 20 20  f( pTab ){ .    
8ad0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20      int iCol;.  
8ae0: 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43        Column *pC
8af0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b  ol = pTab->aCol;
8b00: 0a 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ..        pSchem
8b10: 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  a = pTab->pSchem
8b20: 61 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 54 61  a;.        cntTa
8b30: 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  b++;.        for
8b40: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 20 3c 20  (iCol=0; iCol < 
8b50: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
8b60: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20  ++, pCol++) {.  
8b70: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
8b80: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
8b90: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  >zName, zCol)==0
8ba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8bb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
8bc0: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
8bd0: 43 6f 6c 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  Col].zColl;.    
8be0: 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20          cnt++;. 
8bf0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
8c00: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
8c10: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20  ==pTab->iPKey ? 
8c20: 2d 31 20 3a 20 69 43 6f 6c 3b 0a 20 20 20 20 20  -1 : iCol;.     
8c30: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66         pExpr->af
8c40: 66 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61  finity = pTab->a
8c50: 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69  Col[iCol].affini
8c60: 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ty;.            
8c70: 69 66 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67  if( (pExpr->flag
8c80: 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
8c90: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
8ca0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43         pExpr->pC
8cb0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
8cc0: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
8cd0: 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20  (db), zColl,-1, 
8ce0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
8cf0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  }.            pE
8d00: 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  xpr->pTab = pTab
8d10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
8d20: 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
8d30: 20 20 20 20 20 20 20 20 20 20 20 2a 70 69 43 6f             *piCo
8d40: 6c 4d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31  lMask |= ((u32)1
8d50: 3c 3c 69 43 6f 6c 29 20 7c 20 28 69 43 6f 6c 3e  <<iCol) | (iCol>
8d60: 3d 33 32 3f 30 78 66 66 66 66 66 66 66 66 3a 30  =32?0xffffffff:0
8d70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
8d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
8d90: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
8da0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8db0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  }.    }.#endif /
8dc0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
8dd0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
8de0: 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  */..    /*.    *
8df0: 2a 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 61  * Perhaps the na
8e00: 6d 65 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  me is a referenc
8e10: 65 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20  e to the ROWID. 
8e20: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e     */.    if( cn
8e30: 74 3d 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d  t==0 && cntTab==
8e40: 31 20 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f  1 && sqlite3IsRo
8e50: 77 69 64 28 7a 43 6f 6c 29 20 29 7b 0a 20 20 20  wid(zCol) ){.   
8e60: 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20     cnt = 1;.    
8e70: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
8e80: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 45 78   = -1;.      pEx
8e90: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  pr->affinity = S
8ea0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
8eb0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
8ec0: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 69  .    ** If the i
8ed0: 6e 70 75 74 20 69 73 20 6f 66 20 74 68 65 20 66  nput is of the f
8ee0: 6f 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f  orm Z (not Y.Z o
8ef0: 72 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68  r X.Y.Z) then th
8f00: 65 20 6e 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20  e name Z.    ** 
8f10: 6d 69 67 68 74 20 72 65 66 65 72 20 74 6f 20 61  might refer to a
8f20: 6e 20 72 65 73 75 6c 74 2d 73 65 74 20 61 6c 69  n result-set ali
8f30: 61 73 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  as.  This happen
8f40: 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s, for example, 
8f50: 77 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61  when.    ** we a
8f60: 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d  re resolving nam
8f70: 65 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  es in the WHERE 
8f80: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
8f90: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a  llowing command:
8fa0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
8fb0: 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53     SELECT a+b AS
8fc0: 20 78 20 46 52 4f 4d 20 74 61 62 6c 65 20 57 48   x FROM table WH
8fd0: 45 52 45 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a  ERE x<10;.    **
8fe0: 0a 20 20 20 20 2a 2a 20 49 6e 20 63 61 73 65 73  .    ** In cases
8ff0: 20 6c 69 6b 65 20 74 68 69 73 2c 20 72 65 70 6c   like this, repl
9000: 61 63 65 20 70 45 78 70 72 20 77 69 74 68 20 61  ace pExpr with a
9010: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70   copy of the exp
9020: 72 65 73 73 69 6f 6e 20 74 68 61 74 0a 20 20 20  ression that.   
9030: 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65   ** forms the re
9040: 73 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28  sult set entry (
9050: 22 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61  "a+b" in the exa
9060: 6d 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e  mple) and return
9070: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
9080: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
9090: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  he expression in
90a0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
90b0: 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65  should have alre
90c0: 61 64 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20  ady been.    ** 
90d0: 72 65 73 6f 6c 76 65 64 20 62 79 20 74 68 65 20  resolved by the 
90e0: 74 69 6d 65 20 74 68 65 20 57 48 45 52 45 20 63  time the WHERE c
90f0: 6c 61 75 73 65 20 69 73 20 72 65 73 6f 6c 76 65  lause is resolve
9100: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
9110: 28 20 63 6e 74 3d 3d 30 20 26 26 20 28 70 45 4c  ( cnt==0 && (pEL
9120: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73  ist = pNC->pELis
9130: 74 29 21 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30  t)!=0 && zTab==0
9140: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   ){.      for(j=
9150: 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; j<pEList->nEx
9160: 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
9170: 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45    char *zAs = pE
9180: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
9190: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 41  ;.        if( zA
91a0: 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  s!=0 && sqlite3S
91b0: 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c  trICmp(zAs, zCol
91c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
91d0: 20 20 45 78 70 72 20 2a 70 44 75 70 2c 20 2a 70    Expr *pDup, *p
91e0: 4f 72 69 67 3b 0a 20 20 20 20 20 20 20 20 20 20  Orig;.          
91f0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
9200: 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
9210: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
9220: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
9230: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
9240: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
9250: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 53 65  sert( pExpr->pSe
9260: 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lect==0 );.     
9270: 20 20 20 20 20 70 4f 72 69 67 20 3d 20 70 45 4c       pOrig = pEL
9280: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b  ist->a[j].pExpr;
9290: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
92a0: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 26 26  pNC->allowAgg &&
92b0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
92c0: 28 70 4f 72 69 67 2c 20 45 50 5f 41 67 67 29 20  (pOrig, EP_Agg) 
92d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
92e0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
92f0: 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
9300: 66 20 61 6c 69 61 73 65 64 20 61 67 67 72 65 67  f aliased aggreg
9310: 61 74 65 20 25 73 22 2c 20 7a 41 73 29 3b 0a 20  ate %s", zAs);. 
9320: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
9330: 65 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20  e3_free(zCol);. 
9340: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
9350: 6e 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n 2;.          }
9360: 0a 20 20 20 20 20 20 20 20 20 20 70 44 75 70 20  .          pDup 
9370: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
9380: 28 64 62 2c 20 70 4f 72 69 67 29 3b 0a 20 20 20  (db, pOrig);.   
9390: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
93a0: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
93b0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
93c0: 20 20 20 20 20 20 20 70 44 75 70 2d 3e 70 43 6f         pDup->pCo
93d0: 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c  ll = pExpr->pCol
93e0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  l;.            p
93f0: 44 75 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  Dup->flags |= EP
9400: 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  _ExpCollate;.   
9410: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9420: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 73 70     if( pExpr->sp
9430: 61 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 33  an.dyn ) sqlite3
9440: 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70 45 78  _free((char*)pEx
9450: 70 72 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 20  pr->span.z);.   
9460: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
9470: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71  ->token.dyn ) sq
9480: 6c 69 74 65 33 5f 66 72 65 65 28 28 63 68 61 72  lite3_free((char
9490: 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
94a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
94b0: 63 70 79 28 70 45 78 70 72 2c 20 70 44 75 70 2c  cpy(pExpr, pDup,
94c0: 20 73 69 7a 65 6f 66 28 2a 70 45 78 70 72 29 29   sizeof(*pExpr))
94d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
94e0: 74 65 33 5f 66 72 65 65 28 70 44 75 70 29 3b 0a  te3_free(pDup);.
94f0: 20 20 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20            cnt = 
9500: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61  1;.          pMa
9510: 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
9520: 20 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d     assert( zTab=
9530: 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a  =0 && zDb==0 );.
9540: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6c            goto l
9550: 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3b  ookupname_end_2;
9560: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9570: 20 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   } .    }..    /
9580: 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  * Advance to the
9590: 20 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65   next name conte
95a0: 78 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77 69  xt.  The loop wi
95b0: 6c 6c 20 65 78 69 74 20 77 68 65 6e 20 65 69 74  ll exit when eit
95c0: 68 65 72 0a 20 20 20 20 2a 2a 20 77 65 20 68 61  her.    ** we ha
95d0: 76 65 20 61 20 6d 61 74 63 68 20 28 63 6e 74 3e  ve a match (cnt>
95e0: 30 29 20 6f 72 20 77 68 65 6e 20 77 65 20 72 75  0) or when we ru
95f0: 6e 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f  n out of name co
9600: 6e 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  ntexts..    */. 
9610: 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b     if( cnt==0 ){
9620: 0a 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43  .      pNC = pNC
9630: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
9640: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
9650: 20 58 20 61 6e 64 20 59 20 61 72 65 20 4e 55 4c   X and Y are NUL
9660: 4c 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  L (in other word
9670: 73 20 69 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f  s if only the co
9680: 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20  lumn name Z is. 
9690: 20 2a 2a 20 73 75 70 70 6c 69 65 64 29 20 61 6e   ** supplied) an
96a0: 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 5a  d the value of Z
96b0: 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20   is enclosed in 
96c0: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74  double-quotes, t
96d0: 68 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20  hen.  ** Z is a 
96e0: 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 69  string literal i
96f0: 66 20 69 74 20 64 6f 65 73 6e 27 74 20 6d 61 74  f it doesn't mat
9700: 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61  ch any column na
9710: 6d 65 73 2e 20 20 49 6e 20 74 68 61 74 0a 20 20  mes.  In that.  
9720: 2a 2a 20 63 61 73 65 2c 20 77 65 20 6e 65 65 64  ** case, we need
9730: 20 74 6f 20 72 65 74 75 72 6e 20 72 69 67 68 74   to return right
9740: 20 61 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61   away and not ma
9750: 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74  ke any changes t
9760: 6f 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20  o.  ** pExpr..  
9770: 2a 2a 0a 20 20 2a 2a 20 42 65 63 61 75 73 65 20  **.  ** Because 
9780: 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
9790: 20 6d 61 64 65 20 74 6f 20 6f 75 74 65 72 20 63   made to outer c
97a0: 6f 6e 74 65 78 74 73 2c 20 74 68 65 20 70 4e 43  ontexts, the pNC
97b0: 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c  ->nRef.  ** fiel
97c0: 64 73 20 61 72 65 20 6e 6f 74 20 63 68 61 6e 67  ds are not chang
97d0: 65 64 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78  ed in any contex
97e0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e  t..  */.  if( cn
97f0: 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20  t==0 && zTab==0 
9800: 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d  && pColumnToken-
9810: 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20  >z[0]=='"' ){.  
9820: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9830: 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Col);.    return
9840: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20   0;.  }..  /*.  
9850: 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  ** cnt==0 means 
9860: 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20 6d 61  there was not ma
9870: 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e  tch.  cnt>1 mean
9880: 73 20 74 68 65 72 65 20 77 65 72 65 20 74 77 6f  s there were two
9890: 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61   or.  ** more ma
98a0: 74 63 68 65 73 2e 20 20 45 69 74 68 65 72 20 77  tches.  Either w
98b0: 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e 20 65  ay, we have an e
98c0: 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rror..  */.  if(
98d0: 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20 63   cnt!=1 ){.    c
98e0: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20  har *z = 0;.    
98f0: 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
9900: 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20  zErr = cnt==0 ? 
9910: 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a  "no such column:
9920: 20 25 73 22 20 3a 20 22 61 6d 62 69 67 75 6f 75   %s" : "ambiguou
9930: 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  s column name: %
9940: 73 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20  s";.    if( zDb 
9950: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9960: 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a 44  SetString(&z, zD
9970: 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c 20 22 2e  b, ".", zTab, ".
9980: 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29  ", zCol, (char*)
9990: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  0);.    }else if
99a0: 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( zTab ){.      
99b0: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
99c0: 28 26 7a 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20  (&z, zTab, ".", 
99d0: 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b  zCol, (char*)0);
99e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
99f0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 53 74 72    z = sqlite3Str
9a00: 44 75 70 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d  Dup(zCol);.    }
9a10: 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20  .    if( z ){.  
9a20: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9a30: 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 45 72 72  Msg(pParse, zErr
9a40: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , z);.      sqli
9a50: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20  te3_free(z);.   
9a60: 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b     pTopNC->nErr+
9a70: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
9a80: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
9a90: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  iled = 1;.    }.
9aa0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63    }..  /* If a c
9ab0: 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62  olumn from a tab
9ac0: 6c 65 20 69 6e 20 70 53 72 63 4c 69 73 74 20 69  le in pSrcList i
9ad0: 73 20 72 65 66 65 72 65 6e 63 65 64 2c 20 74 68  s referenced, th
9ae0: 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74  en record.  ** t
9af0: 68 69 73 20 66 61 63 74 20 69 6e 20 74 68 65 20  his fact in the 
9b00: 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c  pSrcList.a[].col
9b10: 55 73 65 64 20 62 69 74 6d 61 73 6b 2e 20 20 43  Used bitmask.  C
9b20: 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65 73 0a 20  olumn 0 causes. 
9b30: 20 2a 2a 20 62 69 74 20 30 20 74 6f 20 62 65 20   ** bit 0 to be 
9b40: 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73  set.  Column 1 s
9b50: 65 74 73 20 62 69 74 20 31 2e 20 20 41 6e 64 20  ets bit 1.  And 
9b60: 73 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 74 68  so forth.  If th
9b70: 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75  e.  ** column nu
9b80: 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20  mber is greater 
9b90: 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  than the number 
9ba0: 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 62  of bits in the b
9bb0: 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e  itmask.  ** then
9bc0: 20 73 65 74 20 74 68 65 20 68 69 67 68 2d 6f 72   set the high-or
9bd0: 64 65 72 20 62 69 74 20 6f 66 20 74 68 65 20 62  der bit of the b
9be0: 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  itmask..  */.  i
9bf0: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
9c00: 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63 68 21 3d  n>=0 && pMatch!=
9c10: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  0 ){.    int n =
9c20: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
9c30: 0a 20 20 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65  .    if( n>=size
9c40: 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 7b  of(Bitmask)*8 ){
9c50: 0a 20 20 20 20 20 20 6e 20 3d 20 73 69 7a 65 6f  .      n = sizeo
9c60: 66 28 42 69 74 6d 61 73 6b 29 2a 38 2d 31 3b 0a  f(Bitmask)*8-1;.
9c70: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
9c80: 28 20 70 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f  ( pMatch->iCurso
9c90: 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r==pExpr->iTable
9ca0: 20 29 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e   );.    pMatch->
9cb0: 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42 69 74  colUsed |= ((Bit
9cc0: 6d 61 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a  mask)1)<<n;.  }.
9cd0: 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a  .lookupname_end:
9ce0: 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61  .  /* Clean up a
9cf0: 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20  nd return.  */. 
9d00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44   sqlite3_free(zD
9d10: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  b);.  sqlite3_fr
9d20: 65 65 28 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69  ee(zTab);.  sqli
9d30: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45  te3ExprDelete(pE
9d40: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70  xpr->pLeft);.  p
9d50: 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b  Expr->pLeft = 0;
9d60: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
9d70: 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67  lete(pExpr->pRig
9d80: 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52  ht);.  pExpr->pR
9d90: 69 67 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70  ight = 0;.  pExp
9da0: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  r->op = TK_COLUM
9db0: 4e 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e  N;.lookupname_en
9dc0: 64 5f 32 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  d_2:.  sqlite3_f
9dd0: 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 69 66 28  ree(zCol);.  if(
9de0: 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 61   cnt==1 ){.    a
9df0: 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b  ssert( pNC!=0 );
9e00: 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68  .    sqlite3Auth
9e10: 52 65 61 64 28 70 50 61 72 73 65 2c 20 70 45 78  Read(pParse, pEx
9e20: 70 72 2c 20 70 53 63 68 65 6d 61 2c 20 70 4e 43  pr, pSchema, pNC
9e30: 2d 3e 70 53 72 63 4c 69 73 74 29 3b 0a 20 20 20  ->pSrcList);.   
9e40: 20 69 66 28 20 70 4d 61 74 63 68 20 26 26 20 21   if( pMatch && !
9e50: 70 4d 61 74 63 68 2d 3e 70 53 65 6c 65 63 74 20  pMatch->pSelect 
9e60: 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
9e70: 70 54 61 62 20 3d 20 70 4d 61 74 63 68 2d 3e 70  pTab = pMatch->p
9e80: 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  Tab;.    }.    /
9e90: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
9ea0: 6e 52 65 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c  nRef value on al
9eb0: 6c 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20  l name contexts 
9ec0: 66 72 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f  from TopNC up to
9ed0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  .    ** the poin
9ee0: 74 20 77 68 65 72 65 20 74 68 65 20 6e 61 6d 65  t where the name
9ef0: 20 6d 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20   matched. */.   
9f00: 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
9f10: 61 73 73 65 72 74 28 20 70 54 6f 70 4e 43 21 3d  assert( pTopNC!=
9f20: 30 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e  0 );.      pTopN
9f30: 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  C->nRef++;.     
9f40: 20 69 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43   if( pTopNC==pNC
9f50: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
9f60: 70 54 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d  pTopNC = pTopNC-
9f70: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
9f80: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20    return 0;.  } 
9f90: 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
9fa0: 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
9fb0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9fc0: 73 20 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e  s designed as an
9fd0: 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45   xFunc for walkE
9fe0: 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a  xprTree()..**.**
9ff0: 20 52 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69   Resolve symboli
a000: 63 20 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f  c names into TK_
a010: 43 4f 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73  COLUMN operators
a020: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
a030: 0a 2a 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65 20  .** node in the 
a040: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
a050: 20 20 52 65 74 75 72 6e 20 30 20 74 6f 20 63 6f    Return 0 to co
a060: 6e 74 69 6e 75 65 20 74 68 65 20 73 65 61 72 63  ntinue the searc
a070: 68 20 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72  h down.** the tr
a080: 65 65 20 6f 72 20 32 20 74 6f 20 61 62 6f 72 74  ee or 2 to abort
a090: 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a   the tree walk..
a0a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
a0b0: 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 65 72 72  ne also does err
a0c0: 6f 72 20 63 68 65 63 6b 69 6e 67 20 61 6e 64 20  or checking and 
a0d0: 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
a0e0: 66 6f 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  for.** function 
a0f0: 6e 61 6d 65 73 2e 20 20 54 68 65 20 6f 70 65 72  names.  The oper
a100: 61 74 6f 72 20 66 6f 72 20 61 67 67 72 65 67 61  ator for aggrega
a110: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20  te functions is 
a120: 63 68 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b  changed.** to TK
a130: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a  _AGG_FUNCTION..*
a140: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d  /.static int nam
a150: 65 52 65 73 6f 6c 76 65 72 53 74 65 70 28 76 6f  eResolverStep(vo
a160: 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a  id *pArg, Expr *
a170: 70 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f  pExpr){.  NameCo
a180: 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61  ntext *pNC = (Na
a190: 6d 65 43 6f 6e 74 65 78 74 2a 29 70 41 72 67 3b  meContext*)pArg;
a1a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a1b0: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
a1c0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
a1d0: 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29  assert( pNC!=0 )
a1e0: 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43  ;.  pParse = pNC
a1f0: 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28  ->pParse;..  if(
a200: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
a210: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65  rty(pExpr, EP_Re
a220: 73 6f 6c 76 65 64 29 20 29 20 72 65 74 75 72 6e  solved) ) return
a230: 20 31 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f   1;.  ExprSetPro
a240: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
a250: 52 65 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64  Resolved);.#ifnd
a260: 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20  ef NDEBUG.  if( 
a270: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 20 26 26  pNC->pSrcList &&
a280: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e   pNC->pSrcList->
a290: 6e 41 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20  nAlloc>0 ){.    
a2a0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
a2b0: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
a2c0: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
a2d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43    for(i=0; i<pNC
a2e0: 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  ->pSrcList->nSrc
a2f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
a300: 73 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e  sert( pSrcList->
a310: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20  a[i].iCursor>=0 
a320: 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69  && pSrcList->a[i
a330: 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65  ].iCursor<pParse
a340: 2d 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ->nTab);.    }. 
a350: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74   }.#endif.  swit
a360: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
a370: 0a 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71  .    /* Double-q
a380: 75 6f 74 65 64 20 73 74 72 69 6e 67 73 20 28 65  uoted strings (e
a390: 78 3a 20 22 61 62 63 22 29 20 61 72 65 20 75 73  x: "abc") are us
a3a0: 65 64 20 61 73 20 69 64 65 6e 74 69 66 69 65 72  ed as identifier
a3b0: 73 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73  s if.    ** poss
a3c0: 69 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  ible.  Otherwise
a3d0: 20 74 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20   they remain as 
a3e0: 73 74 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65  strings.  Single
a3f0: 2d 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73  -quoted.    ** s
a400: 74 72 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63  trings (ex: 'abc
a410: 27 29 20 61 72 65 20 61 6c 77 61 79 73 20 73 74  ') are always st
a420: 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20  ring literals.. 
a430: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
a440: 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
a450: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
a460: 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20  en.z[0]=='\'' ) 
a470: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20  break;.      /* 
a480: 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  Fall thru into t
a490: 68 65 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66  he TK_ID case if
a4a0: 20 74 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c   this is a doubl
a4b0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
a4c0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  */.    }.    /* 
a4d0: 41 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65  A lone identifie
a4e0: 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
a4f0: 20 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a   a column..    *
a500: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  /.    case TK_ID
a510: 3a 20 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70  : {.      lookup
a520: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20  Name(pParse, 0, 
a530: 30 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  0, &pExpr->token
a540: 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20  , pNC, pExpr);. 
a550: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
a560: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41     }.  .    /* A
a570: 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
a580: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20  column name:    
a590: 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72   ID.ID.    ** Or
a5a0: 20 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62   a database, tab
a5b0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20  le and column:  
a5c0: 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a  ID.ID.ID.    */.
a5d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a      case TK_DOT:
a5e0: 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a   {.      Token *
a5f0: 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54  pColumn;.      T
a600: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20  oken *pTable;.  
a610: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a      Token *pDb;.
a620: 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
a630: 68 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66  ht;..      /* if
a640: 28 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  ( pSrcList==0 ) 
a650: 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20  break; */.      
a660: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
a670: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66  pRight;.      if
a680: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
a690: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _ID ){.        p
a6a0: 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  Db = 0;.        
a6b0: 70 54 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d  pTable = &pExpr-
a6c0: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
a6d0: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d         pColumn =
a6e0: 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b   &pRight->token;
a6f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a700: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
a710: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ight->op==TK_DOT
a720: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20   );.        pDb 
a730: 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = &pExpr->pLeft-
a740: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
a750: 70 54 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74  pTable = &pRight
a760: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
a770: 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20          pColumn 
a780: 3d 20 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68  = &pRight->pRigh
a790: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
a7a0: 7d 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61  }.      lookupNa
a7b0: 6d 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20  me(pParse, pDb, 
a7c0: 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c  pTable, pColumn,
a7d0: 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20   pNC, pExpr);.  
a7e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
a7f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f    }..    /* Reso
a800: 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  lve function nam
a810: 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  es.    */.    ca
a820: 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  se TK_CONST_FUNC
a830: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
a840: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
a850: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
a860: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20  = pExpr->pList; 
a870: 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65     /* The argume
a880: 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20  nt list */.     
a890: 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f   int n = pList ?
a8a0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
a8b0: 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
a8c0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
a8d0: 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f      int no_such_
a8e0: 66 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  func = 0;       
a8f0: 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75  /* True if no su
a900: 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  ch function exis
a910: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
a920: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d  wrong_num_args =
a930: 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
a940: 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  if wrong number 
a950: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
a960: 20 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67        int is_agg
a970: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
a980: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20    /* True if is 
a990: 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  an aggregate fun
a9a0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ction */.      i
a9b0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
a9c0: 61 75 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  auth;           
a9d0: 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 68 6f          /* Autho
a9e0: 72 69 7a 61 74 69 6f 6e 20 74 6f 20 75 73 65 20  rization to use 
a9f0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
aa00: 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20        int nId;  
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
aa30: 68 61 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e  haracters in fun
aa40: 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
aa50: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
aa60: 7a 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  zId;            
aa70: 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
aa80: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46  name. */.      F
aa90: 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20  uncDef *pDef;   
aaa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
aab0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
aac0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
aad0: 20 20 20 20 20 20 69 6e 74 20 65 6e 63 20 3d 20        int enc = 
aae0: 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
aaf0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
ab00: 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20  e encoding */.. 
ab10: 20 20 20 20 20 7a 49 64 20 3d 20 28 63 68 61 72       zId = (char
ab20: 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
ab30: 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45  ;.      nId = pE
ab40: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20  xpr->token.n;.  
ab50: 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
ab60: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
ab70: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20  Parse->db, zId, 
ab80: 6e 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b  nId, n, enc, 0);
ab90: 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
aba0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  =0 ){.        pD
abb0: 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
abc0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
abd0: 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d  >db, zId, nId, -
abe0: 31 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  1, enc, 0);.    
abf0: 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
ac00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f  ){.          no_
ac10: 73 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20  such_func = 1;. 
ac20: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ac30: 20 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75          wrong_nu
ac40: 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20  m_args = 1;.    
ac50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
ac60: 65 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67  e{.        is_ag
ac70: 67 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d  g = pDef->xFunc=
ac80: 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  =0;.      }.#ifn
ac90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
aca0: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
acb0: 20 20 20 20 69 66 28 20 70 44 65 66 20 29 7b 0a      if( pDef ){.
acc0: 20 20 20 20 20 20 20 20 61 75 74 68 20 3d 20 73          auth = s
acd0: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
ace0: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 46  pParse, SQLITE_F
acf0: 55 4e 43 54 49 4f 4e 2c 20 30 2c 20 70 44 65 66  UNCTION, 0, pDef
ad00: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
ad10: 20 20 20 20 20 69 66 28 20 61 75 74 68 21 3d 53       if( auth!=S
ad20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ad30: 20 20 20 20 20 20 69 66 28 20 61 75 74 68 3d 3d        if( auth==
ad40: 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20  SQLITE_DENY ){. 
ad50: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ad60: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
ad70: 65 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a  e, "not authoriz
ad80: 65 64 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69  ed to use functi
ad90: 6f 6e 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20  on: %s",.       
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
adc0: 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  f->zName);.     
add0: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
ade0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
adf0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
ae00: 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
ae10: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
ae20: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
ae30: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
ae40: 20 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20    if( is_agg && 
ae50: 21 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 29  !pNC->allowAgg )
ae60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ae70: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
ae80: 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67  , "misuse of agg
ae90: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
aea0: 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64  %.*s()", nId,zId
aeb0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e  );.        pNC->
aec0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
aed0: 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20  is_agg = 0;.    
aee0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73    }else if( no_s
aef0: 75 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20  uch_func ){.    
af00: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
af10: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
af20: 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25  such function: %
af30: 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b  .*s", nId, zId);
af40: 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45  .        pNC->nE
af50: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rr++;.      }els
af60: 65 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f  e if( wrong_num_
af70: 61 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20  args ){.        
af80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
af90: 70 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75  pParse,"wrong nu
afa0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
afb0: 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e  s to function %.
afc0: 2a 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20  *s()",.         
afd0: 20 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20      nId, zId);. 
afe0: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
aff0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
b000: 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a    if( is_agg ){.
b010: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
b020: 70 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  p = TK_AGG_FUNCT
b030: 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e 43  ION;.        pNC
b040: 2d 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20  ->hasAgg = 1;.  
b050: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
b060: 69 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c  is_agg ) pNC->al
b070: 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 20 20  lowAgg = 0;.    
b080: 20 20 66 6f 72 28 69 3d 30 3b 20 70 4e 43 2d 3e    for(i=0; pNC->
b090: 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20  nErr==0 && i<n; 
b0a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 77 61  i++){.        wa
b0b0: 6c 6b 45 78 70 72 54 72 65 65 28 70 4c 69 73 74  lkExprTree(pList
b0c0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 61  ->a[i].pExpr, na
b0d0: 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20  meResolverStep, 
b0e0: 70 4e 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pNC);.      }.  
b0f0: 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29      if( is_agg )
b100: 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d   pNC->allowAgg =
b110: 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58   1;.      /* FIX
b120: 20 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45   ME:  Compute pE
b130: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61  xpr->affinity ba
b140: 73 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63  sed on the expec
b150: 74 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20  ted return.     
b160: 20 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20   ** type of the 
b170: 66 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20  function .      
b180: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
b190: 69 73 5f 61 67 67 3b 0a 20 20 20 20 7d 0a 23 69  is_agg;.    }.#i
b1a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b1b0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
b1c0: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20  ase TK_SELECT:. 
b1d0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
b1e0: 53 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61  S:.#endif.    ca
b1f0: 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
b200: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65    if( pExpr->pSe
b210: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
b220: 69 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e  int nRef = pNC->
b230: 6e 52 65 66 3b 0a 23 69 66 6e 64 65 66 20 53 51  nRef;.#ifndef SQ
b240: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
b250: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d          if( pNC-
b260: 3e 69 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20  >isCheck ){.    
b270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
b280: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 73 75  orMsg(pParse,"su
b290: 62 71 75 65 72 69 65 73 20 70 72 6f 68 69 62 69  bqueries prohibi
b2a0: 74 65 64 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e  ted in CHECK con
b2b0: 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20  straints");.    
b2c0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b2d0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
b2e0: 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65  ctResolve(pParse
b2f0: 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  , pExpr->pSelect
b300: 2c 20 70 4e 43 29 3b 0a 20 20 20 20 20 20 20 20  , pNC);.        
b310: 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65  assert( pNC->nRe
b320: 66 3e 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20 20  f>=nRef );.     
b330: 20 20 20 69 66 28 20 6e 52 65 66 21 3d 70 4e 43     if( nRef!=pNC
b340: 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20 20 20  ->nRef ){.      
b350: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
b360: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
b370: 72 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  rSelect);.      
b380: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b390: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
b3a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b3b0: 49 54 5f 43 48 45 43 4b 0a 20 20 20 20 63 61 73  IT_CHECK.    cas
b3c0: 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
b3d0: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e  .      if( pNC->
b3e0: 69 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20  isCheck ){.     
b3f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
b400: 73 67 28 70 50 61 72 73 65 2c 22 70 61 72 61 6d  sg(pParse,"param
b410: 65 74 65 72 73 20 70 72 6f 68 69 62 69 74 65 64  eters prohibited
b420: 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72   in CHECK constr
b430: 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 7d  aints");.      }
b440: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b450: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
b460: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
b470: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b480: 20 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73   walks an expres
b490: 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65  sion tree and re
b4a0: 73 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65  solves reference
b4b0: 73 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f  s to.** table co
b4c0: 6c 75 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66  lumns.  Nodes of
b4d0: 20 74 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20   the form ID.ID 
b4e0: 6f 72 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e  or ID resolve in
b4f0: 74 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74  to an.** index t
b500: 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74  o the table in t
b510: 68 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e  he table list an
b520: 64 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65  d a column offse
b530: 74 2e 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72  t.  The .** Expr
b540: 2e 6f 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68  .opcode for such
b550: 20 6e 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65   nodes is change
b560: 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20  d to TK_COLUMN. 
b570: 20 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65   The Expr.iTable
b580: 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61  .** value is cha
b590: 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65  nged to the inde
b5a0: 78 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e  x of the referen
b5b0: 63 65 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61  ced table in pTa
b5c0: 62 4c 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68  bList.** plus th
b5d0: 65 20 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20  e "base" value. 
b5e0: 20 54 68 65 20 62 61 73 65 20 76 61 6c 75 65 20   The base value 
b5f0: 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20  will ultimately 
b600: 62 65 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44  become the.** VD
b610: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
b620: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68   for a cursor th
b630: 61 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69  at is pointing i
b640: 6e 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63  nto the referenc
b650: 65 64 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68  ed.** table.  Th
b660: 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76  e Expr.iColumn v
b670: 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20  alue is changed 
b680: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
b690: 74 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f  the column .** o
b6a0: 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  f the referenced
b6b0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70   table.  The Exp
b6c0: 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  r.iColumn value 
b6d0: 66 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a  for the special.
b6e0: 2a 2a 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  ** ROWID column 
b6f0: 69 73 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45  is -1.  Any INTE
b700: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
b710: 63 6f 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20  column is tried 
b720: 61 73 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66  as an.** alias f
b730: 6f 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20  or ROWID..**.** 
b740: 41 6c 73 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e  Also resolve fun
b750: 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20  ction names and 
b760: 63 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69  check the functi
b770: 6f 6e 73 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a  ons for proper.*
b780: 2a 20 75 73 61 67 65 2e 20 20 4d 61 6b 65 20 73  * usage.  Make s
b790: 75 72 65 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e  ure all function
b7a0: 20 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67   names are recog
b7b0: 6e 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75  nized and all fu
b7c0: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20  nctions.** have 
b7d0: 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62  the correct numb
b7e0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  er of arguments.
b7f0: 20 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72    Leave an error
b800: 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70   message.** in p
b810: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69  Parse->zErrMsg i
b820: 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d  f anything is am
b830: 69 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  iss.  Return the
b840: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
b850: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
b860: 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61  expression conta
b870: 69 6e 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ins aggregate fu
b880: 6e 63 74 69 6f 6e 73 20 74 68 65 6e 20 73 65 74  nctions then set
b890: 20 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70   the EP_Agg.** p
b8a0: 72 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65  roperty on the e
b8b0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e  xpression..*/.in
b8c0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  t sqlite3ExprRes
b8d0: 6f 6c 76 65 4e 61 6d 65 73 28 20 0a 20 20 4e 61  olveNames( .  Na
b8e0: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
b8f0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61        /* Namespa
b900: 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78  ce to resolve ex
b910: 70 72 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f  pressions in. */
b920: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
b930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b940: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  e expression to 
b950: 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a  be analyzed. */.
b960: 29 7b 0a 20 20 69 6e 74 20 73 61 76 65 64 48 61  ){.  int savedHa
b970: 73 41 67 67 3b 0a 20 20 69 66 28 20 70 45 78 70  sAgg;.  if( pExp
b980: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
b990: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
b9a0: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 53 51 4c  ITE_TEST) || SQL
b9b0: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
b9c0: 54 48 3e 30 0a 20 20 69 66 28 20 28 70 45 78 70  TH>0.  if( (pExp
b9d0: 72 2d 3e 6e 48 65 69 67 68 74 2b 70 4e 43 2d 3e  r->nHeight+pNC->
b9e0: 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 29  pParse->nHeight)
b9f0: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52  >SQLITE_MAX_EXPR
ba00: 5f 44 45 50 54 48 20 29 7b 0a 20 20 20 20 73 71  _DEPTH ){.    sq
ba10: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 4e  lite3ErrorMsg(pN
ba20: 43 2d 3e 70 50 61 72 73 65 2c 20 0a 20 20 20 20  C->pParse, .    
ba30: 20 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74     "Expression t
ba40: 72 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ree is too large
ba50: 20 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20   (maximum depth 
ba60: 25 64 29 22 2c 0a 20 20 20 20 20 20 20 53 51 4c  %d)",.       SQL
ba70: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
ba80: 54 48 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65  TH.    );.    re
ba90: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 4e  turn 1;.  }.  pN
baa0: 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67  C->pParse->nHeig
bab0: 68 74 20 2b 3d 20 70 45 78 70 72 2d 3e 6e 48 65  ht += pExpr->nHe
bac0: 69 67 68 74 3b 0a 23 65 6e 64 69 66 0a 20 20 73  ight;.#endif.  s
bad0: 61 76 65 64 48 61 73 41 67 67 20 3d 20 70 4e 43  avedHasAgg = pNC
bae0: 2d 3e 68 61 73 41 67 67 3b 0a 20 20 70 4e 43 2d  ->hasAgg;.  pNC-
baf0: 3e 68 61 73 41 67 67 20 3d 20 30 3b 0a 20 20 77  >hasAgg = 0;.  w
bb00: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70  alkExprTree(pExp
bb10: 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53  r, nameResolverS
bb20: 74 65 70 2c 20 70 4e 43 29 3b 0a 23 69 66 20 64  tep, pNC);.#if d
bb30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
bb40: 53 54 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  ST) || SQLITE_MA
bb50: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20  X_EXPR_DEPTH>0. 
bb60: 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 48   pNC->pParse->nH
bb70: 65 69 67 68 74 20 2d 3d 20 70 45 78 70 72 2d 3e  eight -= pExpr->
bb80: 6e 48 65 69 67 68 74 3b 0a 23 65 6e 64 69 66 0a  nHeight;.#endif.
bb90: 20 20 69 66 28 20 70 4e 43 2d 3e 6e 45 72 72 3e    if( pNC->nErr>
bba0: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  0 ){.    ExprSet
bbb0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
bbc0: 45 50 5f 45 72 72 6f 72 29 3b 0a 20 20 7d 0a 20  EP_Error);.  }. 
bbd0: 20 69 66 28 20 70 4e 43 2d 3e 68 61 73 41 67 67   if( pNC->hasAgg
bbe0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
bbf0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
bc00: 50 5f 41 67 67 29 3b 0a 20 20 7d 65 6c 73 65 20  P_Agg);.  }else 
bc10: 69 66 28 20 73 61 76 65 64 48 61 73 41 67 67 20  if( savedHasAgg 
bc20: 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 68 61 73 41  ){.    pNC->hasA
bc30: 67 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  gg = 1;.  }.  re
bc40: 74 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70  turn ExprHasProp
bc50: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45  erty(pExpr, EP_E
bc60: 72 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rror);.}../*.** 
bc70: 41 20 70 6f 69 6e 74 65 72 20 69 6e 73 74 61 6e  A pointer instan
bc80: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
bc90: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
bca0: 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  pass information
bcb0: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 77 61 6c 6b  .** through walk
bcc0: 45 78 70 72 54 72 65 65 20 69 6e 74 6f 20 63 6f  ExprTree into co
bcd0: 64 65 53 75 62 71 75 65 72 79 53 74 65 70 28 29  deSubqueryStep()
bce0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
bcf0: 75 63 74 20 51 75 65 72 79 43 6f 64 65 72 20 51  uct QueryCoder Q
bd00: 75 65 72 79 43 6f 64 65 72 3b 0a 73 74 72 75 63  ueryCoder;.struc
bd10: 74 20 51 75 65 72 79 43 6f 64 65 72 20 7b 0a 20  t QueryCoder {. 
bd20: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
bd30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
bd40: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
bd50: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
bd60: 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70  NC;    /* Namesp
bd70: 61 63 65 20 6f 66 20 66 69 72 73 74 20 65 6e 63  ace of first enc
bd80: 6c 6f 73 69 6e 67 20 71 75 65 72 79 20 2a 2f 0a  losing query */.
bd90: 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  };..#ifdef SQLIT
bda0: 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 73 71 6c  E_TEST.  int sql
bdb0: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f  ite3_enable_in_o
bdc0: 70 74 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20  pt = 1;.#else.  
bdd0: 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 5f  #define sqlite3_
bde0: 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 20 31 0a  enable_in_opt 1.
bdf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
be00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
be10: 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65  sed by the imple
be20: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
be30: 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74   IN (...) operat
be40: 6f 72 2e 0a 2a 2a 20 49 74 27 73 20 6a 6f 62 20  or..** It's job 
be50: 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72  is to find or cr
be60: 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 73 74  eate a b-tree st
be70: 72 75 63 74 75 72 65 20 74 68 61 74 20 6d 61 79  ructure that may
be80: 20 62 65 20 75 73 65 64 0a 2a 2a 20 65 69 74 68   be used.** eith
be90: 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d  er to test for m
bea0: 65 6d 62 65 72 73 68 69 70 20 6f 66 20 74 68 65  embership of the
beb0: 20 28 2e 2e 2e 29 20 73 65 74 20 6f 72 20 74 6f   (...) set or to
bec0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
bed0: 0a 2a 2a 20 69 74 73 20 6d 65 6d 62 65 72 73 2c  .** its members,
bee0: 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63   skipping duplic
bef0: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ates..**.** The 
bf00: 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 6f 6e  cursor opened on
bf10: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 28   the structure (
bf20: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20  database table, 
bf30: 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 0a  database index .
bf40: 2a 2a 20 6f 72 20 65 70 68 65 72 6d 61 6c 20 74  ** or ephermal t
bf50: 61 62 6c 65 29 20 69 73 20 73 74 6f 72 65 64 20  able) is stored 
bf60: 69 6e 20 70 58 2d 3e 69 54 61 62 6c 65 20 62 65  in pX->iTable be
bf70: 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
bf80: 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 20 54  on returns..** T
bf90: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
bfa0: 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20  e indicates the 
bfb0: 73 74 72 75 63 74 75 72 65 20 74 79 70 65 2c 20  structure type, 
bfc0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
bfd0: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  *   IN_INDEX_ROW
bfe0: 49 44 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20  ID - The cursor 
bff0: 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
c000: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a  database table..
c010: 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  **   IN_INDEX_IN
c020: 44 45 58 20 2d 20 54 68 65 20 63 75 72 73 6f 72  DEX - The cursor
c030: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
c040: 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 63 2e   database indec.
c050: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45  .**   IN_INDEX_E
c060: 50 48 20 2d 20 20 20 54 68 65 20 63 75 72 73 6f  PH -   The curso
c070: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
c080: 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61  a specially crea
c090: 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ted and.**      
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
c0b0: 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61  pulated epherema
c0c0: 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  l table..**.** A
c0d0: 6e 20 65 78 69 73 74 69 6e 67 20 73 74 72 75 63  n existing struc
c0e0: 74 75 72 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65  ture may only be
c0f0: 20 75 73 65 64 20 69 66 20 74 68 65 20 53 45 4c   used if the SEL
c100: 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 73 69  ECT is of the si
c110: 6d 70 6c 65 0a 2a 2a 20 66 6f 72 6d 3a 0a 2a 2a  mple.** form:.**
c120: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c  .**     SELECT <
c130: 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61  column> FROM <ta
c140: 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble>.**.** If th
c150: 65 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 70  e mustBeUnique p
c160: 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73  arameter is fals
c170: 65 2c 20 74 68 65 20 73 74 72 75 63 74 75 72 65  e, the structure
c180: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a   will be used .*
c190: 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d  * for fast set m
c1a0: 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2e  embership tests.
c1b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   In this case an
c1c0: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
c1d0: 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65   must .** be use
c1e0: 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e  d unless <column
c1f0: 3e 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20  > is an INTEGER 
c200: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61  PRIMARY KEY or a
c210: 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20  n index can .** 
c220: 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63  be found with <c
c230: 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65  olumn> as its le
c240: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a  ft-most column..
c250: 2a 2a 0a 2a 2a 20 49 66 20 6d 75 73 74 42 65 55  **.** If mustBeU
c260: 6e 69 71 75 65 20 69 73 20 74 72 75 65 2c 20 74  nique is true, t
c270: 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  hen the structur
c280: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  e will be used t
c290: 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72  o iterate.** thr
c2a0: 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d  ough the set mem
c2b0: 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 61  bers, skipping a
c2c0: 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20 49  ny duplicates. I
c2d0: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a 2a  n this case an.*
c2e0: 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  * epheremal tabl
c2f0: 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75  e must be used u
c300: 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74  nless the select
c310: 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67  ed <column> is g
c320: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
c330: 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68  be unique - eith
c340: 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73  er because it is
c350: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
c360: 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a  ARY KEY or it.**
c370: 20 69 73 20 75 6e 69 71 75 65 20 62 79 20 76 69   is unique by vi
c380: 72 74 75 65 20 6f 66 20 61 20 63 6f 6e 73 74 72  rtue of a constr
c390: 61 69 6e 74 20 6f 72 20 69 6d 70 6c 69 63 69 74  aint or implicit
c3a0: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 23 69 66 6e 64   index..*/.#ifnd
c3b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
c3c0: 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69  UBQUERY.int sqli
c3d0: 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 50  te3FindInIndex(P
c3e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
c3f0: 70 72 20 2a 70 58 2c 20 69 6e 74 20 6d 75 73 74  pr *pX, int must
c400: 42 65 55 6e 69 71 75 65 29 7b 0a 20 20 53 65 6c  BeUnique){.  Sel
c410: 65 63 74 20 2a 70 3b 0a 20 20 69 6e 74 20 65 54  ect *p;.  int eT
c420: 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ype = 0;.  int i
c430: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
c440: 61 62 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ab++;..  /* The 
c450: 66 6f 6c 6c 77 69 6e 67 20 69 66 28 2e 2e 2e 29  follwing if(...)
c460: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
c470: 72 75 65 20 69 66 20 74 68 65 20 53 45 4c 45 43  rue if the SELEC
c480: 54 20 69 73 20 6f 66 20 74 68 65 20 0a 20 20 2a  T is of the .  *
c490: 2a 20 73 69 6d 70 6c 65 20 66 6f 72 6d 3a 0a 20  * simple form:. 
c4a0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
c4b0: 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f  ECT <column> FRO
c4c0: 4d 20 3c 74 61 62 6c 65 3e 0a 20 20 2a 2a 0a 20  M <table>.  **. 
c4d0: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
c4e0: 68 65 20 63 61 73 65 2c 20 69 74 20 6d 61 79 20  he case, it may 
c4f0: 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  be possible to u
c500: 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  se an existing t
c510: 61 62 6c 65 0a 20 20 2a 2a 20 6f 72 20 69 6e 64  able.  ** or ind
c520: 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 67 65  ex instead of ge
c530: 6e 65 72 61 74 69 6e 67 20 61 6e 20 65 70 68 65  nerating an ephe
c540: 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a  remal table..  *
c550: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
c560: 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 0a 20 20  enable_in_opt.  
c570: 20 26 26 20 28 70 3d 70 58 2d 3e 70 53 65 6c 65   && (p=pX->pSele
c580: 63 74 29 20 26 26 20 21 70 2d 3e 70 50 72 69 6f  ct) && !p->pPrio
c590: 72 0a 20 20 20 26 26 20 21 70 2d 3e 69 73 44 69  r.   && !p->isDi
c5a0: 73 74 69 6e 63 74 20 26 26 20 21 70 2d 3e 69 73  stinct && !p->is
c5b0: 41 67 67 20 26 26 20 21 70 2d 3e 70 47 72 6f 75  Agg && !p->pGrou
c5c0: 70 42 79 0a 20 20 20 26 26 20 70 2d 3e 70 53 72  pBy.   && p->pSr
c5d0: 63 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53  c && p->pSrc->nS
c5e0: 72 63 3d 3d 31 20 26 26 20 21 70 2d 3e 70 53 72  rc==1 && !p->pSr
c5f0: 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a  c->a[0].pSelect.
c600: 20 20 20 26 26 20 21 70 2d 3e 70 53 72 63 2d 3e     && !p->pSrc->
c610: 61 5b 30 5d 2e 70 54 61 62 2d 3e 70 53 65 6c 65  a[0].pTab->pSele
c620: 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
c630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c640: 20 20 20 20 0a 20 20 20 26 26 20 70 2d 3e 70 45      .   && p->pE
c650: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26  List->nExpr==1 &
c660: 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  & p->pEList->a[0
c670: 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
c680: 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 21 70 2d  COLUMN.   && !p-
c690: 3e 70 4c 69 6d 69 74 20 26 26 20 21 70 2d 3e 70  >pLimit && !p->p
c6a0: 4f 66 66 73 65 74 20 26 26 20 21 70 2d 3e 70 57  Offset && !p->pW
c6b0: 68 65 72 65 0a 20 20 29 7b 0a 20 20 20 20 73 71  here.  ){.    sq
c6c0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c6d0: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 49 6e 64 65  se->db;.    Inde
c6e0: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 45 78 70  x *pIdx;.    Exp
c6f0: 72 20 2a 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  r *pExpr = p->pE
c700: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
c710: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  ;.    int iCol =
c720: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
c730: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
c740: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
c750: 61 72 73 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  arse);..    /* T
c760: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
c770: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
c780: 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20   two places. In 
c790: 62 6f 74 68 20 63 61 73 65 73 20 74 68 65 20 76  both cases the v
c7a0: 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61  dbe.    ** has a
c7b0: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
c7c0: 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65  cated. So assume
c7d0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
c7e0: 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20  ) is always.    
c7f0: 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68 65  ** successful he
c800: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
c810: 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66  ssert(v);.    if
c820: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
c830: 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70    int iMem = ++p
c840: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
c850: 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20     int iAddr;.  
c860: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
c870: 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
c880: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20  pTab;.      int 
c890: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
c8a0: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
c8b0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
c8c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c8d0: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
c8e0: 29 3b 0a 0a 20 20 20 20 20 20 69 41 64 64 72 20  );..      iAddr 
c8f0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c900: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 69 4d  Op1(v, OP_If, iM
c910: 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  em);.      sqlit
c920: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c930: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
c940: 4d 65 6d 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  Mem);..      sql
c950: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
c960: 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
c970: 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
c980: 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65  ad);.      eType
c990: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
c9a0: 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D;..      sqlite
c9b0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
c9c0: 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c   iAddr);.    }el
c9d0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  se{.      /* The
c9e0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
c9f0: 6e 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  nce used by the 
ca00: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20 61  comparison. If a
ca10: 6e 20 69 6e 64 65 78 20 69 73 20 74 6f 20 0a 20  n index is to . 
ca20: 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20       ** be used 
ca30: 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 65  in place of a te
ca40: 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75 73  mp-table, it mus
ca50: 74 20 62 65 20 6f 72 64 65 72 65 64 20 61 63 63  t be ordered acc
ca60: 6f 72 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ording.      ** 
ca70: 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f  to this collatio
ca80: 6e 20 73 65 71 75 65 6e 63 65 2e 0a 20 20 20 20  n sequence..    
ca90: 20 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53    */.      CollS
caa0: 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74  eq *pReq = sqlit
cab0: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
cac0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
cad0: 58 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 29  X->pLeft, pExpr)
cae0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  ;..      /* Chec
caf0: 6b 20 74 68 61 74 20 74 68 65 20 61 66 66 69 6e  k that the affin
cb00: 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ity that will be
cb10: 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d   used to perform
cb20: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63   the .      ** c
cb30: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65  omparison is the
cb40: 20 73 61 6d 65 20 61 73 20 74 68 65 20 61 66 66   same as the aff
cb50: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 63 6f 6c  inity of the col
cb60: 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a  umn. If.      **
cb70: 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 69   it is not, it i
cb80: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
cb90: 6f 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78 2e  o use any index.
cba0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
cbb0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 2d  Table *pTab = p-
cbc0: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
cbd0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  ;.      char aff
cbe0: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
cbf0: 69 6e 69 74 79 28 70 58 29 3b 0a 20 20 20 20 20  inity(pX);.     
cc00: 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b   int affinity_ok
cc10: 20 3d 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   = (pTab->aCol[i
cc20: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 61  Col].affinity==a
cc30: 66 66 7c 7c 61 66 66 3d 3d 53 51 4c 49 54 45 5f  ff||aff==SQLITE_
cc40: 41 46 46 5f 4e 4f 4e 45 29 3b 0a 0a 20 20 20 20  AFF_NONE);..    
cc50: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
cc60: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26  >pIndex; pIdx &&
cc70: 20 65 54 79 70 65 3d 3d 30 20 26 26 20 61 66 66   eType==0 && aff
cc80: 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70  inity_ok; pIdx=p
cc90: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
cca0: 20 20 20 20 20 69 66 28 20 28 70 49 64 78 2d 3e       if( (pIdx->
ccb0: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f  aiColumn[0]==iCo
ccc0: 6c 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  l).         && (
ccd0: 70 52 65 71 3d 3d 73 71 6c 69 74 65 33 46 69 6e  pReq==sqlite3Fin
cce0: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
ccf0: 28 64 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  (db), pIdx->azCo
cd00: 6c 6c 5b 30 5d 2c 20 2d 31 2c 20 30 29 29 0a 20  ll[0], -1, 0)). 
cd10: 20 20 20 20 20 20 20 20 26 26 20 28 21 6d 75 73          && (!mus
cd20: 74 42 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49  tBeUnique || (pI
cd30: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26  dx->nColumn==1 &
cd40: 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  & pIdx->onError!
cd50: 3d 4f 45 5f 4e 6f 6e 65 29 29 0a 20 20 20 20 20  =OE_None)).     
cd60: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
cd70: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
cd80: 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b     int iMem = ++
cd90: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
cda0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64          int iAdd
cdb0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  r;.          cha
cdc0: 72 20 2a 70 4b 65 79 3b 0a 20 20 0a 20 20 20 20  r *pKey;.  .    
cdd0: 20 20 20 20 20 20 70 4b 65 79 20 3d 20 28 63 68        pKey = (ch
cde0: 61 72 20 2a 29 73 71 6c 69 74 65 33 49 6e 64 65  ar *)sqlite3Inde
cdf0: 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
ce00: 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
ce10: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
ce20: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
ce30: 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 29 3b   pIdx->pSchema);
ce40: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ce50: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
ce60: 76 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 20 20  v, iDb);..      
ce70: 20 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69      iAddr = sqli
ce80: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
ce90: 20 4f 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a 20   OP_If, iMem);. 
cea0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ceb0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
cec0: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 4d 65  _Integer, 1, iMe
ced0: 6d 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20  m);.  .         
cee0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cef0: 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p4(v, OP_OpenRea
cf00: 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74  d, iTab, pIdx->t
cf10: 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20  num, iDb,.      
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 20 20 20 20 20 20 20 20 20 70 4b 65 79 2c 50 34           pKey,P4
cf40: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
cf50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
cf60: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
cf70: 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
cf80: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54 79 70  ;.          eTyp
cf90: 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  e = IN_INDEX_IND
cfa0: 45 58 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  EX;.          sq
cfb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
cfc0: 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75  v, OP_SetNumColu
cfd0: 6d 6e 73 2c 20 69 54 61 62 2c 20 70 49 64 78 2d  mns, iTab, pIdx-
cfe0: 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 0a 20 20 20 20  >nColumn);..    
cff0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d000: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64  eJumpHere(v, iAd
d010: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  dr);.        }. 
d020: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d030: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  ..  if( eType==0
d040: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
d050: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
d060: 72 73 65 2c 20 70 58 29 3b 0a 20 20 20 20 65 54  rse, pX);.    eT
d070: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45  ype = IN_INDEX_E
d080: 50 48 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PH;.  }else{.   
d090: 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54   pX->iTable = iT
d0a0: 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ab;.  }.  return
d0b0: 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66   eType;.}.#endif
d0c0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
d0d0: 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72   code for scalar
d0e0: 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64   subqueries used
d0f0: 20 61 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f   as an expressio
d100: 6e 0a 2a 2a 20 61 6e 64 20 49 4e 20 6f 70 65 72  n.** and IN oper
d110: 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73  ators.  Examples
d120: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c  :.**.**     (SEL
d130: 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
d140: 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65         -- subque
d150: 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53  ry.**     EXISTS
d160: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
d170: 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73  b)   -- EXISTS s
d180: 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78  ubquery.**     x
d190: 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20   IN (4,5,11)    
d1a0: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20            -- IN 
d1b0: 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69  operator with li
d1c0: 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64  st on right-hand
d1d0: 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49   side.**     x I
d1e0: 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  N (SELECT a FROM
d1f0: 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70   b)     -- IN op
d200: 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71  erator with subq
d210: 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68  uery on the righ
d220: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70  t.**.** The pExp
d230: 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63  r parameter desc
d240: 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73  ribes the expres
d250: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69  sion that contai
d260: 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65  ns the IN.** ope
d270: 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72  rator or subquer
d280: 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  y..*/.#ifndef SQ
d290: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
d2a0: 52 59 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  RY.void sqlite3C
d2b0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72  odeSubselect(Par
d2c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
d2d0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
d2e0: 74 65 73 74 41 64 64 72 20 3d 20 30 3b 20 20 20  testAddr = 0;   
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d300: 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20      /* One-time 
d310: 74 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a  test address */.
d320: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
d330: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
d340: 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
d350: 20 72 65 74 75 72 6e 3b 0a 0a 0a 20 20 2f 2a 20   return;...  /* 
d360: 54 68 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62  This code must b
d370: 65 20 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74  e run in its ent
d380: 69 72 65 74 79 20 65 76 65 72 79 20 74 69 6d 65  irety every time
d390: 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
d3a0: 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f  ed.  ** if any o
d3b0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
d3c0: 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20  is true:.  **.  
d3d0: 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
d3e0: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
d3f0: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
d400: 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20  query.  **    * 
d410: 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
d420: 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72 65  side is an expre
d430: 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61  ssion list conta
d440: 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a  ining variables.
d450: 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72    **    *  We ar
d460: 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67 67  e inside a trigg
d470: 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  er.  **.  ** If 
d480: 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65  all of the above
d490: 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e   are false, then
d4a0: 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73   we can run this
d4b0: 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a   code just once.
d4c0: 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65    ** save the re
d4d0: 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65  sults, and reuse
d4e0: 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
d4f0: 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69   on subsequent i
d500: 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f  nvocations..  */
d510: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 41  .  if( !ExprHasA
d520: 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  nyProperty(pExpr
d530: 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20  , EP_VarSelect) 
d540: 26 26 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67  && !pParse->trig
d550: 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74  Stack ){.    int
d560: 20 6d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d   mem = ++pParse-
d570: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
d580: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d590: 4f 50 5f 49 66 2c 20 6d 65 6d 29 3b 0a 20 20 20  OP_If, mem);.   
d5a0: 20 74 65 73 74 41 64 64 72 20 3d 20 73 71 6c 69   testAddr = sqli
d5b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d5c0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
d5d0: 6d 65 6d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  mem);.    assert
d5e0: 28 20 74 65 73 74 41 64 64 72 3e 30 20 7c 7c 20  ( testAddr>0 || 
d5f0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
d600: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7d 0a  ocFailed );.  }.
d610: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
d620: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
d630: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
d640: 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20  char affinity;. 
d650: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79       KeyInfo key
d660: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20  Info;.      int 
d670: 61 64 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  addr;        /* 
d680: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
d690: 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
d6a0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20  ruction */..    
d6b0: 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c    affinity = sql
d6c0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
d6d0: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  (pExpr->pLeft);.
d6e0: 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65  .      /* Whethe
d6f0: 72 20 74 68 69 73 20 69 73 20 61 6e 20 27 78 20  r this is an 'x 
d700: 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f  IN(SELECT...)' o
d710: 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72  r an 'x IN(<expr
d720: 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a  list>)'.      **
d730: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69   expression it i
d740: 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61  s handled the sa
d750: 6d 65 20 77 61 79 2e 20 41 20 76 69 72 74 75 61  me way. A virtua
d760: 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20  l table is .    
d770: 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68    ** filled with
d780: 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e   single-field in
d790: 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65  dex keys represe
d7a0: 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nting the result
d7b0: 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
d7c0: 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68  the SELECT or th
d7d0: 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20  e <exprlist>..  
d7e0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
d7f0: 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65  If the 'x' expre
d800: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
d810: 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20  n value, or the 
d820: 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20  SELECT....      
d830: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  ** statement ret
d840: 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  urns a column va
d850: 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66  lue, then the af
d860: 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20  finity of that. 
d870: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69       ** column i
d880: 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
d890: 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  the index keys. 
d8a0: 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20  If both 'x' and 
d8b0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c  the.      ** SEL
d8c0: 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
d8d0: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
d8e0: 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
d8f0: 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20  ity is used.    
d900: 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63    ** if either c
d910: 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49  olumn has NUMERI
d920: 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66  C or INTEGER aff
d930: 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65  inity. If neithe
d940: 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e  r.      ** 'x' n
d950: 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
d960: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
d970: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
d980: 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20  eric affinity.  
d990: 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a      ** is used..
d9a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
d9b0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
d9c0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
d9d0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
d9e0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
d9f0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
da00: 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  l, pExpr->iTable
da10: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
da20: 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  &keyInfo, 0, siz
da30: 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20  eof(keyInfo));. 
da40: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69       keyInfo.nFi
da50: 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  eld = 1;.      s
da60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
da70: 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c  (v, OP_SetNumCol
da80: 75 6d 6e 73 2c 20 70 45 78 70 72 2d 3e 69 54 61  umns, pExpr->iTa
da90: 62 6c 65 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20  ble, 1);..      
daa0: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
dab0: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ct ){.        /*
dac0: 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78 70   Case 1:     exp
dad0: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
dae0: 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
daf0: 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65       ** Generate
db00: 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74   code to write t
db10: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
db20: 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68  e select into th
db30: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
db40: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c      ** table all
db50: 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  ocated and opene
db60: 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  d above..       
db70: 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65   */.        Sele
db80: 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
db90: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
dba0: 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20  EList;..        
dbb0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
dbc0: 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
dbd0: 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  _Set, pExpr->iTa
dbe0: 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64 65  ble);.        de
dbf0: 73 74 2e 61 66 66 69 6e 69 74 79 20 3d 20 28 69  st.affinity = (i
dc00: 6e 74 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  nt)affinity;.   
dc10: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45       assert( (pE
dc20: 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30  xpr->iTable&0x00
dc30: 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e  00FFFF)==pExpr->
dc40: 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  iTable );.      
dc50: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
dc60: 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
dc70: 72 2d 3e 70 53 65 6c 65 63 74 2c 20 26 64 65 73  r->pSelect, &des
dc80: 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 20 29  t, 0, 0, 0, 0) )
dc90: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
dca0: 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rn;.        }.  
dcb0: 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
dcc0: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Expr->pSelect->p
dcd0: 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69  EList;.        i
dce0: 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
dcf0: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 7b 20  ist->nExpr>0 ){ 
dd00: 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79 49 6e  .          keyIn
dd10: 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71  fo.aColl[0] = sq
dd20: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
dd30: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
dd40: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a  , pExpr->pLeft,.
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
dd60: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
dd70: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
dd80: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
dd90: 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pr->pList ){.   
dda0: 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20       /* Case 2: 
ddb0: 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70      expr IN (exp
ddc0: 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a  rlist).        *
ddd0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72  *.        ** For
dde0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
ddf0: 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78  , build an index
de00: 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76   key from the ev
de10: 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20  aluation and.   
de20: 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74       ** store it
de30: 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
de40: 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70  y table. If <exp
de50: 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20  r> is a column, 
de60: 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20  then use.       
de70: 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73   ** that columns
de80: 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62   affinity when b
de90: 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65  uilding index ke
dea0: 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73  ys. If <expr> is
deb0: 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   not.        ** 
dec0: 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75  a column, use nu
ded0: 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a  meric affinity..
dee0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
def0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
df00: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
df10: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
df20: 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
df30: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
df40: 70 49 74 65 6d 3b 0a 0a 20 20 20 20 20 20 20 20  pItem;..        
df50: 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b  if( !affinity ){
df60: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e  .          affin
df70: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
df80: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
df90: 0a 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f  .        keyInfo
dfa0: 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 45 78 70  .aColl[0] = pExp
dfb0: 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b  r->pLeft->pColl;
dfc0: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  ..        /* Loo
dfd0: 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
dfe0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78  xpression in <ex
dff0: 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20  prlist>. */.    
e000: 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d      for(i=pList-
e010: 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c  >nExpr, pItem=pL
e020: 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  ist->a; i>0; i--
e030: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
e040: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20        Expr *pE2 
e050: 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
e060: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
e070: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
e080: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20  is not constant 
e090: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65  then we will nee
e0a0: 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  d to.          *
e0b0: 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  * disable the te
e0c0: 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65  st that was gene
e0d0: 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74  rated above that
e0e0: 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20   makes sure.    
e0f0: 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
e100: 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73  de only executes
e110: 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20   once.  Because 
e120: 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61  for a non-consta
e130: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
e140: 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65  expression we ne
e150: 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73  ed to rerun this
e160: 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e   code each time.
e170: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
e180: 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73 74          if( test
e190: 41 64 64 72 20 26 26 20 21 73 71 6c 69 74 65 33  Addr && !sqlite3
e1a0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
e1b0: 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  E2) ){.         
e1c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
e1d0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65  angeToNoop(v, te
e1e0: 73 74 41 64 64 72 2d 31 2c 20 32 29 3b 0a 20 20  stAddr-1, 2);.  
e1f0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 41 64            testAd
e200: 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dr = 0;.        
e210: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
e220: 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
e230: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e  xpression and in
e240: 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
e250: 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
e260: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e270: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
e280: 20 70 45 32 2c 20 30 29 3b 0a 20 20 20 20 20 20   pE2, 0);.      
e290: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e2a0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
e2b0: 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 30 2c  Record, 1, 0, 0,
e2c0: 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a   &affinity, 1);.
e2d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e2e0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
e2f0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78  P_IdxInsert, pEx
e300: 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr->iTable);.   
e310: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
e320: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e330: 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
e340: 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e  , (void *)&keyIn
e350: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
e360: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e370: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
e380: 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
e390: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
e3a0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 73       /* This has
e3b0: 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20   to be a scalar 
e3c0: 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74  SELECT.  Generat
e3d0: 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68  e code to put th
e3e0: 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65  e.      ** value
e3f0: 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74 20   of this select 
e400: 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  in a memory cell
e410: 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20   and record the 
e420: 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20  number.      ** 
e430: 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  of the memory ce
e440: 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20  ll in iColumn.. 
e450: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
e460: 61 74 69 63 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  atic const Token
e470: 20 6f 6e 65 20 3d 20 7b 20 28 75 38 2a 29 22 31   one = { (u8*)"1
e480: 22 2c 20 30 2c 20 31 20 7d 3b 0a 20 20 20 20 20  ", 0, 1 };.     
e490: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20   Select *pSel;. 
e4a0: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
e4b0: 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 70 53 65  dest;..      pSe
e4c0: 6c 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  l = pExpr->pSele
e4d0: 63 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ct;.      sqlite
e4e0: 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
e4f0: 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72  &dest, 0, ++pPar
e500: 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20  se->nMem);.     
e510: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
e520: 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
e530: 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20       dest.eDest 
e540: 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20  = SRT_Mem;.     
e550: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e560: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
e570: 20 30 2c 20 64 65 73 74 2e 69 50 61 72 6d 29 3b   0, dest.iParm);
e580: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
e590: 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73  ment((v, "Init s
e5a0: 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
e5b0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
e5c0: 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
e5d0: 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b  st = SRT_Exists;
e5e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e5f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e600: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73  _Integer, 0, des
e610: 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  t.iParm);.      
e620: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
e630: 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72  , "Init EXISTS r
e640: 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
e650: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
e660: 78 70 72 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e  xprDelete(pSel->
e670: 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
e680: 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  Sel->pLimit = sq
e690: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
e6a0: 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  e, TK_INTEGER, 0
e6b0: 2c 20 30 2c 20 26 6f 6e 65 29 3b 0a 20 20 20 20  , 0, &one);.    
e6c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
e6d0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
e6e0: 2c 20 26 64 65 73 74 2c 20 30 2c 20 30 2c 20 30  , &dest, 0, 0, 0
e6f0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
e700: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
e710: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
e720: 6c 75 6d 6e 20 3d 20 64 65 73 74 2e 69 50 61 72  lumn = dest.iPar
e730: 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  m;.      break;.
e740: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
e750: 20 74 65 73 74 41 64 64 72 20 29 7b 0a 20 20 20   testAddr ){.   
e760: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
e770: 48 65 72 65 28 76 2c 20 74 65 73 74 41 64 64 72  Here(v, testAddr
e780: 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  -1);.  }..  retu
e790: 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
e7a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
e7b0: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  UERY */../*.** D
e7c0: 75 70 6c 69 63 61 74 65 20 61 6e 20 38 2d 62 79  uplicate an 8-by
e7d0: 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74  te value.*/.stat
e7e0: 69 63 20 63 68 61 72 20 2a 64 75 70 38 62 79 74  ic char *dup8byt
e7f0: 65 73 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73  es(Vdbe *v, cons
e800: 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63  t char *in){.  c
e810: 68 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74  har *out = sqlit
e820: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71  e3DbMallocRaw(sq
e830: 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20  lite3VdbeDb(v), 
e840: 38 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b  8);.  if( out ){
e850: 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c  .    memcpy(out,
e860: 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72   in, 8);.  }.  r
e870: 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a  eturn out;.}../*
e880: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
e890: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
e8a0: 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c   will put the fl
e8b0: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
e8c0: 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20  value described 
e8d0: 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20  by z[0..n-1] on 
e8e0: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a  the stack..**.**
e8f0: 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20   The z[] string 
e900: 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f  will probably no
e910: 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e  t be zero-termin
e920: 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a  ated.  But the .
e930: 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65  ** z[n] characte
e940: 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  r is guaranteed 
e950: 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20  to be something 
e960: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f  that does not lo
e970: 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63  ok.** like the c
e980: 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74  ontinuation of t
e990: 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74  he number..*/.st
e9a0: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65  atic void codeRe
e9b0: 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73  al(Vdbe *v, cons
e9c0: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
e9d0: 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67  , int negateFlag
e9e0: 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 61  , int iMem){.  a
e9f0: 73 73 65 72 74 28 20 7a 20 7c 7c 20 76 3d 3d 30  ssert( z || v==0
ea00: 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 44   || sqlite3VdbeD
ea10: 62 28 76 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  b(v)->mallocFail
ea20: 65 64 20 29 3b 0a 20 20 69 66 28 20 7a 20 29 7b  ed );.  if( z ){
ea30: 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75  .    double valu
ea40: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 3b  e;.    char *zV;
ea50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
ea60: 64 69 67 69 74 28 7a 5b 6e 5d 29 20 29 3b 0a 20  digit(z[n]) );. 
ea70: 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a     sqlite3AtoF(z
ea80: 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69  , &value);.    i
ea90: 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20  f( negateFlag ) 
eaa0: 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a  value = -value;.
eab0: 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74      zV = dup8byt
eac0: 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61  es(v, (char*)&va
ead0: 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lue);.    sqlite
eae0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
eaf0: 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c  P_Real, 0, iMem,
eb00: 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29   0, zV, P4_REAL)
eb10: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
eb20: 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
eb30: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
eb40: 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65  l put the intege
eb50: 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a  r describe by.**
eb60: 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20   text z[0..n-1] 
eb70: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  on the stack..**
eb80: 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69  .** The z[] stri
eb90: 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79  ng will probably
eba0: 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72   not be zero-ter
ebb0: 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68  minated.  But th
ebc0: 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61  e .** z[n] chara
ebd0: 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65  cter is guarante
ebe0: 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  ed to be somethi
ebf0: 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ng that does not
ec00: 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68   look.** like th
ec10: 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f  e continuation o
ec20: 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f  f the number..*/
ec30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
ec40: 65 49 6e 74 65 67 65 72 28 56 64 62 65 20 2a 76  eInteger(Vdbe *v
ec50: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
ec60: 20 69 6e 74 20 6e 2c 20 69 6e 74 20 6e 65 67 46   int n, int negF
ec70: 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
ec80: 20 20 61 73 73 65 72 74 28 20 7a 20 7c 7c 20 76    assert( z || v
ec90: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 56 64  ==0 || sqlite3Vd
eca0: 62 65 44 62 28 76 29 2d 3e 6d 61 6c 6c 6f 63 46  beDb(v)->mallocF
ecb0: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 7a  ailed );.  if( z
ecc0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
ecd0: 20 20 20 61 73 73 65 72 74 28 20 21 69 73 64 69     assert( !isdi
ece0: 67 69 74 28 7a 5b 6e 5d 29 20 29 3b 0a 20 20 20  git(z[n]) );.   
ecf0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49   if( sqlite3GetI
ed00: 6e 74 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20  nt32(z, &i) ){. 
ed10: 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67       if( negFlag
ed20: 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 20   ) i = -i;.     
ed30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ed40: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
ed50: 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  , i, iMem);.    
ed60: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
ed70: 33 46 69 74 73 49 6e 36 34 42 69 74 73 28 7a 2c  3FitsIn64Bits(z,
ed80: 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20   negFlag) ){.   
ed90: 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20     i64 value;.  
eda0: 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20      char *zV;.  
edb0: 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 69 36      sqlite3Atoi6
edc0: 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20  4(z, &value);.  
edd0: 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
ede0: 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65  ) value = -value
edf0: 3b 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70  ;.      zV = dup
ee00: 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a  8bytes(v, (char*
ee10: 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  )&value);.      
ee20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ee30: 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30  4(v, OP_Int64, 0
ee40: 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50  , iMem, 0, zV, P
ee50: 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65  4_INT64);.    }e
ee60: 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 64 65 52  lse{.      codeR
ee70: 65 61 6c 28 76 2c 20 7a 2c 20 6e 2c 20 6e 65 67  eal(v, z, n, neg
ee80: 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  Flag, iMem);.   
ee90: 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   }.  }.}.../*.**
eea0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
eeb0: 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
eec0: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
eed0: 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74  column from.** t
eee0: 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74  able pTab and st
eef0: 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  ore the column v
ef00: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
ef10: 20 69 4d 65 6d 2c 20 6f 72 20 6f 6e 0a 2a 2a 20   iMem, or on.** 
ef20: 74 68 65 20 73 74 61 63 6b 20 69 66 20 69 4d 65  the stack if iMe
ef30: 6d 3d 3d 30 2e 20 20 54 68 65 72 65 20 69 73 20  m==0.  There is 
ef40: 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  an open cursor t
ef50: 6f 20 70 54 61 62 20 69 6e 20 0a 2a 2a 20 69 54  o pTab in .** iT
ef60: 61 62 6c 65 2e 20 20 49 66 20 69 43 6f 6c 75 6d  able.  If iColum
ef70: 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  n<0 then code is
ef80: 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20   generated that 
ef90: 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77  extracts the row
efa0: 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  id..*/.void sqli
efb0: 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
efc0: 6c 75 6d 6e 28 0a 20 20 56 64 62 65 20 2a 76 2c  lumn(.  Vdbe *v,
efd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
efe0: 56 4d 20 62 65 69 6e 67 20 63 72 65 61 74 65 64  VM being created
eff0: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
f000: 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  b,     /* Descri
f010: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62  ption of the tab
f020: 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  le we are readin
f030: 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  g from */.  int 
f040: 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20  iColumn,     /* 
f050: 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  Index of the tab
f060: 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  le column */.  i
f070: 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
f080: 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f  /* The cursor po
f090: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61  inting to the ta
f0a0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
f0b0: 67 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  g         /* Sto
f0c0: 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  re results here 
f0d0: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c  */.){.  if( iCol
f0e0: 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74  umn<0 ){.    int
f0f0: 20 6f 70 20 3d 20 28 70 54 61 62 20 26 26 20 49   op = (pTab && I
f100: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29 20  sVirtual(pTab)) 
f110: 3f 20 4f 50 5f 56 52 6f 77 69 64 20 3a 20 4f 50  ? OP_VRowid : OP
f120: 5f 52 6f 77 69 64 3b 0a 20 20 20 20 73 71 6c 69  _Rowid;.    sqli
f130: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f140: 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69 52 65   op, iTable, iRe
f150: 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  g);.  }else if( 
f160: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pTab==0 ){.    s
f170: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
f180: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
f190: 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20  Table, iColumn, 
f1a0: 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iReg);.  }else{.
f1b0: 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56      int op = IsV
f1c0: 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f  irtual(pTab) ? O
f1d0: 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43  P_VColumn : OP_C
f1e0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74  olumn;.    sqlit
f1f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
f200: 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  op, iTable, iCol
f210: 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  umn, iReg);.    
f220: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66  sqlite3ColumnDef
f230: 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43  ault(v, pTab, iC
f240: 6f 6c 75 6d 6e 29 3b 0a 23 69 66 6e 64 65 66 20  olumn);.#ifndef 
f250: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
f260: 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 69  TING_POINT.    i
f270: 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  f( pTab->aCol[iC
f280: 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d  olumn].affinity=
f290: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
f2a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f2b0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
f2c0: 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20  P_RealAffinity, 
f2d0: 69 52 65 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  iReg);.    }.#en
f2e0: 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dif.  }.}../*.**
f2f0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
f300: 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
f310: 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65  Vdbe to evaluate
f320: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
f330: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61  pression and lea
f340: 76 65 73 20 74 68 65 20 72 65 73 75 6c 74 20 69  ves the result i
f350: 6e 20 61 20 72 65 67 69 73 74 65 72 20 6f 6e 20  n a register on 
f360: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  on the stack..**
f370: 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 72 67 65  .** If the targe
f380: 74 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  t register numbe
f390: 72 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 61  r is negative, a
f3a0: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 2a 2a  llocate a new.**
f3b0: 20 72 65 67 69 73 74 65 72 20 74 6f 20 73 74 6f   register to sto
f3c0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 2e 20 20  re the result.  
f3d0: 49 66 20 74 68 65 20 74 61 72 67 65 74 20 72 65  If the target re
f3e0: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 0a 2a 2a  gister number.**
f3f0: 20 69 73 20 7a 65 72 6f 20 74 68 65 6e 20 70 75   is zero then pu
f400: 73 68 20 74 68 65 20 72 65 73 75 6c 74 20 6f 6e  sh the result on
f410: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 20 52  to the stack.  R
f420: 65 74 75 72 6e 20 74 68 65 20 74 61 72 67 65 74  eturn the target
f430: 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6e 75 6d  .** register num
f440: 62 65 72 20 72 65 67 61 72 64 6c 65 73 73 2e 0a  ber regardless..
f450: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
f460: 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
f470: 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
f480: 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
f490: 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
f4a0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
f4b0: 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
f4c0: 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
f4d0: 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
f4e0: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
f4f0: 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
f500: 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
f510: 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
f520: 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
f530: 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
f540: 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
f550: 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
f560: 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
f570: 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
f580: 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
f590: 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
f5a0: 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
f5b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f5c0: 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a  ExprCode(Parse *
f5d0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
f5e0: 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
f5f0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
f600: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
f610: 6e 74 20 6f 70 3b 0a 20 20 69 6e 74 20 69 6e 52  nt op;.  int inR
f620: 65 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 72  eg = 0;.  int or
f630: 69 67 54 61 72 67 65 74 20 3d 20 74 61 72 67 65  igTarget = targe
f640: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 76 21  t;..  assert( v!
f650: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
f660: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
f670: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
f680: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 74  eturn 0;.  if( t
f690: 61 72 67 65 74 3c 30 20 29 7b 0a 20 20 20 20 74  arget<0 ){.    t
f6a0: 61 72 67 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  arget = ++pParse
f6b0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 69  ->nMem;.  }..  i
f6c0: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  f( pExpr==0 ){. 
f6d0: 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b     op = TK_NULL;
f6e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
f6f0: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
f700: 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  }.  switch( op )
f710: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
f720: 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  G_COLUMN: {.    
f730: 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
f740: 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
f750: 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72  gInfo;.      str
f760: 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
f770: 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66  *pCol = &pAggInf
f780: 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  o->aCol[pExpr->i
f790: 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Agg];.      if( 
f7a0: 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63  !pAggInfo->direc
f7b0: 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  tMode ){.       
f7c0: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69   assert( pCol->i
f7d0: 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Mem>0 );.       
f7e0: 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69   inReg = pCol->i
f7f0: 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Mem;.        bre
f800: 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ak;.      }else 
f810: 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73  if( pAggInfo->us
f820: 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20  eSortingIdx ){. 
f830: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f840: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
f850: 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d  olumn, pAggInfo-
f860: 3e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20  >sortingIdx,.   
f870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f880: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
f890: 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20  >iSorterColumn, 
f8a0: 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
f8b0: 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
f8c0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
f8d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
f8e0: 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c   Otherwise, fall
f8f0: 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54   thru into the T
f900: 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f  K_COLUMN case */
f910: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f920: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
f930: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
f940: 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  able<0 ){.      
f950: 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68    /* This only h
f960: 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69  appens when codi
f970: 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61  ng check constra
f980: 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ints */.        
f990: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
f9a0: 63 6b 42 61 73 65 3e 30 20 29 3b 0a 20 20 20 20  ckBase>0 );.    
f9b0: 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70      inReg = pExp
f9c0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61  r->iColumn + pPa
f9d0: 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20  rse->ckBase;.   
f9e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f9f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
fa00: 65 47 65 74 43 6f 6c 75 6d 6e 28 76 2c 20 70 45  eGetColumn(v, pE
fa10: 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20  xpr->pTab,.     
fa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
fa40: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 45 78 70  r->iColumn, pExp
fa50: 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65  r->iTable, targe
fa60: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  t);.        inRe
fa70: 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
fa80: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
fa90: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
faa0: 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
fab0: 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
fac0: 76 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d  v, (char*)pExpr-
fad0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
fae0: 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 2c 20 74 61 72  >token.n, 0, tar
faf0: 67 65 74 29 3b 0a 20 20 20 20 20 20 69 6e 52 65  get);.      inRe
fb00: 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
fb10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
fb20: 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
fb30: 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 52 65  : {.      codeRe
fb40: 61 6c 28 76 2c 20 28 63 68 61 72 2a 29 70 45 78  al(v, (char*)pEx
fb50: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
fb60: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 2c 20  pr->token.n, 0, 
fb70: 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
fb80: 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
fb90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fba0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  }.    case TK_ST
fbb0: 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73 71  RING: {.      sq
fbc0: 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
fbd0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
fbe0: 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
fbf0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 4f  e3VdbeAddOp4(v,O
fc00: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 74 61  P_String8, 0, ta
fc10: 72 67 65 74 2c 20 30 2c 0a 20 20 20 20 20 20 20  rget, 0,.       
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc30: 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
fc40: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
fc50: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 69  oken.n);.      i
fc60: 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
fc70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fc80: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  }.    case TK_NU
fc90: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LL: {.      sqli
fca0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
fcb0: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
fcc0: 67 65 74 29 3b 0a 20 20 20 20 20 20 69 6e 52 65  get);.      inRe
fcd0: 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
fce0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
fcf0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fd00: 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a  IT_BLOB_LITERAL.
fd10: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
fd20: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  : {.      int n;
fd30: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
fd40: 72 20 2a 7a 3b 0a 20 20 20 20 20 20 61 73 73 65  r *z;.      asse
fd50: 72 74 28 20 54 4b 5f 42 4c 4f 42 3d 3d 4f 50 5f  rt( TK_BLOB==OP_
fd60: 48 65 78 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20  HexBlob );.     
fd70: 20 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65   n = pExpr->toke
fd80: 6e 2e 6e 20 2d 20 33 3b 0a 20 20 20 20 20 20 7a  n.n - 3;.      z
fd90: 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d   = (char*)pExpr-
fda0: 3e 74 6f 6b 65 6e 2e 7a 20 2b 20 32 3b 0a 20 20  >token.z + 2;.  
fdb0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30      assert( n>=0
fdc0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d   );.      if( n=
fdd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 20  =0 ){.        z 
fde0: 3d 20 22 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = "";.      }.  
fdf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fe00: 64 64 4f 70 34 28 76 2c 20 6f 70 2c 20 30 2c 20  ddOp4(v, op, 0, 
fe10: 74 61 72 67 65 74 2c 20 30 2c 20 7a 2c 20 6e 29  target, 0, z, n)
fe20: 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  ;.      inReg = 
fe30: 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72  target;.      br
fe40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
fe50: 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  f.    case TK_VA
fe60: 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20  RIABLE: {.      
fe70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fe80: 32 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65  2(v, OP_Variable
fe90: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
fea0: 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
feb0: 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  if( pExpr->token
fec0: 2e 6e 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  .n>1 ){.        
fed0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
fee0: 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP4(v, -1, (char
fef0: 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
ff00: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
ff10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ff20: 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
ff30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ff40: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
ff50: 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
ff60: 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d    inReg = pExpr-
ff70: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 62  >iTable;.      b
ff80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
ff90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ffa0: 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b  CAST.    case TK
ffb0: 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f  _CAST: {.      /
ffc0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  * Expressions of
ffd0: 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53   the form:   CAS
ffe0: 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e  T(pLeft AS token
fff0: 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  ) */.      int a
10000 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20  ff, to_op;.     
10010 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10020 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
10030 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
10040 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69        aff = sqli
10050 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
10060 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a  &pExpr->token);.
10070 20 20 20 20 20 20 74 6f 5f 6f 70 20 3d 20 61 66        to_op = af
10080 66 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f - SQLITE_AFF_T
10090 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b  EXT + OP_ToText;
100a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
100b0 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20  o_op==OP_ToText 
100c0 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
100d0 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 29 3b  E_AFF_TEXT    );
100e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
100f0 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20  o_op==OP_ToBlob 
10100 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
10110 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 29 3b  E_AFF_NONE    );
10120 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
10130 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72  o_op==OP_ToNumer
10140 69 63 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54  ic || aff!=SQLIT
10150 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b  E_AFF_NUMERIC );
10160 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
10170 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20  o_op==OP_ToInt  
10180 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
10190 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
101a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
101b0 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20  o_op==OP_ToReal 
101c0 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
101d0 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 29 3b  E_AFF_REAL    );
101e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
101f0 62 65 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f  beAddOp1(v, to_o
10200 70 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  p, target);.    
10210 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
10220 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10230 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
10240 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20  QLITE_OMIT_CAST 
10250 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
10260 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
10270 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
10280 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
10290 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
102a0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
102b0 51 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  Q: {.      int r
102c0 31 2c 20 72 32 3b 0a 20 20 20 20 20 20 61 73 73  1, r2;.      ass
102d0 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  ert( TK_LT==OP_L
102e0 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
102f0 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20  t( TK_LE==OP_Le 
10300 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10310 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b   TK_GT==OP_Gt );
10320 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
10330 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  K_GE==OP_Ge );. 
10340 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
10350 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20  EQ==OP_Eq );.   
10360 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45     assert( TK_NE
10370 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ne );.     
10380 20 69 66 28 20 74 61 72 67 65 74 3e 30 20 29 7b   if( target>0 ){
10390 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
103a0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d   target;.      }
103b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
103c0 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Reg = ++pParse->
103d0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nMem;.      }.  
103e0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
103f0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
10400 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 2d   pExpr->pLeft, -
10410 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
10420 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
10430 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
10440 69 67 68 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20  ight, -1);.     
10450 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
10460 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
10470 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
10480 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
10490 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
104a0 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54  inReg, SQLITE_ST
104b0 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 62 72  OREP2);.      br
104c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
104d0 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20  ase TK_AND:.    
104e0 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
104f0 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20  case TK_PLUS:.  
10500 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a    case TK_STAR:.
10510 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55      case TK_MINU
10520 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  S:.    case TK_R
10530 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EM:.    case TK_
10540 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  BITAND:.    case
10550 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63   TK_BITOR:.    c
10560 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20  ase TK_SLASH:.  
10570 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
10580 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  :.    case TK_RS
10590 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20  HIFT: .    case 
105a0 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20  TK_CONCAT: {.   
105b0 20 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 20     int r1, r2;. 
105c0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
105d0 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20  AND==OP_And );. 
105e0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
105f0 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20  OR==OP_Or );.   
10600 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c     assert( TK_PL
10610 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20  US==OP_Add );.  
10620 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d      assert( TK_M
10630 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63  INUS==OP_Subtrac
10640 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
10650 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65  t( TK_REM==OP_Re
10660 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20  mainder );.     
10670 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41   assert( TK_BITA
10680 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b  ND==OP_BitAnd );
10690 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
106a0 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f  K_BITOR==OP_BitO
106b0 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
106c0 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f  t( TK_SLASH==OP_
106d0 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20  Divide );.      
106e0 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46  assert( TK_LSHIF
106f0 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20  T==OP_ShiftLeft 
10700 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10710 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_RSHIFT==OP_S
10720 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20  hiftRight );.   
10730 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f     assert( TK_CO
10740 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20  NCAT==OP_Concat 
10750 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
10760 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
10770 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
10780 66 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 72  ft, -1);.      r
10790 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
107a0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
107b0 72 2d 3e 70 52 69 67 68 74 2c 20 2d 31 29 3b 0a  r->pRight, -1);.
107c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
107d0 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72  eAddOp3(v, op, r
107e0 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
107f0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
10800 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61  rget;.      brea
10810 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
10820 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
10830 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
10840 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
10850 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10860 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66  Left );.      if
10870 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
10880 46 4c 4f 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e  FLOAT || pLeft->
10890 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
108a0 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20  {.        Token 
108b0 2a 70 20 3d 20 26 70 4c 65 66 74 2d 3e 74 6f 6b  *p = &pLeft->tok
108c0 65 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  en;.        if( 
108d0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
108e0 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OAT ){.         
108f0 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 28 63 68   codeReal(v, (ch
10900 61 72 2a 29 70 2d 3e 7a 2c 20 70 2d 3e 6e 2c 20  ar*)p->z, p->n, 
10910 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
10920 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10930 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
10940 28 76 2c 20 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  (v, (char*)p->z,
10950 20 70 2d 3e 6e 2c 20 31 2c 20 74 61 72 67 65 74   p->n, 1, target
10960 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
10970 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10980 20 20 69 6e 74 20 72 31 20 3d 20 2b 2b 70 50 61    int r1 = ++pPa
10990 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
109a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
109b0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
109c0 65 72 2c 20 30 2c 20 72 31 29 3b 0a 20 20 20 20  er, 0, r1);.    
109d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
109e0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
109f0 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
10a00 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10a10 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
10a20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 74 61 72  OP_Subtract, tar
10a30 67 65 74 2c 20 72 31 2c 20 74 61 72 67 65 74 29  get, r1, target)
10a40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10a50 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
10a60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10a70 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
10a80 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ITNOT:.    case 
10a90 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
10aa0 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f  assert( TK_BITNO
10ab0 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a  T==OP_BitNot );.
10ac0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
10ad0 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a  _NOT==OP_Not );.
10ae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
10af0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
10b00 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a  xpr->pLeft, 0);.
10b10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10b20 65 41 64 64 4f 70 30 28 76 2c 20 6f 70 29 3b 0a  eAddOp0(v, op);.
10b30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10b40 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
10b50 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
10b60 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
10b70 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
10b80 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
10b90 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
10ba0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
10bb0 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50  ( TK_NOTNULL==OP
10bc0 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  _NotNull );.    
10bd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10be0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
10bf0 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
10c00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
10c10 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
10c20 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20  pr->pLeft, 0);. 
10c30 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
10c40 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
10c50 20 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   op);.      sqli
10c60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10c70 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67   OP_AddImm, targ
10c80 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73  et, -1);.      s
10c90 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
10ca0 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
10cb0 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
10cc0 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
10cd0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
10ce0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
10cf0 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
10d00 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  *pInfo = pExpr->
10d10 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
10d20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a  if( pInfo==0 ){.
10d30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
10d40 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10d50 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
10d60 67 61 74 65 3a 20 25 54 22 2c 0a 20 20 20 20 20  gate: %T",.     
10d70 20 20 20 20 20 20 20 26 70 45 78 70 72 2d 3e 73         &pExpr->s
10d80 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pan);.      }els
10d90 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  e{.        inReg
10da0 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b   = pInfo->aFunc[
10db0 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65  pExpr->iAgg].iMe
10dc0 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
10dd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10de0 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f    case TK_CONST_
10df0 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54  FUNC:.    case T
10e00 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
10e10 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
10e20 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
10e30 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45  st;.      int nE
10e40 78 70 72 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c  xpr = pList ? pL
10e50 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  ist->nExpr : 0;.
10e60 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
10e70 44 65 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  Def;.      int n
10e80 49 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  Id;.      const 
10e90 63 68 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20  char *zId;.     
10ea0 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d   int constMask =
10eb0 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   0;.      int i;
10ec0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
10ed0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10ee0 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20  .      u8 enc = 
10ef0 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 43  ENC(db);.      C
10f00 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
10f10 30 3b 0a 0a 20 20 20 20 20 20 7a 49 64 20 3d 20  0;..      zId = 
10f20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
10f30 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64  ken.z;.      nId
10f40 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e   = pExpr->token.
10f50 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  n;.      pDef = 
10f60 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
10f70 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ion(pParse->db, 
10f80 7a 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c  zId, nId, nExpr,
10f90 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
10fa0 61 73 73 65 72 74 28 20 70 44 65 66 21 3d 30 20  assert( pDef!=0 
10fb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
10fc0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45  st ){.        nE
10fd0 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  xpr = pList->nEx
10fe0 70 72 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  pr;.        sqli
10ff0 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
11000 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
11010 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  t, 0);.      }el
11020 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 45 78 70  se{.        nExp
11030 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  r = 0;.      }.#
11040 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11050 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
11060 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
11070 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66  y overload the f
11080 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66  unction if the f
11090 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
110a0 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74  .      ** a virt
110b0 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ual table column
110c0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
110d0 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75   ** For infix fu
110e0 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47  nctions (LIKE, G
110f0 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64  LOB, REGEXP, and
11100 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a   MATCH) use the.
11110 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
11120 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68  argument, not th
11130 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20  e first, as the 
11140 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74  argument to test
11150 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65   to.      ** see
11160 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75   if it is a colu
11170 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20  mn in a virtual 
11180 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20  table.  This is 
11190 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20  done because.   
111a0 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f     ** the left o
111b0 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20  perand of infix 
111c0 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f  functions (the o
111d0 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74  perand we want t
111e0 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72  o.      ** contr
111f0 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20  ol overloading) 
11200 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73  ends up as the s
11210 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
11220 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  o the.      ** f
11230 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78  unction.  The ex
11240 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62  pression "A glob
11250 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e   B" is equivalen
11260 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22  t to .      ** "
11270 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77  glob(B,A).  We w
11280 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41  ant to use the A
11290 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74   in "A glob B" t
112a0 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20  o test.      ** 
112b0 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65  for function ove
112c0 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77  rloading.  But w
112d0 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d  e use the B term
112e0 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e   in "glob(B,A)".
112f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
11300 69 66 28 20 6e 45 78 70 72 3e 3d 32 20 26 26 20  if( nExpr>=2 && 
11310 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
11320 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b  EP_InfixFunc) ){
11330 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
11340 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
11350 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
11360 70 44 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69  pDef, nExpr, pLi
11370 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b  st->a[1].pExpr);
11380 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
11390 20 6e 45 78 70 72 3e 30 20 29 7b 0a 20 20 20 20   nExpr>0 ){.    
113a0 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
113b0 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
113c0 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
113d0 20 6e 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61   nExpr, pList->a
113e0 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
113f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
11400 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
11410 72 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b  r && i<32; i++){
11420 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
11430 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
11440 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  nt(pList->a[i].p
11450 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
11460 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20     constMask |= 
11470 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20  (1<<i);.        
11480 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44  }.        if( pD
11490 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20  ef->needCollSeq 
114a0 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  && !pColl ){.   
114b0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
114c0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
114d0 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  q(pParse, pList-
114e0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
114f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11500 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
11510 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20  needCollSeq ){. 
11520 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
11530 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72  l ) pColl = pPar
11540 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
11550 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l; .        sqli
11560 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
11570 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
11580 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
11590 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
115a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
115b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
115c0 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  4(v, OP_Function
115d0 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 30 2c 20  , constMask, 0, 
115e0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
115f0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
11600 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44  *)pDef, P4_FUNCD
11610 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EF);.      sqlit
11620 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
11630 2c 20 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , nExpr);.      
11640 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
11650 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11660 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
11670 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
11680 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
11690 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
116a0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20  xpr->iColumn==0 
116b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
116c0 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
116d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
116e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e        }.      in
116f0 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Reg = pExpr->iCo
11700 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 62 72 65 61  lumn;.      brea
11710 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
11720 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
11730 20 69 6e 74 20 6a 31 2c 20 6a 32 2c 20 6a 33 2c   int j1, j2, j3,
11740 20 6a 34 2c 20 6a 35 3b 0a 20 20 20 20 20 20 63   j4, j5;.      c
11750 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20  har affinity;.  
11760 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 0a      int eType;..
11770 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 73 71        eType = sq
11780 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
11790 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
117a0 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69  0);..      /* Fi
117b0 67 75 72 65 20 6f 75 74 20 74 68 65 20 61 66 66  gure out the aff
117c0 69 6e 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20  inity to use to 
117d0 63 72 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f  create a key fro
117e0 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  m the results.  
117f0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78      ** of the ex
11800 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69  pression. affini
11810 74 79 53 74 72 20 73 74 6f 72 65 73 20 61 20 73  tyStr stores a s
11820 74 61 74 69 63 20 73 74 72 69 6e 67 20 73 75 69  tatic string sui
11830 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 20 20  table for.      
11840 2a 2a 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65  ** P4 of OP_Make
11850 52 65 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f  Record..      */
11860 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20  .      affinity 
11870 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  = comparisonAffi
11880 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20  nity(pExpr);..  
11890 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
118a0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp1(v, OP_Inte
118b0 67 65 72 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20  ger, 1);..      
118c0 2f 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70  /* Code the <exp
118d0 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20  r> from "<expr> 
118e0 49 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74  IN (...)". The t
118f0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20  emporary table. 
11900 20 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69       ** pExpr->i
11910 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74  Table contains t
11920 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d  he values that m
11930 61 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29  ake up the (...)
11940 20 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   set..      */. 
11950 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
11960 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
11970 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20  pr->pLeft, 0);. 
11980 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11990 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 53 43 6f  AddOp0(v, OP_SCo
119a0 70 79 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20  py);.      j1 = 
119b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
119c0 30 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 29  0(v, OP_NotNull)
119d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
119e0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
119f0 50 6f 70 2c 20 32 29 3b 0a 20 20 20 20 20 20 73  Pop, 2);.      s
11a00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
11a10 28 76 2c 20 4f 50 5f 4e 75 6c 6c 29 3b 0a 20 20  (v, OP_Null);.  
11a20 20 20 20 20 6a 32 20 20 3d 20 73 71 6c 69 74 65      j2  = sqlite
11a30 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
11a40 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 73  P_Goto);.      s
11a50 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
11a60 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20  re(v, j1);.     
11a70 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
11a80 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20  NDEX_ROWID ){.  
11a90 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c 69 74        j3 = sqlit
11aa0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
11ab0 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c  OP_MustBeInt, 0,
11ac0 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20   0, 1);.        
11ad0 6a 34 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j4 = sqlite3Vdbe
11ae0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp1(v, OP_Not
11af0 45 78 69 73 74 73 2c 20 70 45 78 70 72 2d 3e 69  Exists, pExpr->i
11b00 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  Table);.        
11b10 6a 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j5 = sqlite3Vdbe
11b20 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
11b30 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
11b40 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
11b50 76 2c 20 6a 33 29 3b 0a 20 20 20 20 20 20 20 20  v, j3);.        
11b60 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
11b70 65 72 65 28 76 2c 20 6a 34 29 3b 0a 20 20 20 20  ere(v, j4);.    
11b80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11b90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11ba0 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
11bb0 6f 72 64 2c 20 31 2c 20 30 2c 20 30 2c 20 26 61  ord, 1, 0, 0, &a
11bc0 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
11bd0 20 20 20 20 20 6a 35 20 3d 20 73 71 6c 69 74 65       j5 = sqlite
11be0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11bf0 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
11c00 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d  iTable);.      }
11c10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11c20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
11c30 64 64 49 6d 6d 2c 20 30 2c 20 2d 31 29 3b 0a 20  ddImm, 0, -1);. 
11c40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11c50 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32 29 3b  JumpHere(v, j2);
11c60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11c70 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 35  beJumpHere(v, j5
11c80 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
11c90 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
11ca0 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
11cb0 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
11cc0 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
11cd0 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75  Left;.      stru
11ce0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
11cf0 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72   *pLItem = pExpr
11d00 2d 3e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  ->pList->a;.    
11d10 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
11d20 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a   pLItem->pExpr;.
11d30 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32        int r1, r2
11d40 2c 20 72 33 2c 20 72 34 2c 20 72 35 3b 0a 0a 20  , r3, r4, r5;.. 
11d50 20 20 20 20 20 69 66 28 20 74 61 72 67 65 74 3e       if( target>
11d60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 52  0 ){.        inR
11d70 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
11d80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11d90 20 20 69 6e 52 65 67 20 3d 20 2b 2b 70 50 61 72    inReg = ++pPar
11da0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
11db0 7d 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  }.      r1 = sql
11dc0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
11dd0 72 73 65 2c 20 70 4c 65 66 74 2c 20 2d 31 29 3b  rse, pLeft, -1);
11de0 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
11df0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
11e00 73 65 2c 20 70 52 69 67 68 74 2c 20 2d 31 29 3b  se, pRight, -1);
11e10 0a 20 20 20 20 20 20 72 33 20 3d 20 2b 2b 70 50  .      r3 = ++pP
11e20 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
11e30 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
11e40 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
11e50 67 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20  ght, OP_Ge,.    
11e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
11e70 2c 20 72 32 2c 20 72 33 2c 20 53 51 4c 49 54 45  , r2, r3, SQLITE
11e80 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20  _STOREP2);.     
11e90 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20   pLItem++;.     
11ea0 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d   pRight = pLItem
11eb0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->pExpr;.      r
11ec0 34 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  4 = sqlite3ExprC
11ed0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
11ee0 68 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 72  ht, -1);.      r
11ef0 35 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  5 = ++pParse->nM
11f00 65 6d 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  em;.      codeCo
11f10 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
11f20 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
11f30 4c 65 2c 20 72 31 2c 20 72 34 2c 20 72 35 2c 20  Le, r1, r4, r5, 
11f40 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b  SQLITE_STOREP2);
11f50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11f60 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41  beAddOp3(v, OP_A
11f70 6e 64 2c 20 72 33 2c 20 72 35 2c 20 69 6e 52 65  nd, r3, r5, inRe
11f80 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
11f90 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
11fa0 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
11fb0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
11fc0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
11fd0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
11fe0 6f 72 69 67 54 61 72 67 65 74 29 3b 0a 20 20 20  origTarget);.   
11ff0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
12000 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45      case TK_CASE
12010 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78  : {.      int ex
12020 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a 20 20  pr_end_label;.  
12030 20 20 20 20 69 6e 74 20 6a 75 6d 70 49 6e 73 74      int jumpInst
12040 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  ;.      int nExp
12050 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  r;.      int i;.
12060 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
12070 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 74  pEList;.      st
12080 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
12090 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 0a 0a  em *aListelem;..
120a0 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78        assert(pEx
120b0 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20  pr->pList);.    
120c0 20 20 61 73 73 65 72 74 28 28 70 45 78 70 72 2d    assert((pExpr-
120d0 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25 20  >pList->nExpr % 
120e0 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20  2) == 0);.      
120f0 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c  assert(pExpr->pL
12100 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b  ist->nExpr > 0);
12110 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
12120 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
12130 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20      aListelem = 
12140 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  pEList->a;.     
12150 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   nExpr = pEList-
12160 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 78  >nExpr;.      ex
12170 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d 20 73  pr_end_label = s
12180 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
12190 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66  bel(v);.      if
121a0 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
121b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
121c0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
121d0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
121e0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
121f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
12200 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20  pr; i=i+2){.    
12210 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
12220 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73  ode(pParse, aLis
12230 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 2c 20  telem[i].pExpr, 
12240 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
12250 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a  pExpr->pLeft ){.
12260 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12270 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12280 50 5f 53 43 6f 70 79 2c 20 2d 31 29 3b 0a 20 20  P_SCopy, -1);.  
12290 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74          jumpInst
122a0 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70   = codeCompare(p
122b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
122c0 65 66 74 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69  eft, aListelem[i
122d0 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ].pExpr,.       
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122f0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 2c            OP_Ne,
12300 20 30 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45   0, 0, 0, SQLITE
12310 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
12320 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12330 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
12340 50 6f 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  Pop, 1);.       
12350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12360 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20 73 71 6c    jumpInst = sql
12370 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
12380 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 30 2c 20 30  , OP_IfNot, 0, 0
12390 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 1);.        }.
123a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
123b0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
123c0 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
123d0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
123e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
123f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
12400 6f 74 6f 2c 20 30 2c 20 65 78 70 72 5f 65 6e 64  oto, 0, expr_end
12410 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20  _label);.       
12420 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
12430 48 65 72 65 28 76 2c 20 6a 75 6d 70 49 6e 73 74  Here(v, jumpInst
12440 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12450 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
12460 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
12470 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12480 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
12490 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
124a0 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  f( pExpr->pRight
124b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
124c0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
124d0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
124e0 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
124f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12500 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12510 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
12520 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
12530 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
12540 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
12550 28 76 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62  (v, expr_end_lab
12560 65 6c 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  el);.      inReg
12570 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
12580 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
12590 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
125a0 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61  T_TRIGGER.    ca
125b0 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20  se TK_RAISE: {. 
125c0 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65       if( !pParse
125d0 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20  ->trigStack ){. 
125e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
125f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
12600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12610 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d        "RAISE() m
12620 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
12630 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
12640 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  -program");.    
12650 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
12660 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
12670 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pExpr->iColumn!=
12680 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20  OE_Ignore ){.   
12690 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
126a0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f 45  xpr->iColumn==OE
126b0 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20 20  _Rollback ||.   
126c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
126d0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20  xpr->iColumn == 
126e0 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 20 20 20 20  OE_Abort ||.    
126f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
12700 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f  pr->iColumn == O
12710 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20 20 20  E_Fail );.      
12720 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
12730 65 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62  eExpr(pParse->db
12740 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
12750 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12760 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  dOp4(v, OP_Halt,
12770 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
12780 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  NT, pExpr->iColu
12790 6d 6e 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  mn, 0,.         
127a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
127b0 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
127c0 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
127d0 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 20 65  en.n);.      } e
127e0 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 61  lse {.         a
127f0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
12800 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f  olumn == OE_Igno
12810 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73  re );.         s
12820 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12830 28 76 2c 20 4f 50 5f 43 6f 6e 74 65 78 74 50 6f  (v, OP_ContextPo
12840 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
12850 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12860 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
12870 20 30 2c 20 70 50 61 72 73 65 2d 3e 74 72 69 67   0, pParse->trig
12880 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d  Stack->ignoreJum
12890 70 29 3b 0a 20 20 20 20 20 20 20 20 20 56 64 62  p);.         Vdb
128a0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 61  eComment((v, "ra
128b0 69 73 65 28 49 47 4e 4f 52 45 29 22 29 29 3b 0a  ise(IGNORE)"));.
128c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
128d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
128e0 66 0a 20 20 7d 0a 20 20 69 66 28 20 69 6e 52 65  f.  }.  if( inRe
128f0 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20  g!=target ){.   
12900 20 69 66 28 20 6f 72 69 67 54 61 72 67 65 74 21   if( origTarget!
12910 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  =-1 ){.      sql
12920 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12930 2c 20 28 69 6e 52 65 67 3e 30 20 3f 20 4f 50 5f  , (inReg>0 ? OP_
12940 53 43 6f 70 79 20 3a 20 4f 50 5f 4d 6f 76 65 29  SCopy : OP_Move)
12950 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
12960 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12970 20 20 20 74 61 72 67 65 74 20 3d 20 69 6e 52 65     target = inRe
12980 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  g;.    }.  }.  r
12990 65 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 7d 0a  eturn target;.}.
129a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
129b0 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 2f 2a 0a  OMIT_TRIGGER./*.
129c0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
129d0 20 74 68 61 74 20 65 76 61 6c 75 74 65 73 20 74   that evalutes t
129e0 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
129f0 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65 73 20 74  ion and leaves t
12a00 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20  he result.** on 
12a10 74 68 65 20 73 74 61 63 6b 2e 20 20 53 65 65 20  the stack.  See 
12a20 61 6c 73 6f 20 73 71 6c 69 74 65 33 45 78 70 72  also sqlite3Expr
12a30 43 6f 64 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Code()..**.** Th
12a40 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
12a50 20 61 6c 73 6f 20 63 61 63 68 65 20 74 68 65 20   also cache the 
12a60 72 65 73 75 6c 74 20 61 6e 64 20 6d 6f 64 69 66  result and modif
12a70 79 20 74 68 65 20 70 45 78 70 72 20 74 72 65 65  y the pExpr tree
12a80 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 77  .** so that it w
12a90 69 6c 6c 20 6d 61 6b 65 20 75 73 65 20 6f 66 20  ill make use of 
12aa0 74 68 65 20 63 61 63 68 65 64 20 72 65 73 75 6c  the cached resul
12ab0 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20  t on subsequent 
12ac0 65 76 61 6c 75 61 74 69 6f 6e 73 0a 2a 2a 20 72  evaluations.** r
12ad0 61 74 68 65 72 20 74 68 61 6e 20 65 76 61 6c 75  ather than evalu
12ae0 61 74 65 20 74 68 65 20 77 68 6f 6c 65 20 65 78  ate the whole ex
12af0 70 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 2e 20  pression again. 
12b00 20 54 72 69 76 69 61 6c 20 65 78 70 72 65 73 73   Trivial express
12b10 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20  ions are.** not 
12b20 63 61 63 68 65 64 2e 20 20 49 66 20 74 68 65 20  cached.  If the 
12b30 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 61  expression is ca
12b40 63 68 65 64 2c 20 69 74 73 20 72 65 73 75 6c 74  ched, its result
12b50 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20   is stored in a 
12b60 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  .** memory locat
12b70 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
12b80 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43  ite3ExprCodeAndC
12b90 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
12ba0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
12bb0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
12bc0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 56  arse->pVdbe;.  V
12bd0 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 6e  dbeOp *pOp;.  in
12be0 74 20 69 4d 65 6d 3b 0a 20 20 69 6e 74 20 61 64  t iMem;.  int ad
12bf0 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 69 66  dr1, addr2;.  if
12c00 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
12c10 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
12c20 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
12c30 72 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  r(v);.  sqlite3E
12c40 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
12c50 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 61 64 64  pExpr, 0);.  add
12c60 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
12c70 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
12c80 20 20 69 66 28 20 61 64 64 72 32 3e 61 64 64 72    if( addr2>addr
12c90 31 2b 31 0a 20 20 20 7c 7c 20 28 28 70 4f 70 20  1+1.   || ((pOp 
12ca0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
12cb0 4f 70 28 76 2c 20 61 64 64 72 31 29 29 21 3d 30  Op(v, addr1))!=0
12cc0 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d   && pOp->opcode=
12cd0 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 29 20 29 7b  =OP_Function) ){
12ce0 0a 20 20 20 20 69 4d 65 6d 20 3d 20 70 45 78 70  .    iMem = pExp
12cf0 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50  r->iTable = ++pP
12d00 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
12d10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12d20 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 30 2c  2(v, OP_Copy, 0,
12d30 20 69 4d 65 6d 29 3b 0a 20 20 20 20 70 45 78 70   iMem);.    pExp
12d40 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  r->op = TK_REGIS
12d50 54 45 52 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  TER;.  }.}.#endi
12d60 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
12d70 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68  e code that push
12d80 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  es the value of 
12d90 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66  every element of
12da0 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
12db0 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 6f 6e  pression list on
12dc0 74 6f 20 74 68 65 20 73 74 61 63 6b 20 69 66 20  to the stack if 
12dd0 74 61 72 67 65 74 3d 3d 30 20 6f 72 20 69 6e 74  target==0 or int
12de0 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 0a  o a sequence of.
12df0 2a 2a 20 72 65 67 69 73 74 65 72 73 20 62 65 67  ** registers beg
12e00 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74  inning at target
12e10 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
12e20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
12e30 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e  ments evaluated.
12e40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
12e50 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
12e60 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
12e70 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
12e80 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
12e90 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
12ea0 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
12eb0 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f  on list to be co
12ec0 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72  ded */.  int tar
12ed0 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 57  get         /* W
12ee0 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72 65  here to write re
12ef0 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 74  sults */.){.  st
12f00 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
12f10 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
12f20 20 69 2c 20 6e 2c 20 69 6e 63 72 20 3d 20 31 3b   i, n, incr = 1;
12f30 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
12f40 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  !=0 || pParse->d
12f50 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12f60 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  );.  if( pList==
12f70 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
12f80 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
12f90 20 74 61 72 67 65 74 3e 3d 30 20 29 3b 0a 20 20   target>=0 );.  
12fa0 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
12fb0 3b 0a 20 20 69 66 28 20 74 61 72 67 65 74 3d 3d  ;.  if( target==
12fc0 30 20 29 7b 0a 20 20 20 20 69 6e 63 72 20 3d 20  0 ){.    incr = 
12fd0 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 49 74  0;.  }.  for(pIt
12fe0 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 6e  em=pList->a, i=n
12ff0 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
13000 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
13010 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
13020 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  , pItem->pExpr, 
13030 74 61 72 67 65 74 29 3b 0a 20 20 20 20 74 61 72  target);.    tar
13040 67 65 74 20 2b 3d 20 69 6e 63 72 3b 20 0a 20 20  get += incr; .  
13050 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
13060 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
13070 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
13080 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
13090 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
130a0 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
130b0 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
130c0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
130d0 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63  is true but exec
130e0 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
130f0 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
13100 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
13110 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a  on is false..**.
13120 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
13130 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
13140 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
13150 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c  true nor false),
13160 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68   then.** take th
13170 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75  e jump if the ju
13180 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73  mpIfNull flag is
13190 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
131a0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  LL..**.** This c
131b0 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ode depends on t
131c0 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72  he fact that cer
131d0 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65  tain token value
131e0 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a  s (ex: TK_EQ).**
131f0 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73   are the same as
13200 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28   opcode values (
13210 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20  ex: OP_Eq) that 
13220 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
13230 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f  rresponding.** o
13240 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69  peration.  Speci
13250 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76  al comments in v
13260 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b  dbe.c and the mk
13270 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69  opcodeh.awk scri
13280 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b  pt in.** the mak
13290 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20  e process cause 
132a0 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20  these values to 
132b0 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29  align.  Assert()
132c0 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a  s in the code.**
132d0 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68   below verify th
132e0 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61  at the numbers a
132f0 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65  re aligned corre
13300 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ctly..*/.void sq
13310 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
13320 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
13330 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
13340 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
13350 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
13360 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
13370 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
13380 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
13390 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
133a0 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
133b0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
133c0 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
133d0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f  =0 ) return;.  o
133e0 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
133f0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
13400 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
13410 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
13420 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
13430 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
13440 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
13450 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
13460 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70  ->pLeft, d2,jump
13470 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55  IfNull^SQLITE_JU
13480 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
13490 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
134a0 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
134b0 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
134c0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
134d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
134e0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
134f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13500 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
13510 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  K_OR: {.      sq
13520 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
13530 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
13540 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
13550 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
13560 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
13570 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
13580 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
13590 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
135a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
135b0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
135c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
135d0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
135e0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
135f0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
13600 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13610 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
13620 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
13630 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
13640 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
13650 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
13660 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
13670 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73  K_EQ: {.      as
13680 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f  sert( TK_LT==OP_
13690 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Lt );.      asse
136a0 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  rt( TK_LE==OP_Le
136b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
136c0 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29  ( TK_GT==OP_Gt )
136d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
136e0 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a  TK_GE==OP_Ge );.
136f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
13700 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20  _EQ==OP_Eq );.  
13710 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
13720 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20  E==OP_Ne );.    
13730 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
13740 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
13750 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20  >pLeft, 0);.    
13760 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
13770 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
13780 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20  >pRight, 0);.   
13790 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
137a0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
137b0 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
137c0 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
137d0 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
137e0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
137f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13800 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
13810 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
13820 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
13830 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
13840 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e  K_ISNULL==OP_IsN
13850 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ull );.      ass
13860 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
13870 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
13880 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13890 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
138a0 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20  pr->pLeft, 0);. 
138b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
138c0 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 30 2c  AddOp2(v, op, 0,
138d0 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
138e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
138f0 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
13900 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
13910 78 70 72 65 73 73 69 6f 6e 20 22 78 20 42 45 54  xpression "x BET
13920 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 20 69 73  WEEN y AND z" is
13930 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a   implemented as:
13940 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
13950 2a 2a 20 31 20 49 46 20 28 78 20 3c 20 79 29 20  ** 1 IF (x < y) 
13960 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20  GOTO 3.      ** 
13970 32 20 49 46 20 28 78 20 3c 3d 20 7a 29 20 47 4f  2 IF (x <= z) GO
13980 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20  TO <dest>.      
13990 2a 2a 20 33 20 2e 2e 2e 0a 20 20 20 20 20 20 2a  ** 3 ....      *
139a0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
139b0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
139c0 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
139d0 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ft;.      Expr *
139e0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
139f0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
13a00 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
13a10 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
13a20 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20   pLeft, 0);.    
13a30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13a40 4f 70 30 28 76 2c 20 4f 50 5f 43 6f 70 79 29 3b  Op0(v, OP_Copy);
13a50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
13a60 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
13a70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
13a80 20 61 64 64 72 20 3d 20 63 6f 64 65 43 6f 6d 70   addr = codeComp
13a90 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
13aa0 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 74  t, pRight, OP_Lt
13ab0 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  , 0, 0, 0,.     
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ad0 20 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 5e      jumpIfNull ^
13ae0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
13af0 4c 4c 29 3b 0a 0a 20 20 20 20 20 20 70 52 69 67  LL);..      pRig
13b00 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
13b10 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
13b20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13b30 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
13b40 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 63  ght, 0);.      c
13b50 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
13b60 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
13b70 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 30 2c 20 64  , OP_Le, 0, 0, d
13b80 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
13b90 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
13ba0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13bb0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
13bc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13bd0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
13be0 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dr);.      sqlit
13bf0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13c00 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
13c10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13c20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
13c30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
13c40 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
13c50 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
13c60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13c70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 64  3(v, OP_If, 0, d
13c80 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
13c90 3d 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  =0);.      break
13ca0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
13cb0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
13cc0 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
13cd0 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
13ce0 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
13cf0 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
13d00 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
13d10 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
13d20 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75   false but execu
13d30 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
13d40 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
13d50 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
13d60 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  n is true..**.**
13d70 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
13d80 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
13d90 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
13da0 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68  ue nor false) th
13db0 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75  en.** jump if ju
13dc0 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49  mpIfNull is SQLI
13dd0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72  TE_JUMPIFNULL or
13de0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66   fall through if
13df0 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69   jumpIfNull.** i
13e00 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s 0..*/.void sql
13e10 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
13e20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
13e30 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
13e40 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
13e50 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
13e60 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
13e70 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
13e80 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
13e90 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
13ea0 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
13eb0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
13ec0 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
13ed0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
13ee0 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
13ef0 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70  pExpr->op and op
13f00 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20   are related as 
13f10 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
13f20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  **       pExpr->
13f30 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70  op            op
13f40 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d  .  **       ----
13f50 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d  -----          -
13f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20  ---------.  **  
13f70 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20       TK_ISNULL  
13f80 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75          OP_NotNu
13f90 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
13fa0 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20  _NOTNULL        
13fb0 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20   OP_IsNull.  ** 
13fc0 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20        TK_NE     
13fd0 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20           OP_Eq. 
13fe0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20   **       TK_EQ 
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
14000 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Ne.  **       TK
14010 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _GT             
14020 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Le.  **     
14030 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20    TK_LE         
14040 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20       OP_Gt.  ** 
14050 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20        TK_GE     
14060 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20           OP_Lt. 
14070 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20   **       TK_LT 
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
14090 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  Ge.  **.  ** For
140a0 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   other values of
140b0 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69   pExpr->op, op i
140c0 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20  s undefined and 
140d0 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65  unused..  ** The
140e0 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e   value of TK_ an
140f0 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20  d OP_ constants 
14100 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63  are arranged suc
14110 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63  h that we.  ** c
14120 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d  an compute the m
14130 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69  apping above usi
14140 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
14150 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a   expression..  *
14160 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69  * Assert()s veri
14170 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70  fy that the comp
14180 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65  utation is corre
14190 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  ct..  */.  op = 
141a0 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f  ((pExpr->op+(TK_
141b0 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54  ISNULL&1))^1)-(T
141c0 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20  K_ISNULL&1);..  
141d0 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63  /* Verify correc
141e0 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54  t alignment of T
141f0 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
14200 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ants.  */.  asse
14210 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
14220 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  K_ISNULL || op==
14230 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
14240 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
14250 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c  p!=TK_NOTNULL ||
14260 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29   op==OP_IsNull )
14270 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
14280 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20  r->op!=TK_NE || 
14290 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61  op==OP_Eq );.  a
142a0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
142b0 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_EQ || op==O
142c0 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ne );.  assert
142d0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
142e0 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20  LT || op==OP_Ge 
142f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
14300 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  pr->op!=TK_LE ||
14310 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20   op==OP_Gt );.  
14320 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
14330 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_GT || op==
14340 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Le );.  asser
14350 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
14360 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74  _GE || op==OP_Lt
14370 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
14380 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
14390 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
143a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
143b0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
143c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
143d0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
143e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
143f0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
14400 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
14410 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
14420 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
14430 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14440 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69  TK_OR: {.      i
14450 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
14460 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
14470 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14480 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
14490 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
144a0 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51  2, jumpIfNull^SQ
144b0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
144c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
144d0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
144e0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
144f0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
14500 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
14510 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
14520 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
14530 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14540 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
14550 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14560 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
14570 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
14580 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
14590 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
145a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
145b0 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
145c0 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
145d0 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
145e0 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
145f0 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
14600 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  _EQ: {.      sql
14610 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
14620 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
14630 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 0);.      sql
14640 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
14650 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
14660 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f  ht, 0);.      co
14670 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
14680 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
14690 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
146a0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
146b0 20 20 20 20 20 30 2c 20 30 2c 20 64 65 73 74 2c       0, 0, dest,
146c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
146d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
146e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
146f0 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
14700 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
14710 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
14720 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
14730 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20  >pLeft, 0);.    
14740 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14750 4f 70 32 28 76 2c 20 6f 70 2c 20 30 2c 20 64 65  Op2(v, op, 0, de
14760 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
14770 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14780 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
14790 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
147a0 65 73 73 69 6f 6e 20 69 73 20 22 78 20 42 45 54  ession is "x BET
147b0 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 2e 20 49  WEEN y AND z". I
147c0 74 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  t is implemented
147d0 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   as:.      **.  
147e0 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78 20 3e      ** 1 IF (x >
147f0 3d 20 79 29 20 47 4f 54 4f 20 33 0a 20 20 20 20  = y) GOTO 3.    
14800 20 20 2a 2a 20 32 20 47 4f 54 4f 20 3c 64 65 73    ** 2 GOTO <des
14810 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 49 46  t>.      ** 3 IF
14820 20 28 78 20 3e 20 7a 29 20 47 4f 54 4f 20 3c 64   (x > z) GOTO <d
14830 65 73 74 3e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  est>.      */.  
14840 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
14850 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
14860 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
14870 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
14880 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
14890 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
148a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
148b0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65  Code(pParse, pLe
148c0 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ft, 0);.      sq
148d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
148e0 76 2c 20 4f 50 5f 43 6f 70 79 29 3b 0a 20 20 20  v, OP_Copy);.   
148f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
14900 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
14910 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64  t, 0);.      add
14920 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
14930 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
14940 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
14950 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
14960 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a 20  pRight, OP_Ge,. 
14970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14980 20 30 2c 20 30 2c 20 61 64 64 72 2b 33 2c 20 6a   0, 0, addr+3, j
14990 75 6d 70 49 66 4e 75 6c 6c 20 5e 20 53 51 4c 49  umpIfNull ^ SQLI
149a0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
149b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
149c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 50  beAddOp2(v, OP_P
149d0 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
149e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
149f0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
14a00 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70  , dest);.      p
14a10 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
14a20 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
14a30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
14a40 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
14a50 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
14a60 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
14a70 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
14a80 67 68 74 2c 20 4f 50 5f 47 74 2c 0a 20 20 20 20  ght, OP_Gt,.    
14a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
14aa0 20 30 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66   0, dest, jumpIf
14ab0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
14ac0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
14ad0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73  fault: {.      s
14ae0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
14af0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 29  Parse, pExpr, 0)
14b00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14b10 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
14b20 49 66 4e 6f 74 2c 20 30 2c 20 64 65 73 74 2c 20  IfNot, 0, dest, 
14b30 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
14b40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14b50 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
14b60 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72  Do a deep compar
14b70 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72  ison of two expr
14b80 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52  ession trees.  R
14b90 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d  eturn TRUE (non-
14ba0 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79  zero).** if they
14bb0 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61   are identical a
14bc0 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20  nd return FALSE 
14bd0 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69  if they differ i
14be0 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a  n any way..**.**
14bf0 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20   Sometimes this 
14c00 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
14c10 75 72 6e 20 46 41 4c 53 45 20 65 76 65 6e 20 69  urn FALSE even i
14c20 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73  f the two expres
14c30 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  sions.** really 
14c40 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20  are equivalent. 
14c50 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72   If we cannot pr
14c60 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70  ove that the exp
14c70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20  ressions are.** 
14c80 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65  identical, we re
14c90 74 75 72 6e 20 46 41 4c 53 45 20 6a 75 73 74 20  turn FALSE just 
14ca0 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20  to be safe.  So 
14cb0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
14cc0 2a 2a 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  ** returns false
14cd0 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f  , then you do no
14ce0 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f  t really know fo
14cf0 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65  r certain if the
14d00 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69   two.** expressi
14d10 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
14d20 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65  .  But if you ge
14d30 74 20 61 20 54 52 55 45 20 72 65 74 75 72 6e 2c  t a TRUE return,
14d40 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e   then you.** can
14d50 20 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70   be sure the exp
14d60 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
14d70 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70   same.  In the p
14d80 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74  laces where.** t
14d90 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
14da0 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  sed, it does not
14db0 20 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20   hurt to get an 
14dc0 65 78 74 72 61 20 46 41 4c 53 45 20 2d 20 74 68  extra FALSE - th
14dd0 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74  at.** just might
14de0 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20   result in some 
14df0 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20  slightly slower 
14e00 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72  code.  But retur
14e10 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72  ning.** an incor
14e20 72 65 63 74 20 54 52 55 45 20 63 6f 75 6c 64 20  rect TRUE could 
14e30 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e  lead to a malfun
14e40 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
14e50 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
14e60 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20  (Expr *pA, Expr 
14e70 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *pB){.  int i;. 
14e80 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d   if( pA==0||pB==
14e90 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
14ea0 70 42 3d 3d 70 41 3b 0a 20 20 7d 0a 20 20 69 66  pB==pA;.  }.  if
14eb0 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70  ( pA->op!=pB->op
14ec0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
14ed0 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20  f( (pA->flags & 
14ee0 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70  EP_Distinct)!=(p
14ef0 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  B->flags & EP_Di
14f00 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e  stinct) ) return
14f10 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
14f20 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
14f30 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65  ->pLeft, pB->pLe
14f40 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ft) ) return 0;.
14f50 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
14f60 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52  prCompare(pA->pR
14f70 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74  ight, pB->pRight
14f80 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
14f90 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b  if( pA->pList ){
14fa0 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 70 4c 69  .    if( pB->pLi
14fb0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
14fc0 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 4c  ;.    if( pA->pL
14fd0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e  ist->nExpr!=pB->
14fe0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72  pList->nExpr ) r
14ff0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72  eturn 0;.    for
15000 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73  (i=0; i<pA->pLis
15010 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
15020 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
15030 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
15040 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
15050 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e  xpr, pB->pList->
15060 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
15070 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
15080 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15090 20 7d 65 6c 73 65 20 69 66 28 20 70 42 2d 3e 70   }else if( pB->p
150a0 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75  List ){.    retu
150b0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
150c0 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70  pA->pSelect || p
150d0 42 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74  B->pSelect ) ret
150e0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d  urn 0;.  if( pA-
150f0 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61  >iTable!=pB->iTa
15100 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75  ble || pA->iColu
15110 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20  mn!=pB->iColumn 
15120 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
15130 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  ( pA->op!=TK_COL
15140 55 4d 4e 20 26 26 20 70 41 2d 3e 74 6f 6b 65 6e  UMN && pA->token
15150 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  .z ){.    if( pB
15160 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72  ->token.z==0 ) r
15170 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
15180 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41   pB->token.n!=pA
15190 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75  ->token.n ) retu
151a0 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 0;.    if( sq
151b0 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63  lite3StrNICmp((c
151c0 68 61 72 2a 29 70 41 2d 3e 74 6f 6b 65 6e 2e 7a  har*)pA->token.z
151d0 2c 28 63 68 61 72 2a 29 70 42 2d 3e 74 6f 6b 65  ,(char*)pB->toke
151e0 6e 2e 7a 2c 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29  n.z,pB->token.n)
151f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
15200 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
15210 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
15220 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
15230 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
15240 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
15250 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
15260 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20  the index of.** 
15270 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e  the new element.
15280 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
15290 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61  ive number if ma
152a0 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  lloc fails..*/.s
152b0 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67  tatic int addAgg
152c0 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74  InfoColumn(sqlit
152d0 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
152e0 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
152f0 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20  ;.  pInfo->aCol 
15300 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
15310 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 64  locate(.       d
15320 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  b,.       pInfo-
15330 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69  >aCol,.       si
15340 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c  zeof(pInfo->aCol
15350 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a  [0]),.       3,.
15360 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
15370 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26  Column,.       &
15380 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c  pInfo->nColumnAl
15390 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  loc,.       &i. 
153a0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
153b0 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  }    ../*.** Add
153c0 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
153d0 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
153e0 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20  aFunc[] array.  
153f0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
15400 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
15410 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
15420 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
15430 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
15440 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
15450 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
15460 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
15470 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
15480 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
15490 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41  aFunc = sqlite3A
154a0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
154b0 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20       db, .      
154c0 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20   pInfo->aFunc,. 
154d0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
154e0 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20  fo->aFunc[0]),. 
154f0 20 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20        3,.       
15500 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20  &pInfo->nFunc,. 
15510 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46        &pInfo->nF
15520 75 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20  uncAlloc,.      
15530 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
15540 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
15550 2a 20 54 68 69 73 20 69 73 20 61 6e 20 78 46 75  * This is an xFu
15560 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54  nc for walkExprT
15570 72 65 65 28 29 20 75 73 65 64 20 74 6f 20 69 6d  ree() used to im
15580 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 73 71 6c 69  plement .** sqli
15590 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
155a0 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65  gregates().  See
155b0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
155c0 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a  yzeAggregates.**
155d0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
155e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a  information..**.
155f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15600 61 6e 61 6c 79 7a 65 73 20 74 68 65 20 61 67 67  analyzes the agg
15610 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
15620 61 74 20 70 45 78 70 72 2e 0a 2a 2f 0a 73 74 61  at pExpr..*/.sta
15630 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41  tic int analyzeA
15640 67 67 72 65 67 61 74 65 28 76 6f 69 64 20 2a 70  ggregate(void *p
15650 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72  Arg, Expr *pExpr
15660 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  ){.  int i;.  Na
15670 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d  meContext *pNC =
15680 20 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 29   (NameContext *)
15690 70 41 72 67 3b 0a 20 20 50 61 72 73 65 20 2a 70  pArg;.  Parse *p
156a0 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
156b0 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  rse;.  SrcList *
156c0 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
156d0 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49  pSrcList;.  AggI
156e0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
156f0 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a  pNC->pAggInfo;..
15700 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
15710 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
15720 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
15730 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
15740 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68  N: {.      /* Ch
15750 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
15760 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f  e column is in o
15770 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73  ne of the tables
15780 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20   in the FROM.   
15790 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
157a0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
157b0 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ery */.      if(
157c0 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20   pSrcList ){.   
157d0 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
157e0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
157f0 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20  = pSrcList->a;. 
15800 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
15810 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  i<pSrcList->nSrc
15820 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
15830 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
15840 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
15850 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Col;.          i
15860 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
15870 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
15880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15890 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
158a0 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
158b0 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72  ans that pExpr r
158c0 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
158d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
158e0 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46  that is in the F
158f0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
15900 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
15910 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  y.  .           
15920 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
15930 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79  ** Make an entry
15940 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
15950 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
15960 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20  l[] if there.   
15970 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
15980 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72  ot an entry ther
15990 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20  e already..     
159a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
159b0 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
159c0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
159d0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a  pAggInfo->aCol;.
159e0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
159f0 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d  k=0; k<pAggInfo-
15a00 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70  >nColumn; k++, p
15a10 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
15a20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
15a30 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
15a40 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
15a50 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
15a60 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
15a70 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
15a80 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
15a90 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
15aa0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
15ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
15ac0 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e   (k>=pAggInfo->n
15ad0 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20  Column).        
15ae0 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64       && (k = add
15af0 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50  AggInfoColumn(pP
15b00 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
15b10 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20  fo))>=0 .       
15b20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
15b30 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41        pCol = &pA
15b40 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b  ggInfo->aCol[k];
15b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
15b60 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70  Col->pTab = pExp
15b70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  r->pTab;.       
15b80 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61         pCol->iTa
15b90 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  ble = pExpr->iTa
15ba0 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
15bb0 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
15bc0 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
15bd0 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
15be0 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b   pCol->iMem = ++
15bf0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
15c00 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
15c10 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
15c20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
15c30 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20      pCol->pExpr 
15c40 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
15c50 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49         if( pAggI
15c60 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b  nfo->pGroupBy ){
15c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15c80 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20   int j, n;.     
15c90 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c             ExprL
15ca0 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49  ist *pGB = pAggI
15cb0 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  nfo->pGroupBy;. 
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
15cd0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
15ce0 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42  tem *pTerm = pGB
15cf0 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ->a;.           
15d00 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45       n = pGB->nE
15d10 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
15d20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
15d30 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  n; j++, pTerm++)
15d40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
15d50 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
15d60 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
15d80 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pE->op==TK_CO
15d90 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62  LUMN && pE->iTab
15da0 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
15db0 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  e &&.           
15dc0 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69             pE->i
15dd0 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
15de0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
15e00 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
15e10 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  n = j;.         
15e20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
15e30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
15e40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15e50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15e60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15e70 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
15e80 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20  iSorterColumn<0 
15e90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
15ea0 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
15eb0 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66  Column = pAggInf
15ec0 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  o->nSortingColum
15ed0 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n++;.           
15ee0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
15ef0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   }.            /
15f00 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61  * There is now a
15f10 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70  n entry for pExp
15f20 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  r in pAggInfo->a
15f30 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20  Col[] (either.  
15f40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63            ** bec
15f50 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72  ause it was ther
15f60 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61  e before or beca
15f70 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61  use we just crea
15f80 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20  ted it)..       
15f90 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20       ** Convert 
15fa0 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20  the pExpr to be 
15fb0 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  a TK_AGG_COLUMN 
15fc0 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61  referring to tha
15fd0 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
15fe0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
15ff0 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20  ] entry..       
16000 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16010 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
16020 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
16030 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
16040 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43  r->op = TK_AGG_C
16050 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20  OLUMN;.         
16060 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
16070 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   k;.            
16080 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
16090 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70   } /* endif pExp
160a0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
160b0 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20  ->iCursor */.   
160c0 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f       } /* end lo
160d0 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74  op over pSrcList
160e0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
160f0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
16100 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
16110 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
16120 20 20 20 20 2f 2a 20 54 68 65 20 70 4e 43 2d 3e      /* The pNC->
16130 6e 44 65 70 74 68 3d 3d 30 20 74 65 73 74 20 63  nDepth==0 test c
16140 61 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20  auses aggregate 
16150 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73 75 62  functions in sub
16160 71 75 65 72 69 65 73 0a 20 20 20 20 20 20 2a 2a  queries.      **
16170 20 74 6f 20 62 65 20 69 67 6e 6f 72 65 64 20 2a   to be ignored *
16180 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d  /.      if( pNC-
16190 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20  >nDepth==0 ){.  
161a0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
161b0 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69  o see if pExpr i
161c0 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  s a duplicate of
161d0 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61   another aggrega
161e0 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  te .        ** f
161f0 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
16200 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
16210 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
16220 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e.        */.   
16230 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
16240 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20  nfo_func *pItem 
16250 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  = pAggInfo->aFun
16260 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  c;.        for(i
16270 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
16280 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65  nFunc; i++, pIte
16290 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
162a0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
162b0 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45  ompare(pItem->pE
162c0 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b 0a 20  xpr, pExpr) ){. 
162d0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
162e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
162f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16300 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d  if( i>=pAggInfo-
16310 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  >nFunc ){.      
16320 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20      /* pExpr is 
16330 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20  original.  Make 
16340 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
16350 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
16360 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
16370 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d          u8 enc =
16380 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29   ENC(pParse->db)
16390 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20  ;.          i = 
163a0 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70  addAggInfoFunc(p
163b0 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
163c0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
163d0 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20  if( i>=0 ){.    
163e0 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20          pItem = 
163f0 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  &pAggInfo->aFunc
16400 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
16410 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
16420 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
16430 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d     pItem->iMem =
16440 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
16450 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
16460 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69  em->pFunc = sqli
16470 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
16480 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20  pParse->db,.    
16490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
164a0 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
164b0 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
164c0 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  en.n,.          
164d0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
164e0 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 70  pList ? pExpr->p
164f0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
16500 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
16510 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
16520 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
16530 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  inct ){.        
16540 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
16550 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
16560 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
16570 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16580 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
16590 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b  >iDistinct = -1;
165a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
165b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
165c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
165d0 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74  Make pExpr point
165e0 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
165f0 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  ate pAggInfo->aF
16600 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20  unc[] entry.    
16610 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
16620 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a  Expr->iAgg = i;.
16630 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
16640 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
16650 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  fo;.        retu
16660 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
16670 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
16680 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b 20 73  cursively walk s
16690 75 62 71 75 65 72 69 65 73 20 6c 6f 6f 6b 69 6e  ubqueries lookin
166a0 67 20 66 6f 72 20 54 4b 5f 43 4f 4c 55 4d 4e 20  g for TK_COLUMN 
166b0 6e 6f 64 65 73 20 74 68 61 74 20 6e 65 65 64 0a  nodes that need.
166c0 20 20 2a 2a 20 74 6f 20 62 65 20 63 68 61 6e 67    ** to be chang
166d0 65 64 20 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c  ed to TK_AGG_COL
166e0 55 4d 4e 2e 20 20 42 75 74 20 69 6e 63 72 65 6d  UMN.  But increm
166f0 65 6e 74 20 6e 44 65 70 74 68 20 73 6f 20 74 68  ent nDepth so th
16700 61 74 0a 20 20 2a 2a 20 54 4b 5f 41 47 47 5f 46  at.  ** TK_AGG_F
16710 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e  UNCTION nodes in
16720 20 73 75 62 71 75 65 72 69 65 73 20 77 69 6c 6c   subqueries will
16730 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20   be unchanged.. 
16740 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
16750 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
16760 70 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20  pNC->nDepth++;. 
16770 20 20 20 77 61 6c 6b 53 65 6c 65 63 74 45 78 70     walkSelectExp
16780 72 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  r(pExpr->pSelect
16790 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  , analyzeAggrega
167a0 74 65 2c 20 70 4e 43 29 3b 0a 20 20 20 20 70 4e  te, pNC);.    pN
167b0 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20 20 7d  C->nDepth--;.  }
167c0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
167d0 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
167e0 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
167f0 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  on looking for a
16800 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
16810 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61  ns and.** for va
16820 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65  riables that nee
16830 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  d to be added to
16840 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67   the pParse->aAg
16850 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61  g[] array..** Ma
16860 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e  ke additional en
16870 74 72 69 65 73 20 74 6f 20 74 68 65 20 70 50 61  tries to the pPa
16880 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61  rse->aAgg[] arra
16890 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  y as necessary..
168a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
168b0 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
168c0 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  e called after t
168d0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  he expression ha
168e0 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a  s been.** analyz
168f0 65 64 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  ed by sqlite3Exp
16900 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 2e  rResolveNames().
16910 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72 6f 72 73  .**.** If errors
16920 20 61 72 65 20 73 65 65 6e 2c 20 6c 65 61 76 65   are seen, leave
16930 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
16940 65 20 69 6e 20 7a 45 72 72 4d 73 67 20 61 6e 64  e in zErrMsg and
16950 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e   return.** the n
16960 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
16970 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
16980 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
16990 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74  ates(NameContext
169a0 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78   *pNC, Expr *pEx
169b0 70 72 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20  pr){.  int nErr 
169c0 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e  = pNC->pParse->n
169d0 45 72 72 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  Err;.  walkExprT
169e0 72 65 65 28 70 45 78 70 72 2c 20 61 6e 61 6c 79  ree(pExpr, analy
169f0 7a 65 41 67 67 72 65 67 61 74 65 2c 20 70 4e 43  zeAggregate, pNC
16a00 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 43 2d  );.  return pNC-
16a10 3e 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 2d 20  >pParse->nErr - 
16a20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  nErr;.}../*.** C
16a30 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41  all sqlite3ExprA
16a40 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
16a50 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70  () for every exp
16a60 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a  ression in an.**
16a70 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
16a80 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
16a90 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
16aa0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
16ab0 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20  r is found, the 
16ac0 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74 20  analysis is cut 
16ad0 73 68 6f 72 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  short..*/.int sq
16ae0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
16af0 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74  AggList(NameCont
16b00 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69  ext *pNC, ExprLi
16b10 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74  st *pList){.  st
16b20 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
16b30 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
16b40 20 69 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d   i;.  int nErr =
16b50 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   0;.  if( pList 
16b60 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d  ){.    for(pItem
16b70 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
16b80 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 70 4c 69  nErr==0 && i<pLi
16b90 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
16ba0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
16bb0 6e 45 72 72 20 2b 3d 20 73 71 6c 69 74 65 33 45  nErr += sqlite3E
16bc0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
16bd0 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d  ates(pNC, pItem-
16be0 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  >pExpr);.    }. 
16bf0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72   }.  return nErr
16c00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
16c10 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  ate or deallocat
16c20 65 20 74 65 6d 70 6f 72 61 72 79 20 75 73 65 20  e temporary use 
16c30 72 65 67 69 73 74 65 72 73 20 64 75 72 69 6e 67  registers during
16c40 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
16c50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16c60 47 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65  GetTempReg(Parse
16c70 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28   *pParse){.  if(
16c80 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
16c90 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  g ){.    return 
16ca0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
16cb0 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  [--pParse->nTemp
16cc0 52 65 67 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Reg];.  }else{. 
16cd0 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72     return ++pPar
16ce0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 7d 0a  se->nMem;.  }.}.
16cf0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65  void sqlite3Rele
16d00 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65  aseTempReg(Parse
16d10 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
16d20 65 67 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  eg){.  if( pPars
16d30 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 73 69 7a 65  e->nTempReg<size
16d40 6f 66 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  of(pParse->aTemp
16d50 52 65 67 29 2f 73 69 7a 65 6f 66 28 70 50 61 72  Reg)/sizeof(pPar
16d60 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 30 5d 29  se->aTempReg[0])
16d70 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
16d80 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
16d90 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69  >nTempReg++] = i
16da0 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Reg;.  }.}../*.*
16db0 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65  * Allocate or de
16dc0 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b  allocate a block
16dd0 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75   of nReg consecu
16de0 74 69 76 65 20 72 65 67 69 73 74 65 72 73 0a 2a  tive registers.*
16df0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74  /.int sqlite3Get
16e00 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20  TempRange(Parse 
16e10 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65  *pParse, int nRe
16e20 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  g){.  int i;.  i
16e30 66 28 20 6e 52 65 67 3c 3d 70 50 61 72 73 65 2d  f( nReg<=pParse-
16e40 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20  >nRangeReg ){.  
16e50 20 20 69 20 20 3d 20 70 50 61 72 73 65 2d 3e 69    i  = pParse->i
16e60 52 61 6e 67 65 52 65 67 3b 0a 20 20 20 20 70 50  RangeReg;.    pP
16e70 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
16e80 2b 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61  += nReg;.    pPa
16e90 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d  rse->nRangeReg -
16ea0 3d 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b  = nReg;.  }else{
16eb0 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d  .    i = pParse-
16ec0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
16ed0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
16ee0 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
16ef0 69 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  i;.}.void sqlite
16f00 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
16f10 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
16f20 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e   int iReg, int n
16f30 52 65 67 29 7b 0a 20 20 69 66 28 20 6e 52 65 67  Reg){.  if( nReg
16f40 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52  >pParse->nRangeR
16f50 65 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  eg ){.    pParse
16f60 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52  ->nRangeReg = nR
16f70 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  eg;.    pParse->
16f80 69 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67  iRangeReg = iReg
16f90 3b 0a 20 20 7d 0a 7d 0a                          ;.  }.}.